КОМПИЛЯЦИЯ ВНЕШНИХ ПРОЦЕДУР

Для эффективной работы все исходные коды внешних процедур приложения должны быть скомпилированы. Если исходный код внешний процедуры представляет собой текстовый файл с расширением .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 определяют размер листа файла листинга, количество строк на листе и ширину строки соответственно.

XCODE expression - определяет ключ expression для расшифровки зашифрованных p-файла и инклюд-файлов. Для компиляции зашифрованных файлов процедур компилятору необходимо знать ключ, на основе которого компилируемые файлы были зашифрованы. Если запуск сессии, в которой осуществляется компиляция, был осуществлен с применением стартового параметра -rx, то для расшифровки будет применен default-key, независимо от того указан ли ключ в XCODE или нет.

XREF {xreffile | VALUE (expression)} - определяет текстовый XREF-файл или как его еще называют - файл перекрестных ссылок. Опция APPEND указывает на необходимость записи в конец существующего файла, иначе существующий файл будет перезаписан.

XREF-XML {directory | filename | VALUE (expression)} - определяет XREF файл в формате структурированного XML. Опция APPEND указывает на необходимость записи вконец существующего файла, иначе существующий файл будет перезаписан.

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]]

option - опция работы с библиотекой:

  • create - создание библиотеки;
  • add - добавление процедуры в библиотеку;
  • replace - замещение существующей процедуры в библиотеки новой;
  • delete - удаление процедуры из состава библиотеки;
  • list - вывод списка процедур, составляющих библиотеку;
  • extract - извлечение процедур (r-файлов) из библиотеки.

files - список процедур.

Несколько библиотек могут содержать в себе процедуры с одинаковым именами. Для вызова процедуры из конкретной pl-библиотеки:

RUN library-name <<procedure-name>>.

Вы здесь: Главная Основы ABL КОМПИЛЯЦИЯ ВНЕШНИХ ПРОЦЕДУР