<<< BACK NEXT >>>

КОМАНДЫ КОМПИЛЯТОРА

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

#macro <определяемое> <определитель>

<определяемое> - строка до первого пробела;
<определитель> - строка до конца логической строки.

Примеры:

#macro Constant_HEX_TEN    0x0A'B
#macro Const_BIN_TWELVE    0b00001100
#macro Literal_Str         "Literal string"
#macro GetKey              GetKeyb()

   . . .
OutText( Constant_HEX_TEN, Const_BIN_TWELVE, Literal_Str )
   . . .
Var := GetKey

 

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

#flow [ <шаг> ]
   . . .
#endflow

<шаг> - число, определяющее количество команд - длину критического фрагмента. В случае отсутствия <шаг> компилятор сам устанавливает значение по умолчанию - 1. #flow и #endflow фактически являются логическими скобками выделения критического фрагмента.

Примеры:

block BLOCK_NAME( fVar1, fVar2)
  . . .
 #flow
  var1 := (var2+var3)/var3 ;* выполнение данных двух команд будет
var2 := (var1+var3)/var3 ;* блокировать выполнение других параллельных
                         ;* процессов
 #endflow
  . . .
endblock

#flow 3
*  Здесь вызов механизмов переключения процессов и обработки событий
*  будет осуществляться после каждых трех команд программы

  block BLOCK_NAME2
   . . .
  endblock

  block BLOCK_NAME3(fVar1, fVar2,fVar3)
   . . .
  endblock

#endflow

   Отметим, что для принудительного срабатывания отключенных механизмов событий и переключателя процессов внутри критического фрагмента может использоваться команда PASS. Ее подробное описание смотрите ниже.
   Команда

#include <путь и имя файла>

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

#avoid и #noavoid - логические скобки, позволяющие обходить фрагмент программы, заключенный между данными скобками, при последовательном выполнении команд.

Пример:

var  := 10
var2 := 100

#avoid
  var  := 5
  var2 := 200
#noavoid

var += var2

Инструкции

var := 5
var2 := 200

не будет выполнена при последовательном прохождении по коду: следом за var2 := 100 будет исполнено var += var2
   В результате var будет содержать 110

<<< BACK NEXT >>>