Это старая версия документа!


Секреты компилятора

Опции компилятора. Несмотря на то, что в официальной документации заявлено, что компилятор не имеет опций компиляции, на самом деле эти опции есть, и также есть средства, которые позволяют управлять этими опциями. Итак, имеются следующие опции компиляции:

  • checks — добавить в исполняемый модуль (*.EXE или *.DLL) код, выполняющий основные проверки
  • allchecks — добавить в исполняемый модуль код, выполняющий дополнительные проверки (переполнение и выход за диапазон значений для целых чисел).
  • assert — добавить в исполняемый модуль код, предусмотренный операторами ASSERT().
  • obj — создавать объектный файл
  • ref
  • allref
  • srcpos
  • hint
  • oberon — включить поддержку некоторых элементов языка Оберон, в частности тип LONGREAL и символ «D» в вещественных константах.
  • errorTrap

В модуле DevCompiler определены также опции reallib и signatures, но они не реализованы и здесь не рассматриваются.

По умолчанию включены опции: checks, assert, obj, ref, allref, srcpos.

Для управления опциями служит строка опций, которая представляет собой последовательность символов. Перед компиляцией компилятор сначала включает опции по умолчанию, затем, последовательно обрабатывая символы в строке опций, изменяет состав включенных опций. Порядок символов в строке опций не имеет значения. Определены следующие управляющие символы:

  • »-» — последовательно выключает опцию srcpos, либо allref, либо ref, либо obj
  • »!» — последовательно выключает опцию assert, либо checks
  • »+» — включает опцию allchecks
  • »?» — включает опцию hint
  • »@» — включает опцию errorTrap
  • «$» — включает опцию oberon

Символы »-» и »!» могут иметь несколько вхождений в строке опций. Причём, каждое новое вхождение выключает следующую опцию из списка, который определён для этих символов.

Например, для того чтобы выключить опцию checks и включить опцию hint, мы должны указать компилятору вот такую строку опций: »!!?». Первое вхождение символа »!» отключит опцию assert, второе вхождение символа »!» отключит опцию checks, и, наконец, символ »?» включит опцию hint. Как видим, при такой системе невозможно отключить опцию checks, не отключив при этом assert. И в этом есть определённый смысл.

Строка опций может быть передана в качестве параметра процедуре DevCompiler.CompileOpt(), а также может быть указана в списке модулей компиляции непосредственно после имени модуля (см. ниже).

Следует иметь в виду, что некоторые опции, отключенные по умолчанию, могут быть реализованы некорректно, и их следует использовать осмотрительно.

Список компиляции. Хотя процедуры DevCompiler.CompileModuleList и DevCompiler.CompileThis и упомянуты в документации, но особенности построения списка модулей не отражены. В то же время в списке после имени модуля можно указывать опции компилятора и значения селекторов:

	имяМодуля[опцииКомпилятора]["("имяСелектора":"значениеСелектора{","имяСелектора":"значениеСелектора}")"]

Имя и значение селектора можно брать в кавычки (если они содержат пробелы, то кавычки обязательны)

Маркер конца списка компиляции. Процедура DevCompiler.CompileThis принимает в качестве параметра список модулей, который следует в тексте непосредственно за командой. Для того чтобы отделить окончание списка от последующего текста, служит специальный маркер конца списка. Этот маркер имеет вид маленького чёрного треугольника. Для тех, кто часто работает с командой DevCompiler.CompileThis имеет смысл добавить в меню Tools опцию «Insert End», которая позволит быстро вставлять в текст маркер конца списка компиляции. Для этого необходимо проделать следующие шаги:

  1. В главном окне Блэкбокс выберите меню Info/Menus. В открывшемся окне щёлкните по ссылке Dev/Rsrc/Menus.
  2. В открывшемся документе DevMenus найдите строку, которая соответствует команде Tools/«Insert Commander», и сразу после этой строки вставьте такую строку:
	"Insert En&d"	""	"DevCommanders.DepositEnd; StdCmds.PasteView"	"StdCmds.PasteViewGuard"
  1. Сохраните документ. Для того чтобы изменения вступили в силу, необходимо дать команду Info/«Update Menus».

Компоновка консольного приложения. Чтобы компоновщик DevLinker сгенерировал EXE-файл с флагом CUI, используется флаг dos:

DevLinker.Link dos MyAppExe := ...

Автор*: Горячев И.Н. Правки: Ермаков. И.Е.

© 2005-2024 OberonCore и коллектив авторов.