Различия

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

wiki:blackbox:секреты_компилятора [2009/07/20 21:35]
Игорь Лоскутов
wiki:blackbox:секреты_компилятора [2013/09/26 17:54] (текущий)
Темиргалеев Евгений Эдуардович вернул по ошибке удалённое авторство
Строка 1: Строка 1:
 ====== Секреты компилятора ====== ====== Секреты компилятора ======
  
-**Опции компилятора.** Несмотря на то, что в официальной документации заявлено, что компилятор не имеет опций компиляции, на самом деле эти опции есть, и также есть средства, которые позволяют управлять этими опциями. Итак, имеются следующие опции компиляции: +[[:library:loskutov_opcii_kompilyatora]]
-  * //checks// — добавить в исполняемый модуль (*.EXE или *.DLL) код, выполняющий основные проверки +
-  * //allchecks// — добавить в исполняемый модуль код, выполняющий дополнительные проверки (переполнение и выход за диапазон значений для целых чисел). +
-  * //assert// — добавить в исполняемый модуль код, предусмотренный операторами ASSERT(). +
-  * //obj// — создавать объектный файл +
-  * //ref// — +
-  * //allref// — +
-  * //srcpos// — +
-  * //hint// — +
-  * //oberon// — включить поддержку некоторых элементов языка Оберон, в частности тип LONGREAL и символ "D" в вещественных константах. +
-  * //errorTrap// — +
-В модуле DevCompiler определены также опции //reallib// и //signatures//, но они не реализованы и здесь не рассматриваются.+
  
-По умолчанию включены опции: //checks//, //assert//, //obj//, //ref//, //allref//, //srcpos//. +===== Список компиляции ===== 
- +Хотя процедуры DevCompiler.CompileModuleList и DevCompiler.CompileThis и упомянуты в документации, но особенности построения списка модулей не отражены. В то же время в списке после имени модуля можно указывать опции компилятора и значения [[wiki:BlackBox:DevSelectors|селекторов]]:
-Для управления опциями служит строка опций, которая представляет собой последовательность символов. Перед компиляцией компилятор сначала включает опции по умолчанию, затем, последовательно обрабатывая символы в строке опций, изменяет состав включенных опций. Порядок символов в строке опций не имеет значения. Определены следующие управляющие символы: +
-  * "-" — последовательно выключает опцию //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 componentpascal>
  имяМодуля[опцииКомпилятора]["("имяСелектора":"значениеСелектора{","имяСелектора":"значениеСелектора}")"]  имяМодуля[опцииКомпилятора]["("имяСелектора":"значениеСелектора{","имяСелектора":"значениеСелектора}")"]
Строка 37: Строка 10:
 Имя и значение селектора можно брать в кавычки (если они содержат пробелы, то кавычки обязательны) Имя и значение селектора можно брать в кавычки (если они содержат пробелы, то кавычки обязательны)
  
-**Маркер конца списка компиляции.** Процедура DevCompiler.CompileThis принимает в качестве параметра список модулей, который следует в тексте непосредственно за командой. Для того чтобы отделить окончание списка от последующего текста, служит специальный маркер конца списка. Этот маркер имеет вид маленького чёрного треугольника. Для тех, кто часто работает с командой DevCompiler.CompileThis имеет смысл добавить в меню Tools опцию "Insert End", которая позволит быстро вставлять в текст маркер конца списка компиляции. Для этого необходимо проделать следующие шаги: +==== Маркер конца списка компиляции ==== 
-  - В главном окне Блэкбокс выберите меню Info/Menus. В открывшемся окне щёлкните по ссылке Dev/Rsrc/Menus. +Процедура DevCompiler.CompileThis принимает в качестве параметра список модулей, который следует в тексте непосредственно за командой. Для того чтобы отделить окончание списка от последующего текста, служит специальный маркер конца списка((**Более точно:** этот маркер указывает окончание списка параметров команды, рассчитанной на активацию коммандером, и читающей свои параметры из текста (см. документацию модуля DevCommanders).\\ В BlackBox много таких команд; в основном они предназначены для разработки.\\ Также вместо этого маркера часто можно использовать символ <<~>> или любой визуальный объект, например, ещё один коммандер.)). Этот маркер имеет вид маленького чёрного треугольника. 
-  - В открывшемся документе DevMenus найдите строку, которая соответствует команде Tools/&quot;Insert Commander", и сразу после этой строки вставьте такую строку: + 
-<code componentpascal+{{:wiki:blackbox:commandercompilethis.png|}} 
- "Insert En&d" "" "DevCommanders.DepositEnd; StdCmds.PasteView" "StdCmds.PasteViewGuard"+ 
 +Для тех, кто часто работает с командой DevCompiler.CompileThis имеет смысл добавить в меню //Tools// опцию //Insert End Commander//, которая позволит быстро вставлять в текст маркер конца списка компиляции. Для этого необходимо проделать следующие шаги((Подробно см. документацию среды: \\ //Содержание -> Руководства пользователя -> Среда -> 8 Настройка меню// \\ //Help Context -> User Manuals -> Framework -> 8 Menu Configuration//))
 +  - В главном окне Блэкбокс выберите меню //Info->Menus//. В открывшемся окне щёлкните по ссылке Dev/Rsrc/Menus. 
 +  - В открывшемся документе DevMenus найдите строку, которая соответствует команде //Tools-&gt;Insert Commander//, и сразу после этой строки вставьте такую строку:<code> 
 + "Insert &End Commander" "" "DevCommanders.DepositEnd; StdCmds.PasteView" "StdCmds.PasteViewGuard"
 </code> </code>
-  - Сохраните документ. Для того чтобы изменения вступили в силу, необходимо дать команду Info/&quot;Update Menus". +  - Сохраните документ. Для того чтобы изменения вступили в силу, необходимо дать команду //Info-&gt;Update Menus//.
- +
-**Компоновка консольного приложения.** Чтобы компоновщик DevLinker сгенерировал EXE-файл с флагом CUI, используется флаг dos:+
  
-  DevLinker.Link dos MyAppExe := ...+===== Компоновка приложений ===== 
 +Подробнее о компоновке приложений с помощью DevLinker смздесь[[make_exe]].
  
 +//Автор раздела "Маркер конца списка компиляции": Лоскутов И.В.//
 +-----
 //Автор<sup>[[wiki:about_old|*]]</sup>: Горячев И.Н. Правки: Ермаков. И.Е.// //Автор<sup>[[wiki:about_old|*]]</sup>: Горячев И.Н. Правки: Ермаков. И.Е.//
© 2005-2019 OberonCore и коллектив авторов.