logo search
TurboProlog / Документация / TOM_2

Директивы компилятора.

Множество особенностей компилятора контролируется через директивы

компилятора. Вы можете ввести одну или более из следующих директив в на-

чале текста программы:

bgidriver config nobreak shorttrace

bgifont diagnostics nowarnings trace

check_determ errorlevel printermenu trail

code heap project

Многие из директив компилятора могут быть установлены как в среде

подготовки программ на Турбо Прологе (из меню), так и в исходном тексте.

Если директива компилятора стоит в исходном тексте, то ее значение пере-

силивает значение, установленное из меню.

В следующих разделах мы перечислим директивы компилятора и их место

в меню. Например, директива компилятора check_determ может быть установ-

лена в среде подготовки из меню Options/Compiler Directives/Non-Deferm

Warning (сокращенно O/C/Non-Deferm).

bgidriver

Если вы хотите подсоединить драйвер графики BGI прямо в вашу выпол-

няемую программу, используйте директиву компилятора bgidriver, за которой

следует имя файла драйвера графики

bgidriver "_CGA_driver_far"

bgifont

Если вы хотите подключить символьные шрифты BGI прямо в вашу выпол-

няемую программу, то используйте директиву компилятора bgifont с указани-

ем имени файла шрифта.

bgifont "_gothic_font_far".

check_determ O/C/Non-Determ)

Если вы указываете check_determ, система Турбо Пролог будет выдавать

предупреждения для каждого предложения программы, которое является неде-

терминистическим предикатом.

Есть два вида недетерминистических предложений:

1. Если предложение не содержит прерыватель (cut), и имеется

одно или более предложений, которые могут быть сопоставлены при

тех же входных аргументах для данного шаблона обмена (flow

pattern).

2. Если предложение вызывает недетерминистический предикат, и

за вызовом этого предиката не стоит прерыватель.

Вы можете использовать check_determ, чтобы проследить за прерывате-

лями. Турбо Пролог сам обладает широкими возможностями, позволяющими ре-

шить, является ли предикат детерминистическим или недетерминистическим,

поэтому вам необязательно заполнять ваши программы прерывателями просто

для того, чтобы сохранить место в стеке (что необходимо в более традици-

онных версиях Пролога).

Если некоторые предикаты являются недетерминистическими, а вы желае-

те подавить предупреждающие сообщения, то вы должны перед объявлением

предиката поставить determ или nondeterm; это указывает, что предикат

должен быть детертминистическим или недетерминистическим соответственно.

Например,

predicates

nondeterm repeat

determ readname(string)

По умолчанию все глобальные предикаты рассматриваются как детерми-

нистические. nondeterm позволяет вам объявить глобальный предикат как не-

детерминистический.

code

Директива code задает размер массива внутреннего кода. По умолчанию

16 Кбайт. Для больших программ вам может понадобиться задать больший раз-

мер. Для компьютеров с ограниченными (RAM-) возможностями, вы можете по-

желать задать меньший размер (чтобы оставить больше места для компилято-

ра. Формат для code:

code = Число_параграфов

где Число_параграфов представляет собой количество участков памяти по 16

байт, требуемых для массива кода. Например, директива

code = 1024

специфицирует массив кода в 16 Кбайт.

Директива code не влияет на размер файла .EXE.

Размер кода для одного модуля может достигать 500 Кбайт. Когда раз-

мер кода превышает значение 4000, компилятор переключается на генерацию

вызовов FAR внутри этого модуля. По этой причине вам следует только тогда

использовать код размером свыше 4000, когда это действительно необходимо.

config

Чтобы позволить .EXE читать файл .SYS, который определяет правила

умолчания для атрибутов окон, установок клавиатуры и т.д., разместите ди-

рективу

config "<ИмяФайлаКонфигурации>.sys"

в вашей программе. .EXE будет читать <ИмяФайлаКонфигурации>.SYS и обра-

щаться с ним так же, как это делает Турбо Пролог с PROLOG.SYS.

Различные опции проходят из среды в выполняемый файл; они могут быть

встроены во время компиляции или считаны из файла .SYS во время старта.

Некоторые из значений, встроенных в файл .EXE могут быть переписаны соот-

ветствующим образом в файл .SYS.

Ниже следует обзор этих параметров:

компиляция <ИмяФайлаКонфи- <ИмяФайлаКонфи-

гурации>.SYS гурации>.SYS

-----------------------------------------------------------------

Stack Size х х

Trail Size х х

Heap Size х

Snow Check х х

Keyboard Layont х

Help Lines х

Xedit Setup х

-----------------------------------------------------------------

diagnostics O/C/Diagnostics

Если вы укажите diagnostics, то компилятор выдаст анализ вашей прог-

раммы, содержащий следующую информацию:

# Имена использованных предикатов

# является ли предикат локальным, глобальным или внешне опреде-

ленным

# является ли предикат детерминистическим или недетерминистичес-

ким

# размер кода для каждого предиката

# типы доменов параметров

# формы каждого предиката

Пример диагностики:

DIAGNOSTICS FOR MODULE: C:\TPROLOG2\PROGRAMS\D_CURVE.PRO

Predicates Name Type Determ Size Doml -- flowpattern

-----------------------------------------------------------------

goal local YES 190 --

dragon local YES 496 real,integer,integer--i,i,i

t local YES 496 integer,integer,integer--i,o,o

-----------------------------------------------------------------

Total size 883

Замечание: Вы можете использовать клавишу Alt-P, чтобы переназначить

вывод диагностики на принтер или в файл с именем PROLOG.LOG.

errorlevelO/C/ErrorLever

Директива компилятора errorlevel дает вам возможность определять

насколько должны быть детализированы сообщения об ошибках в файле .EXE.

Синтаксис:

errorlevel = d

где d - это 0, 1 или 2, представляющие следующие уровни:

-----------------------------------------------------------------

d Уровни сообщений об ошибках

-----------------------------------------------------------------

0 Генерирует наиболее эффективный код. Это соответствует

стратегии Турбо Пролога версии 1.x.

1 По умолчанию. Когда встречается ошибка, то место ее появления

(имя модуля и присоединенного файла) выводится на экран.

Место, где была обнаружена ошибка, также выводится,

выраженное в терминах количества байтов от начала файла.

После того, как исходная программа загружена в редактор, если

вы нажмете Shift-F2, введите это число, а затем снова нажмите

Shift-F2, курсор будет расположен в месте, где встретилась

ошибка.

2 На этом уровне ошибки, о которых не было сообщений на уровне

1, включая переполнение стека, переполнение памяти, вызывают

сообщения.

-----------------------------------------------------------------

По проекту опция error-level в каждом модуле служит для управления

таким свойством модуля как сообщение об ошибках. Если, однако, опция

error-level в главном модуле выше, чем в подмодулях, Турбо Пролог может

выдать дезориентирующую информацию. Например, если ошибка встречается в

модуле, скомпилированном с уровнем ошибок 0, который включен в главный

модуль, скомпилированный с уровнем 1 или 2, система будет неспособна вер-

но показать место ошибки. Вместо этого, она индицирует позицию какого-ни-

будь ранее выполненного кода.

heap O/C/M/Heap

Директива heap специфицирует, сколько памяти должен занять ваш файл

.EXE, если он запущен из DOS. Если вы не используете директиву heap или

устанавливаете ее значение 0, программа будет размещаться во всей доступ-

ной памяти. Обычно так и делают, но если вы хотите поставить RAM-резиден-

тную Турбо Пролог-программу, ваша программа должна занимать только необ-

ходимую память. Формат:

heap = Число_параграфов

nobreak O/C/R/Break Check

При отсутствии директивы компилятора nobreak, система Турбо Пролог

будет генерировать код на контроль клавиатуры перед каждым вызовом преди-

ката, чтобы удостовериться в том, что комбинация клавиш Ctrl-Break не бы-

ла нажата. Это несколько замедляет выполнение программы и требует немного

дополнительного места для программы.

Директива nobreak предотвращает эту автоматическую генерацию кода.

Когда введено nobreak, единственным способом выйти из бесконечного цикла

является перезагрузка всей оперативной системы. nobreak стоит использо-

вать после того, как программа хорошо протестирована.

nowarnings O/C/Variable Used Once

Директива nowarnings подавляет возникающие предупреждения, если пе-

ременная встречается в предложении только один раз.

Замечание: Эта директива включается только для полноты. Если

переменная встречается только один раз, это либо ошибка, либо она

может быть замещена на анонимную переменную.

printermenu O/C/Printer Menu in EXE file

Когда эта директива компилятора появляется в программе, Турбо Пролог

размещает код в файле EXE для управления клавишей Alt-P таким же образом,

как это делает система Турбо Пролог. Это означает, что пользователь будет

иметь возможность послать выходную информацию с экрана на принтер или в

.LOG-файл.

project

Директива компилятора project используется в модульном программиро-

вании. Все Турбо Пролог-модули, включенные в проект, нуждаются в том,

чтобы определить свою часть внутренней таблицы символов. Если проект на-

зывается MYPROJ, то таблица символов будет помещена в файл с именем

MYPROJ.SYM. Директива project должна стоять в первой строке модуля, чтобы

указывать, какому проекту этот модуль принадлежит. Например, следующая

строка указывает, что модуль принадлежит проекту MYPROJ:

project "MYPROJ"

Для детального знакомства с модульным программированием см. соответ-

ствующий раздел оригинального руководства.

trace(shorttrace)O/C/T/Trace(ShortTrace)

Когда вы указываете trace, Турбо Пролог не будет сокращать хвостовую

рекурсию и проделывать другие оптимизирующие трюки. Если указано trace,

то трасса покажет все RETURN. Shorttrace показывает трассу с сокращением

рекурсии и оптимизацией. Если указано trace или shorttrace, то все преди-

каты трассируются. Если за trace или shorttrace следует список имен пре-

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

Турбо Пролог высвечивает информацию, показанную в Таблице 2.3.

Таблица 2.3. Сообщения окна трассировки.

-----------------------------------------------------------------

CALL Всякий раз, когда предикат вызывается, имя предиката и

значения его параметров высвечивается в окне

трассировки.

RETURN Когда предложение выполнено, в окне трассировки

высвечивается RETURN и происходит вызов предиката. Если

есть еще предложения, которые сопоставимы с входными

параметрами, то высвечивается звездочка (*),

показывающая, что это предложение является точкой

возврата.

FAIL Когда предикат завершается неудачно, высвечивается слово

FAIL, за которым идет имя завершившегося неудачно

предиката.

REDO REDO показывает, что имел место возврат. Имя предиката,

который снова вызывается вместе со значениями

параметров, высвечивается в окне трассировки.

-----------------------------------------------------------------

Например, задавая следующую программу

trace

domains

list = integer*

predicates

eg(integer, integer)

member(integer, list)

clauses

member(X, [X\_].

member(X, [_\L] :- member(X, L).

eg(X, X).

goal

member(X, [1, 2], eg(X, 2).

вы получаете следующую трассу:

CALL: goal()

CALL: member(_, [1, 2])

RETURN: *member(1, [1, 2])

CALL: eg(1, 2)

FAIL: eg(1, 2)

REDO: member(_, [1, 2])

CALL: member(_, [2])

RETURN: *member(2, [2])

CALL: eg(2, 2)

RETURN: eg(2, 2)

RETURN: goal()

trail O/C/M/Trail Array

Директива trail специфицирует размер внутреннего следящего массива

(trail array). Формат:

trail = Число_параграфов

Следящий массив используется для регистрации сторонних эффектов

(главным образом, связываний ссылочных переменных). По умолчанию следящий

массив отсутствует. Если ваша программа использует ссылочные переменные,

вы должны задать размер явно: в противном случае будет ошибка переполне-

ние следящего массива. Для большинства нужд установка

trail = 100

будет достаточной.