Различия
Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
wiki:blackbox:секреты_компилятора [2009/07/20 21:35] igor |
— (текущий) | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Секреты компилятора ====== | ||
- | **Опции компилятора.** Несмотря на то, что в официальной документации заявлено, что компилятор не имеет опций компиляции, на самом деле эти опции есть, и также есть средства, которые позволяют управлять этими опциями. Итак, имеются следующие опции компиляции: | ||
- | * //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 и упомянуты в документации, но особенности построения списка модулей не отражены. В то же время в списке после имени модуля можно указывать опции компилятора и значения [[wiki:BlackBox:DevSelectors|селекторов]]: | ||
- | <code componentpascal> | ||
- | имяМодуля[опцииКомпилятора]["("имяСелектора":"значениеСелектора{","имяСелектора":"значениеСелектора}")"] | ||
- | </code> | ||
- | Имя и значение селектора можно брать в кавычки (если они содержат пробелы, то кавычки обязательны) | ||
- | |||
- | **Маркер конца списка компиляции.** Процедура DevCompiler.CompileThis принимает в качестве параметра список модулей, который следует в тексте непосредственно за командой. Для того чтобы отделить окончание списка от последующего текста, служит специальный маркер конца списка. Этот маркер имеет вид маленького чёрного треугольника. Для тех, кто часто работает с командой DevCompiler.CompileThis имеет смысл добавить в меню Tools опцию "Insert End", которая позволит быстро вставлять в текст маркер конца списка компиляции. Для этого необходимо проделать следующие шаги: | ||
- | - В главном окне Блэкбокс выберите меню Info/Menus. В открывшемся окне щёлкните по ссылке Dev/Rsrc/Menus. | ||
- | - В открывшемся документе DevMenus найдите строку, которая соответствует команде Tools/"Insert Commander", и сразу после этой строки вставьте такую строку: | ||
- | <code componentpascal> | ||
- | "Insert En&d" "" "DevCommanders.DepositEnd; StdCmds.PasteView" "StdCmds.PasteViewGuard" | ||
- | </code> | ||
- | - Сохраните документ. Для того чтобы изменения вступили в силу, необходимо дать команду Info/"Update Menus". | ||
- | |||
- | **Компоновка консольного приложения.** Чтобы компоновщик DevLinker сгенерировал EXE-файл с флагом CUI, используется флаг dos: | ||
- | |||
- | DevLinker.Link dos MyAppExe := ... | ||
- | |||
- | //Автор<sup>[[wiki:about_old|*]]</sup>: Горячев И.Н. Правки: Ермаков. И.Е.// |
© 2005-2024 OberonCore и коллектив авторов.