Каждое действие, описываемое любым
оператором ЯП высокого уровня может быть
реализовано множеством различных способов.
Часть из них в любом случае не долна быть
использована по причине неэффективности, а
оставшиеся варианты следует избирать в
различных ситуациях в зависимости от
потребных параметров исполнимого кода.
Компилятор, разработанный фирмой Borland в
большинстве случаев может сам определить
какой исполнимый код генерировать, причем
оптимизация (выбор используемого варианта)
в большинстве случаев производится с точки
зрения увеличения быстродействия
исполнимого кода. Однако, существуют
ситуации, когда компилятор не может
автоматически определить какой из
вариантов следует выбрать просто
вследствие отсутствия информации. Например
следует ли использовать инструкции 32-битных
процессоров, проводить ли оптимизацию
вычисления логических выражений и так
далее.
В таких случаях программисту следует
указать компилятору какие параметры кода
его интересуют, то есть дать компилятору
некоторые указания. Такого рода указания
производятся за счет установки тех или иных
опций компилятора. В зависимости от
указанных опций компилятор будет
производить те или иные действия при
генерации исполнимого кода программы.
Все опции делятся на две большие группы:
глобальные, сохраняющие свое
значение на протяжении компиляции всего
файла;
локальные, имеющие возможность
менять свое значение на этапах
компиляции различных участков файла.
Значение любой из опций компилятора можно
установить двумя путями:
указав напрямую компилятору
компилятору командной строки - через
параметры;
компилятору IDE - через диалоговое окно
Options/Compiler;
непосредственно в компилируемом файле с
помощью директив компилятора.
Директивы глобальных опций должны быть
указаны в начале файла (до начала
компиляции).
Компилятор командной строки в
отсутствие параметров, указуюих на
необходимое значение той или иной опции,
считает его равным значению по умолчанию.
Компилятор IDE считает, что значения по
умолчанию указаны в соответствующем
диалоговом окне (напомним, что настройки IDE
можно сохранять).
Наконец, вне зависимости от того, какие
опции указаны компилятору, если в файле
встречаются директивы. Поэтому для того,
чтобы результат компиляции программы не
зависел от настроек IDE (а они на разных
машинах, естественно, разные) следует
указывать в каждом компилируемом
файле все нужные директивы (сделать
это можно два раза подряд нажав Ctrl+o).
Рассмотрим наиболее интересные опции.
Каждая из них может быть включена
директивой {$@+} и отключена
директивой {$@-}, где @ - одна из
допустимых букв (см. таблицу)
{$A}
При включении данной опции
производится выравнивание всех
переменных на границу слова, что
ускоряет доступ к ним и увеличивает
объем требуемой памяти.
При отключенной опции выравинвание не
производится.
{$B}
При включенной опции генерируется
код, вычисляющий все компоненты
логического выражения (в том числе и
вызовы функций).
При отключенной опции вычисления
заканчиваются, как только
предопределен результат.
{$D}
При включенной опции компилятор
генерирует отладочную информацию и
вставляет ее в файл. Полезно на этапах
отладки. Да и на этапе
предварительного использования тоже.
Влияет на размер программы и как
следствие на скорость загрузки. На
скорость выполнения не влияет.
{$E}
При включенной опции компилятор
генерирует код, использующий
сопроцессор, если он есть, или
эмуляцию сопроцессора при его
отсутствии дляобработки чисел с
плавающей точкой.
При отключенной опции генерируется
только код для сопроцессора, а
эмулируюшие библиотеки не включаются
в исполнимый код.
{$F}
При включенной опции компилятор
всегда генерирует дальние (FAR) вызовы
процедур и функций.
При отключенной опции генерируются
ближние (NEAR) вызовы процедур,
находящихся в одном файле.
{$G}
При включенной опции генерируется
код с использованием инструкций
процессора i80286. Проверка наличия
такого процессора не производится.
{$I}
При включенной опции генерируется
код, проверяющий правильность
завершения операций ввода-вывода и
завершающий программу при ошибке. См. урок
об этом.
{$L}
При включенной опции генерируется
информация об именах и типах
локальных перемнных. Эта информация
может пригодиться при отладке. На
скорость выполнения не влияет.
{$N}
При включенной опции разрешена
генерация кода, использующего
сопроцессор.
При включенной опции генерируется
код, проверяющий наличие перполнения
при выполнении некоторых
арифметических операций. При
переполнении программа аварийно
завершается. Замедляет выполнение
программы. Полезно для поиска
трудноуловимых ошибок.
{$R}
При включенной опции генерируется
код, проверяющий правильность
вычисленных индексов массивов. При
выходе за рамки программа аварийно
завершается. Замедляет работу с
массивами. Полезно на этапах отладки.
{$S}
При включенной опции перед каждым
вызовом процедуры/функции
генерируется код для проверки наличия
достаточного места в стеке под
параметры/локальные переменные.
Полезно при отладке рекурсивных
программ. Замедляет работу.
{$T}
При включенной опции результат
операции @<переменная_типа_Е>
есть указатель на этот тип.
В противном случае тип результата
этой операции - pointer.
{$V}
При включенной опции на этапе
компиляции производится сравнение
размера строки, передаваемой в
качестве параметра с размером,
указанным при объявлениии параметра.
При несовпадении выдается ошибка.
При отключенной опции этого не
происходит.
{$X}
При включенной опции разрешены
выражения расширенного синтаксиса
языка Object Pascal, к примеру вызов функции
как процедуры и тому подобные
действия. Фактически этот синтаксис
уже стал стандартом de facto в мире
программрования.
{$Y}
При включенной опции производится
генерация отладочной информации о
символах программы.
Правильная установка опций на этапе
написания/тестирования программы может
оказать неоценимую помощь в этом процессе,
позволяя автоматически отлавливать мелкие
и крупные ошибки. После полной отладки,
перед сдачей программы заказчику
необходимо отключить опции, увеличивающие
объем и время выполнения программы. И еще
немного потестировать.