[an error occurred while processing this directive]
.сс
4 Параметры компиляции
_______________________________________________________________
Существует несколько способов управления процессом компиляции. Например, может быть отменена выдача листинга, или отменена генерация фрагмента кода, используемого при отладке. В первом случае ускорится компиляция программы, а во втором - выполнение полученного объектного кода. Управление процессом компиляции осуществляется с помощью установки параметров в форме:
{¤L-}
Ограничителями комментариев могут быть символы '{ }' или '(* *)'. Если первый символ комментария '¤', компилятор воспринимает следующий за '¤' символ как указатель типа устанавливаемого параметра компиляции. Большинство указателей должно сопровождаться знаком '+' или '-' для включения или выключения соответствующего режима компиляции. Некоторые параметры должны сопровождаться числом, например {¤C200} устанавливает допустимый размер объектного кода при компиляции в память.
Комментарий, содержащий параметр компиляции может быть введен одновременно с командой COMPILE после перечисления имен исходного и/или объектного файла. Например, для компиляции программы без выдачи листинга можно воспользоваться следующей командой:
COMPILE исх.файл код.файл {¤l-}
Естественно, если первая строка программы будет содержать '{¤L+}' листинг все равно будет генерироваться. Строку, введенную после обязательной части команды COMPILE можно рассматривать как нулевую строку исходного текста.
Одновременно можно задать несколько параметров, указав их в одном комментарии или в разных, таким образом '{¤L-,D-}' и '{¤L-}{¤D-}' еквивалентны. Ниже приводится полный список параметров компиляции вместе с их значениями:
Параметр Значение Смысл по умолчанию C2000* Установка размера объектного кода D+* Генерация отлаживаемого кода F- Генерация полных сообщений об ошибках G+* Генерация объектного кода I1000* Резервация области под идентификаторы L+ Генерация листинга R+ Генерация кода с контролем значений SN/A Компиляция следующего файла T-* Разрешение отображения вводимой строки U+ Генерация кода с котролем присваиваний W+ Ожидание нажатия <ВВОД> при ошибке X+ Включение расширений фирмы Acornsoft
Параметры, помеченные '*', должны использоваться до первой строки программы, остальные могут располагаться в любой части программы. Кроме того параметр 'C' должен стоять раньше, чем 'U'. Ниже подробно рассматривается действие параметров компиляции:
4.1 {¤Cдлина_кода} - Задание длины объектного кода
Этот параметр используется при компиляции в память. Он должен быть установлен перед первой строкой программы. Если параметр 'С' не задан, компилятор отводит под объектный код 2000 байт памяти. Если этого недостаточно или слишком много, можно установить другое значение. Например, известно, что размер объектного кода около 4000 байт и требуется откомпилироать программу с диска в память. Параметр
{¤C4500}
даст команду компилятору зарезервировать достаточно места.
4.2 {¤D+} - Генерация отлаживаемого кода
По умолчанию компилятор генерирует для каждой строки исходного текста код, сообщающий об ошибках во время выполнения программы. Кроме того, он генерирует код таким образом, что имена вызываемых процедур запоминаются. В результате, при возникновении ошибки, (например ('Division by zero') интерпретатор может напечатать сообщение о местонахождении выражения, вызвавшего ошибку.
Использование такого кода требует большего объема памяти и немного замедляет выполнение программы. Если использован параметр в виде {¤D-}, стоящий перед программой, отладочный код не генерируется. Очень тяжело исправлять ошибку в программе не зная ее точного места, поэтому этот параметр не должен использоваться до тех пор, пока программа не будет полностью отлажена.
4.3 {¤F+} - Компиляция с выдачей полных сообщений об ошибках
Если этот параметр активизирован, при компиляции будут печататься полные сообщения об ошибках в дополнение к их номерам. По умолчанию этот параметр имеет значение '+' для дисковой версии и '-' для резидентной. Чтобы заставить резидентный компилятор печатать полные сообщения об ошибках надо установить параметр '{¤F+}'. Файл 'errutil' должен находится в текущей директории. Для установки режима печати только номеров ошибок используется строка '{¤F-}'. Установки данного параметра могут находится в любом месте исходного текста програмы.
4.4 {¤G+} - Генерация объектного кода
Обычно требуется после успешной компиляции иметь объектный код. Однако, если длинная программа содержит много ошибок (например, написана на нестандартной версии Паскаля), важно получить сообщения об ошибках как можно быстрее. Если вначале программы установлен параметр '{¤G-}', компилятор будет проверять синтаксис программы не генерируя объектный код. Это ускоряет компиляцию, особенно при работе в локальной сети.
4.5 {¤Iид.буфер} - Резервация буфера идентификаторов
Когда программа откомпилирована, все объявленные идентификаторы располагаются в области памяти, зарезервированной в начале компиляции. По умолчанию, компилятор резервирует 1000 байт. Если предположить, что средняя длина идентификатора семь символов, имеем место для 1000/(7+1)=125 идентификаторов. Дополнительный байт - пробел, служащий для разделения идентификаторов. Если отводимойй по умолчанию области недостаточно, можно зарезервировать большую область. Для резервирования 4000 байт, например, используется параметр:
{¤I4000}
расположенный до первого ключевого слова программы. Другим примером использования данного параметра является уменьшение резервируемой области, скажем, до 500 байт.
4.6 {¤L+} - Генерация листинга
Может возникнуть необходимость выдавать только фрагменты листинга компилируемой программы. Параметр 'L' служит для установки начала и окончания выдачи листинга.
4.7 {¤R+} - Генерация кода с контролем переменных
Важно, чтобы переменным, имеющим ограничения, присваивались значения не противоречащие их описанию, например в пределах от 0 до 255. По умолчанию, Паскаль генерирует код, проверяющий выполнение этого условия, что делает объектную программу больше и медленней. Параметр '{¤R-}' отключает данную проверку. Рекомендуется не пользоваться данным параметром до окончания отладки программы.
4.8 {¤S"имя"} - Слияние с заданным файлом
Полезно разбить большую программу на несколько отдельных файлов. Это дает несколько преимуществ: случайное уничтожение одного файла не приведет к потере всей программы; можно компоновать процедуры и функции в отдельные модули для облегчения отладки. И, наконец, можно создовать и редактировать такие большие программы, которые целиком не помещаются в памяти машины.
Параметр 'S' позволяет 'прицепить' к текущему файлу следующий, и так далее. Обычно, этот параметр устанавливается в конце файла, так как все, что находится после него в том же файле, игнорируется. Заметьте, что имя файла дается в апосторофах, так же, как символьные строки в Паскале, например:
{¤S'nextfile'}
Все установленные в предыдущих файлах параметры сохраняют свое значение и в последующих, таким образом нет необходимости устанавливать их снова.
4.9 {¤T+} - Разрешение чтения командной строки
Когда символы или числа берутся из файла 'input' (которым обычно является клавиатура) комьютер ждет ввода каких нибудь данных. Типичный пример выглядит так:
................. write('How many eggs? '); readln(numEggs); .................
В приведенном примере будет напечатан промпт, и компьютер будет ждать, пока вы не наберете строку символов и не нажмете клавишу <ВВОД>. (Для знакомых с работой ОС "Оникс" скажу, что Паскаль использует OSWORD0 для ввода данных, также как и Бейсик.) Когда программа требует ввода одного или двух значений с клавиатуры, удобнее сразу набрать их после имени вызываемой программы. Параметр '{¤T+}' предоставляет такую возможность. Если он исользован, входные данные берутся из строки после имени программы. Если, например, вызывается программа:
TABLE 100 200
будет запущен файл 'TABLE' и результатом чтения двух целых переменных будут значения 100 и 200. После числа 200 будет достигнут конец строки, и последующийй ввод будет идти с клавиатуры.
Если ввести просто:
TABLE
несмотря на то, что файл был откомпилирован с установленным параметром 'T', ввод с самого начала будет идти с клавиатуры.
Конкретный пример позволит лучше понять действие данного параметра. Предположим, что программа 'table', рассмотренная раньше в качестве примера, была изменена таким образом, чтобы первое и последнее число таблицы задавались пользователем. Новая редакция программы будет выглядеть следующим образом:
{¤T+} program table(input,output); { Prints the squares and cubes of first..last } var i:integer; first, last:integer; begin if eoln then write('Type first-number last-number: '); readln(first,last); writeln('Number':10,'Square':10,'Cube':10); for i:=first to last do writeln(i:10,sqr(i):10,i*sqr(i):10) end.
Если программа была откомпилирована командой
COMPILE>table
можно запустить программу введя 'RUNtable' или просто 'table'. Если программа откомпилирована в память, надо ввести команду 'GO'. Если вы наберете
table<ВВОД>
на экран будет выдано сообщение 'Type first-number last-number: ', так как после имени программы нет никаких данных и функция eoln принимает истинное значение. Однако, если Вы введете строку:
table 1 20<ВВОД>
функция eoln примет ложное значение, и сообщение не будет напечатано. Более того, входные значения будут взяты из командной строки и таблица будет сразу напечатана. Если программа находится в памяти, аналогичный эффект можно получить введя:
GO 5 25<ВВОД>
Посмотрим, что получится, если ввести:
table 1<ВВОД>
После имени программы есть продолжение, поэтому функция eoln вначале принимает ложное значение и сообщение не печатается. Первое число берется из командной строки, также, как и в предыдущем примере. Второе же число должно быть введено пользователем с клавиатуры. Неудобство заключается в том, что машина не печатает требования ввода числа и программа может длительное время находится в ожидании ввода. Избежать этого можно проверяя каждый раз значение функции eoln, и печатая сообщение в случает ее истинного значения.
При выборке данных из командной строки, пробелы пропускаются. Таким образом команда
fileabcde<ВВОД>
даст следущий результат:
Значение eolnВыбираемый символ ложноa ложноb ложноc ложноd ложноe истинно<ПРОБЕЛ>
После конца строки, дальнейший ввод будет идти с клавиатуры.
4.10 {¤U+} - Генерация кода без контроля присваивания
В Паскале существует правило, согласно которому переменная не может использоваться до тех пор, пока ей не будет присвоено какое либо значение. Так при выполнении программы:
program test(input,output); var i:integer; begin write(i) end.
будет выдано сообщение об ошибке. В данной версии Паскаля по умолчанию осуществляется проверка предварительного присвоения значения переменной при ее использовании. Это осуществляется установкой каждого байта переменной в значение &B8 (184 десятичное) в начале выполнения программы (или процедуры). Это означает, что переменная имеет 'запрещенное' значение. Если это значение присвоить переменной, например:
c := chr(184);
Дальнейшие попытки использовать переменную c в выражениях приведут к выдаче сообщения об ошибке: 'unassigned variable'. Эта проблема может возникнуть только для переменных, имеющих однобайтовую структуру, например символьного или перечисляемого типов. Получение 'запрещенных' значений для целых и вещественных переменных (-1195853640 и -5.199449944Е16 соответственно) маловероятно. Указатели никогда не принимают значение &B8B8 в данной системе.
Однако, теоретически может понадобиться использование всего диапазона значений различных типов. Для решения возникшей проблемы следует отменить проверку присваиваний, установив параметр:
{¤U*}
В этом случае проверка будет применяться ко всем переменным кроме однобайтовых. Параметр {¤U-} полностью отменяет проверку присваиваний.
Следует отметить, что использование проверки присваиваний практически не вызывает увеличения размера объектного кода; просто вначале добавляется два байта, информирующих интерпретатор о необходимости проверки.
4.11 {¤W+} - Ожидание нажатия клавиши ВВОД
Когда компилятор обнаруживает ошибку, он сообщает об этом пользователю. Затем он ожидет нажатия <ВВОД> для продолжения компиляции. Это предотвращает вероятность того, что компилятор будет выдавать сообщения быстрее, чем пользователь сможет их читать.
Может оказаться, что пользователь организовал выдачу сообщений на принтер или в *SPOOL файл. В этом случае нет необходимости ожидания клавиши <ВВОД>. Отменить ожидание можно задав параметр '{¤W-}'.
Заметим, что данный параметр может располагаться в любом месте программы. Это справедливо для всех параметров, кроме C, D, G, I и T. Параметр S может стоять в любом текущего файла, но только один раз, так как все последующие данные текущего файла будут проигнорированы. Параметр S не может быть использован в строке команды COMPILE.
.сс
4.12 {¤X+} - Включение расширений фирмы Acornsoft
Компиляция без использования каких либо параметров приводит к генерации отлаживаемого объектного кода соответствующего стандарту ISO. Можно заметить, что все описаныые выше параметры можно грубо разделить на две части: облегчающие отладку и уменьшающие перенсимость программы. Данный параметр относится ко второй категории - он позволяет использовать расширения, специфичные для операционной системы. По умолчанию разрешается использование упомянутых расширений. Чтобы быть полностью уверенным в совместимости с другими версиями Паскаля, следует устанвоить параметр '{¤X-}'.
В следующей главе подробно описываются расширения, позволяющие максимально использовать возможности операционной системы "Оникс".
.ст pascal.5a
[an error occurred while processing this directive]