КОМПИЛЯЦИЯ ВНЕШНИХ ПРОЦЕДУР
Для эффективной работы все исходные коды внешних процедур приложения должны быть скомпилированы. Если исходный код внешний процедуры представляет собой текстовый файл с расширением .p (p-файл), то при ее компиляции формируется файл с расширением .r (r-файл).
При вызове внешней процедуры, AVM первым делом пытается найти ее скомпилированный файл, а не найдя, использует исходный. Если внешняя процедура не была скомпилирована, то при ее вызове, AVM будет осуществлять ее компиляцию "налету", без формирования r-файла.
Суть компиляции состоит в том, что AVM собирает полный код процедуры: собирает все используемые в процедуре инклюд-файлы, осуществляет обработку препроцессорных выражений. Собранный код анализируется на наличие в нем ошибок, и если код содержит ошибки, то он не сможет быть скомпилирован до их полного устранения.
Отсутствие скомпилированного r-файла снижает производительность приложения, так как требует дополнительно затрачиваемых ресурсов на компиляцию исходного p-файла процедуры при каждом ее вызове.
Восстановить исходный p-файл из скомпилированного r-файла, другими словами, декомпилировать - невозможно.
COMPILE {procedure-pathname | VALUE (expression)}
[SAVE [ = logical-expression ]
[INTO {directory | VALUE (expression)}]
]
[LISTING {listfile | VALUE (expression)}
[APPEND [ = logical-expression ]
| PAGE-SIZE integer-expression
| PAGE-WIDTH integer-expression
]
]
[XCODE expression]
[XREF {xreffile | VALUE (expression)}
[APPEND [= logical-expression] ]
]
[XREF-XML {directory | filename | VALUE (expression)}]
[STRING-XREF {sxreffile | VALUE (expression)}
[APPEND [= logical-expression]]
]
[STREAM-IO [= logical-expression]]
[LANGUAGES ({language-list | VALUE (expression)})
[TEXT-SEG-GROW = growth-factor]
]
[DEBUG-LIST {debugfile | VALUE (expression)}]
[PREPROCESS {preprocessfile | VALUE (expression)}]
[NO-ERROR]
[V6FRAME [= logical-expression]
[USE-REVVIDEO | USE-UNDERLINE]
]
[MIN-SIZE [= logical-expression]]
[GENERATE-MD5 [= logical-expression]]
{procedure-pathname | VALUE (expression)} - определяет полный или относительный путь компилируемого p-файл. Если p-файл находится в одном из каталогов PROPATH, то достаточно только указать его имя. При этом, если данный файл будет находится в нескольких каталогах PROPATH, то скомпилирован будет тот файл, который находится в каталоге определенном в PROPATH ранее других.
SAVE [= logical-expression] - определяет необходимость формирования r-файла.
INTO {directory | VALUE (expression)} - определяет полный или относительный путь для сохранения r-файл. Если путь на задан, то r-файл будет сохранен в том же каталоге, что и исходный p-файл.
LISTING {listfile | VALUE (expression)} - определяет файл листинга компиляции. Опция APPEND указывает на необходимость записи листинга в конец существующего файла, иначе данный файл будет перезаписан.
PAGE-SIZE и PAGE-WIDTH определяют размер листа файла листинга, количество строк на листе и ширину строки выраженные в печатных символах.
По умолчанию, значение PAGE-SIZE составляет 55 строк и может быть изменено на значение в пределах от 10 до 127 строк включительно.
Ширина страницы листинга PAGE-WIDTH, по умолчанию составляет 80 символов и может быть изменено на значение в пределах от 80 до 255 включительно.
XCODE expression - определяет ключ expression для расшифровки зашифрованных p-файла и включенных в него инклюд-файлов. Для компиляции зашифрованных файлов процедур компилятору необходимо знать ключ, на основе которого компилируемые файлы были зашифрованы. Если запуск сессии, в которой осуществляется компиляция, был осуществлен с применением стартового параметра -rx, то для расшифровки будет применен default-key, независимо от того указан ли ключ в XCODE или нет.
XREF {xreffile | VALUE (expression)} - определяет текстовый XREF-файл, или как его еще называют - файл перекрестных ссылок. Опция APPEND указывает на необходимость записи в конец существующего файла, иначе существующий файл будет перезаписан.
XREF-XML {directory | filename | VALUE (expression)} - определяет XREF файл в формате структурированного XML.
STRING-XREF {sxreffile | VALUE (expression)} - .Опция APPEND указывает на необходимость записи вконец существующего файла, иначе существующий файл будет перезаписан
PREPROCESS {preprocessfile | VALUE (expression)} - формирует файл процедуры после включения всех инклюд-файлов и обработки всех препроцессорных имен и директив. Полученный файл, впоследствии, может быть скомпилирован.
GENERATE-MD5 [= logical-expression] - логическое значение включающее (TRUE), или отключающее (FALSE) применение алгоритма хеширования MD5, при компиляции p-файла, для генерации специального значения, записываемого в r-файл, с целью проверки его целостности. Значение по умолчанию - TRUE.
COMPILE my-proc2.p
SAVE
LISTING my-proc2.lst
XREF my-proc2.xref
.
В результате в одном каталоге с my-proc2.p будет сформирован скомпилированный файл my-proc2.r и еще два текстовых файла my-proc2.lst и my-proc2.xref.
my-proc2.lst:
./my-proc2.p 07/27/2016 09:51:51 PROGRESS(R) Page 1
{} Line Blk
-- ---- ---
1 DEF VAR a AS DECIMAL NO-UNDO.
2 DEF VAR b AS DECIMAL NO-UNDO.
3 ASSIGN
4 a = 5.5
5 b = 3.0.
6 {my-include.i
7 &par1 = a
8 &par2 = b
9 }
1 1 DEF VAR c AS DECIMAL NO-UNDO.
1 2 c = {&par1}a * {&par2}b.
1 3 DISPLAY "Результат = " c.
9
./my-proc2.p 07/27/2016 09:51:51 PROGRESS(R) Page 2
File Name Line Blk. Type Tran Blk. Label
-------------------- ---- ----------- ---- --------------------------------
./my-proc2.p 0 Procedure No
Frames: Unnamed
my-proc2.xref:
./my-proc2.p ./my-proc2.p 1 COMPILE my-proc2.p
./my-proc2.p ./my-proc2.p 1 CPINTERNAL ibm866
./my-proc2.p ./my-proc2.p 1 CPSTREAM ibm866
./my-proc2.p ./my-proc2.p 1 STRING "a" 1 NONE UNTRANSLATABLE
./my-proc2.p ./my-proc2.p 2 STRING "b" 1 NONE UNTRANSLATABLE
./my-proc2.p ./my-proc2.p 6 INCLUDE "my-include.i
&par1 = a
&par2 = b
"
./my-proc2.p ./my-include.i 1 STRING "c" 1 NONE UNTRANSLATABLE
./my-proc2.p ./my-include.i 3 STRING "Результат = " 12 NONE TRANSLATABLE
./my-proc2.p ./my-include.i 3 STRING "x(12)" 5 NONE TRANSLATABLE FORMAT
./my-proc2.p ./my-include.i 3 STRING "->>,>>9.99" 10 NONE TRANSLATABLE FORMAT
./my-proc2.p ./my-proc2.p 6 STRING "c" 1 LEFT TRANSLATABLE
./my-proc2.p ./my-proc2.p 6 STRING " ----------" 23 NONE UNTRANSLATABLE
ИНФОРМАЦИЯ ОБ R-ФАЙЛЕ
Получить информацию об r-файле можно с помощью системного указателя RCODE-INFO и его атрибутов.
RCODE-INFO [:attribute]
Первым делом необходимо задать атрибут FILE-NAME, в котором необходимо указать полный или относительный путь файла, информацию о котором мы хотим получить. Указать можно как непосредственно скомпилированный r-файл, так и исходный p-файл.
RCODE-INFO:FILE-NAME = "test1.p".
После этого, интересующую нас информацию мы можем получить из значений соответствующих атрибутов RCODE-INFO.
Атрибуты RCODE-INFO:
Атрибут | Тип данных | Доступ | Описание |
FILE-NAME | CHARACTER | чтение/запись | полный или относительный путь файла процедуры |
HANDLE | HANDLE | чтение | процедурный указатель |
TYPE | CHARACTER | чтение | значение "PROCEDURE" |
INSTANTIATING-PROCEDURE | HANDLE | чтение | указатель процедуры из которой был осуществлен вызов исследуемой процедуры |
CODEPAGE | CHARACTER | чтение | кодировка r-файла |
LANGUAGES | CHARACTER | чтение | список языков с разделителем запятая, указанный про компиляции процедуры |
CRC-VALUE | INTEGER | чтение | Значение, рассчитываемое на основе имени p-файла и его содержания, записываемое в r-файл при компиляции. Данное значение может применяться для проверки неизменности r-файла. |
MD5-VALUE | CHARACTER | чтение | Значение, рассчитанное по алгоритму хеширования MD5 при компиляции с опцией GENERATE-MD5 = TRUE. Данное значение, аналогично CRC-VALUE, применяется для контроля версионности r-файла. Если компиляция процедуры осуществлялось с опцией GENERATE-MD5 = FALSE, то значением будет - ? (неизвестное значение) |
IS-CLASS | LOGICAL | чтение | логическое значение, определяющее является r-файл описанием класс (TRUE) или процедурой (FALSE) |
DB-REFERENCES | CHARACTER | чтение | список баз данных с разделителем запятая, используемых в r-файле |
TABLE-LIST | CHARACTER | чтение | список таблиц с разделителем запятая, используемых в r-файле |
TABLE-CRC-LIST | CHARACTER | чтение | список CRC-значений с разделителем запятая, используемых в r-файле таблиц. Последовательность значений соответствует последовательности таблиц выводимых TABLE-LIST |
PL-БИБЛИОТЕКИ
Скомпилированные процедуры могут быть объединены в единый файл библиотеки с расширением .pl. Для создания и дальнейшей работы с библиотекой применяется утилита prolib
prolib library-name -option [files] [-option [files]]
library-name - имя файла формируемой библиотеки;
option - опция работы с библиотекой:
- create - создание библиотеки;
- add - добавление процедуры в библиотеку;
- replace - замещение существующей процедуры в библиотеки новой;
- delete - удаление процедуры из состава библиотеки;
- list - вывод списка процедур, составляющих библиотеку;
- extract - извлечение процедур (r-файлов) из библиотеки.
files - список процедур.
Несколько библиотек могут содержать в себе процедуры с одинаковым именами. Для вызова процедуры из конкретной pl-библиотеки:
RUN library-name <<procedure-name>>.