<<< BACK NEXT >>>

ДИНАМИЧЕСКАЯ КОМПИЛЯЦИЯ, ЗАГРУЗКА И ВЫГРУЗКА

CAPER обладает средствами динамической компиляции файлов исходных текстов программ, средствами загрузки объектных программных модулей и их удаления.
   Компиляция исходных текстов позволяет, в частности, динамически формировать тексты программ и исполнять их.
   Динамическая загрузка предварительно откомпилированных исходных текстов - объектных модулей CAPER - также позволяет динамически компоновать исполняемый код, естественно, без затрат на компиляцию.
   Данные средства CAPER никак не зависят от средств операционной системы.
   Что же касается возможностей оперирования общепринятыми библиотечными средствами, то, как и в случае с ОС-ориентированным событийным механизмом, в CAPER встроены функции манипулирования библиотеками ОС, которые могут быть заглушены в тех средах, которые не поддерживают библиотечную организацию объектных и исполнимых модулей.
   В данной версии CAPER средства динамической компиляции представлены единственной функцией среды

   CompileFile( <стиль>, < указание компилируемого текста >, <имя блока> [, <признак замещения> [, [<имя файла сохранения>] [ , [<ключи>] ] ] ])

- в отличие от предыдущей версии, в которой (см. []) был реализован оператор COMPILE [BLOCK] <указание компилируемого текста> [ IN <имя блока2> ]

<указание компилируемого текста> - либо имя файла с возможным указанием пути к нему, либо указание компилируемой строки. Что именно должно быть откомпилировано (как понимать заданную строку: как файл или как строку исходного текста) определяется параметром <стиль>: если стиль равен 0, то компилируется файл, иначе указываемая строка.
   <признак замещения> - если присутствует - числовой параметр, значение которого предопределяет замещение имеющегося блока - модуля с указанным именем, либо запрещение этого. Второе - по умолчанию, и если блок с указанным именем существует, то это вызовет программную ошибку.
   <имя файла сохранения> - строка - имя файла сохранения.
   <ключи> - строка ключей компиляции:
             “-C” – откомпилировать;
             “-E” – по результату компиляции создать исполнимый файл.

   Данной функцией инициируется компиляция файла, и размещение откомпилированного кода в качестве модуля и блока с указанным именем.
   CAPER обладает средствами динамической загрузки и удаление программных модулей.

   LoadModule( <имя файла> , <имя блока> [, <признак замещения>] )
   <имя файла> - строка знаков с именем файла объектного модуля,
   <имя блока> - строка знаков с именем, с которым модуль будет загружен.

осуществляет загрузку и привязку объектных модулей CAPER. Второй параметр определяет имя блока, которым является загруженный модуль. В принципе, один и тот же модуль может быть загружен многократно при условии, что он не содержит блоков. В противном случае, в момент загрузки машиной CAPER будет выработано аварийное программное прерывание - ошибка Загрузчика, связанное с дублированием имен блоков, и загрузка модуля не будет завершена.

   Функцией

   DeleteBlock( <имя блока> )

осуществляется удаление любого блока, в том числе и блока, образованного загруженным модулем.

   import <указание файла> as <описание блока>

загружает модуль с внутренним <описание блока>. Один и тот же модуль может быть загружен многократно под разными именами. <описание блока> - либо имя блока, либо, если задан прототип, то после ключевого слова as может указан прототип блока ‘<’ as <имя блока прототипа> ’>’ <имя блока>.

Пример:
   prototype <int> [] LOADED_MODULE ( <int> parm1, <word> parm2 )

   import d:\Caper_Examples\capPanels.obc as < as LOADED_MODULE > Panel1
   import d:\Caper_Examples\capPanels.obc as < as LOADED_MODULE > Panel2
   import Graph.obc as Graph

Далее вызов Panel1 должен осуществляться согласно описанию в прототипе:

   build private <int> [] arrOfInt := Panel1( -10, 20 ), =>
                 <int> [] arrOfInt2, <null> var

   arrOfInt2 := Panel1( -11, 30 )
   var := Graph()

Оператор

   remove <имя блока>

выгружает загруженный ранее модуль.

   remove me

средство самовыгружения модуля: выгружается модуль, в теле которого выполнен данный оператор.

Пример:

   Продолжая предыдущий пример
  
   remove Panel1, Panel2
   remove Graph
   if arrOfInt[1] == 1 && arrOfInt2[1]
      delete arrOfInt, arrOfInt2
   else 
      remove me
   endif

   CAPER позволяет компилировать и исполнять отдельные команды:

   CompileCommand ( <строка> [, <элемента массива> ] ) -

функция, компилирующая строку. Если задан элемент массива, то он указывает область памяти, в которую будут размещены результаты компиляции. Возвращаемый тип значения - указатель команды. Если <элемента массива> не указан, то будет выделен собственный участок памяти. В этом случае его необходимо будет освободить командой DeleteCommand(<указатель команды>). Функция возвращает указатель на начало откомпилированных команд <указатель команды> и  размер в байтах, занимаемых откомпилированными командами, который может быть получен с помощью IntRight.

DeleteCommand ( <указатель команды> ) – освобождает память, выделенную под команды динамически откомпилированной строки.
DoCommand ( <указатель команды> ) – инициирует выполнение откомпилированного с помощью CompileCommand кода.

<<< BACK NEXT >>>