Различия

Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.

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 и коллектив авторов.