четверг, 7 апреля 2016 г.

MSM: Компиляция исходных текстов

Обзор

MSM-Server, начиная с версии 4.3 и MSM-Workstation позволяет писать программный код в исходниках. При этом появляется замечательная возможность использовать в исходниках макроопределения. Такие исходники компилируются в обычные М-программы при сохранении их на диск. При этом сами исходные тексты сохраняются в глобали:
  • ZMSMMAC - библиотеки макроопределений
  • ZMSMSRC - исходники.
Похожая возможность есть и в Cache'. Там при создании программы редактор спрашивает какой тип кода надо создать. Есть три возможных варианта.

  • Первый - создание .MAC-кода, аналогичного макрокоду MSM, о котором здесь идет речь.
  • Второй - создание .INC-кода, то есть тот же .MAC, только включаемый в другие .MAC и .INC модули. Основное отличие .INC от .MAC - .INC - не компилируется непосредственно в исполняемую M-программу.
  • Третий - создание .INT-кода, то есть M-кода без макросов. Именно в .INT-код компилируются .MAC модули.
Мое мнение - макроязык MSM - гораздо богаче. Например, .INC-файлы Cache' в MSM реализуются директивой #noroutine в теле .INC-файла, запрещающей генерацию программы из исходника, и директивой #include в теле .MAC-файла. Кроме этого есть директивы для работы с библиотеками макросов, шире набор директив условной компиляции, можно включать многострочные макроопределения, генерируемые имена меток и многое другое. Есть возможность сохранять исходники в файлы операционной системы.

В исходниках можно размещать комментарии, которые не попадут в программы. Это, по крайней мере, уменьшает размер программы, ускоряя ее загрузку в оперативную память. То есть можно сэкономить на размере раздела. Строка, которая начинается со знака ";" не попадет в текст программы. Если перед знаком ";" будет стоять пробел, то такой комментарий будет записан в программу.

По сути дела

Есть еще одно достоинство в использовании исходников перед программами для не-англоговорящих разработчиков - это программы, которые будут работать в OEM-кодировке, но разработка их ведется в ANSI-кодировке (Windows). Кроме этого возможен вариант, когда из пакета исходников надо получить М-прграммы. Открывать каждый исходник в редакторе и сохранять его - в этом случае не сама лучшая идея. Можно выполнить пакетную компиляцию исходников. Для этого есть точки входа в программе %EDP. Приведенный ниже текст является простым примером компиляции исходника.
 
Compile(NAME) S X("Source")=NAME 
  D COMPILE^%EDP(.X) 
  I X W !,NAME_" compile error" 
  E D SAVE^%EDP(.X) 
  Q 
Расмотрим его подробнее. В COMPILE^%EDP передается по ссылке структурная переменная, у которй могут быть определены следующие узлы:
  • Source - имя исходника
  • Comment - если равен 1, в программу перед скомпилированными строками будут добавляться закомментированные оригинальные строки из исходников с десятью точками впереди - может понадобиться для демонстрации "навороченных" возможностей макросов в MSM.
  • LibPath - спиок библиотек
  • LogRout - программа, котроая будет вызвана, для регистрации ошибок. Например, указав "Log^Rtn" будет выполнен М-код D Log^Rtn(.message) где message - это текст для регистрации ошибки. Если в качестве LogRout указать "Log^Rtn("""_NAME_""")", то будет выполнен М-код D Log^Rtn(имя_исходника,.message) Если LogRout не определен явно, то список ошибок следует искать в ^ZMSMLOG("%EDP",$SY_","_$P,имя_исходника).
  • Prefix - строка, с которой начинаются имена макроопределений (по умолчанию %%)
  • LabPref - префикс, с которого будут начинаться временные метки
  • Show - показывать процесс подстановки макроопределений. Может понадобиться только в очень редких случаях, т.к. мало кому доставит удовольствие нажимать ENTER после каждой выполненной макроподстановки.
На выходе в переменной X появятся узлы:
  • Routine - имя программы, в которую будет сохранен исходник. Если пусто, то нечего сохранять
  • Code - имя глобала, содержащего строки программного кода. Наконец, в Х записывается количество ошибок, если они имели место. Если компиляция прошла без ошибок, то X=0. В последнем случае надо сохранить полученный программный код, вызвав SAVE^%EDP. На вход надо передать все тот же массив X. Скомпилированные программы будут сохранены на диск.
Александр Павлов

Комментариев нет:

Отправить комментарий