[an error occurred while processing this directive]
.сс
.лв
3 Компиляция
_______________________________________________________________
.ов
В этой главе объясняется, как откомпилировать исходный текст программы на Паскале (используя команду COMPILE или DCOMP).
3.1 Виртуальные файлы
Важной особенностью компиляции, является возможность использования виртуальных файлов. Она упоминалась в первой главе, а теперь настало время познакомиться с ней по ближе.
В любой момент времени в памяти может находиться два виртуальных файла: текстовый и кодовый (исходный и объектный). Текстовый файл может быть создан или загружен с диска в редакторе. Кодовый файл может быть получен в результате компиляции или загрузки его с диска в командном режиме. Текстовый файл всегда располагается с начала рабочей области (области, не использумеой операционной системой (эквивалентно OSHWM или PAGE в Бейсике)), кодовый файл располагается после текстового или с начала рабочей области, в зависимости от того, каким путем он попал в память машины.
3.1.1 Текстовый виртуальный файл
Команды COMPILE, EDIT, RUN и LOAD так или иначе воздействуют на текстовый файл, находящийся в памяти.
COMPILE использует текущий текстовый файл как источник компилируемого текста программы, если не был указан исходный файл на диске. Использование виртуального файла вместо дискового существенно убыстряет процесс компиляции. Если производится компиляция дискового файла в память, объектный код помещается сначала рабочей области уничтожая текущий виртуальный текстовый файл. Если компиляция производится из памяти в память, объектный код помещается после исходного текста программы.
EDIT использует виртуальный текстовый файл. Если после команды указано имя файла, то он сначала грузится в память (становится виртуальным), при этом текущий текстовый файл теряется. Как упоминалось выше, текстовые файлы всегда располагаются с начала рабочей области.
RUN сходна с командой LOAD, которая описывается ниже.
LOAD загружает кодовый файл с начала рабочей области, поэтому, любой виртуальный текстовый файл теряется.
Как упоминалось раньше, запись и чтение текстовых файлов осуществляется из редактора.
3.1.2 Кодовые виртуальные файлы
Команды EDIT, RUN, LOAD, GO и SAVE в разной степени используют кодовые файлы.
COMPILE создает в памяти кодовый файл, если не было указания поместить его на диск. Код помещается с начала рабочей области, если текст компилируемой программы берется из файла на диске. В противном случае код помещается в памяти сразу после исходного текста.
EDIT с именем грузит текстовый файл в память уничтожая находящиеся там виртуальные файлы.
GO вызывает выполнение текущего кода независимо от его местоположения в памяти.
LOAD загружает кодовый файл с начала рабочей области уничтожая текущие виртуальные файлы.
RUN выполняет загружаемый файл. Эквивалентно последовательности команд LOAD и GO.
SAVE записывает виртуальный кодовый файл на диск под указанным именем.
Заметьте, что RUN и LOAD уничтожают оба типа виртуальных файлов. Поэтому их надо использовать с осторожностью.
3.2 Команда COMPILE
COMPILE используется для преобразования исходного текста программы в соответствующий объектный код. Ее минимальное сокращение - 'CO.'. В случае использования дисковой версии применяется команда 'DCOMP'. Возможно четыре варианта синтаксиса команды:
COMPILE исх.файл код.файл{ Компиляция с/на диск } COMPILE { Компиляция из/в память } COMPILE исх.файл{ Компиляция с диска в память } COMPILE >код.файл{ Компиляция из памяти на диск }
Группы 'исх.файл' и 'код.файл' означают имена исходного и объектного файлов соответственно. Кроме того, за командой компиляции может располагаться строка, которая будет восприниматься как первая строка программы, в этом случае она должна начинаться с символа '{'. (См. описание режимов компиляции в гл. 4.)
Только первый вариант испольуется в дисковой версии. Так что, команда компиляции для дисковой версии имеет вид:
DCOMP исх.файл код.файл
Команда COMPILE используется следующим образом:
COMPILE исх.файл код.файл
Используется при компиляции больших программ. Так как ни один из файлов не занимают память, освободившееся место используется компилятором. Надо отметить, что на диске должно быть достаточно места не только для создаваемого объектного файла, но и для промежуточного, используемого во время компиляции. В случае совпадения имен исходного и объектного файлов компилятор выдаст сообщение об ошибке.
COMPILE
В этом случае оба файла находятся в памяти. Это самый быстрый способ компиляции имеет недостаток, так как объем компилируемой программы ограничен размерами памяти машины. Полученый в результате компиляции код можно записать на диск командой SAVE.
COMPILE исх.файл
Компилирует файл с диска в объектный код в памяти машины. Рекомендуется использовать для больших программ. Исходный файл сначала надо создать в редакторе и записать на диск. Полученный в результате компиляции код можно записать на диск командой SAVE.
COMPILE >код.файл
Работает аналогично предыдущему варианту, только компиляция идет в обратном направлении - из памяти на диск. Это вряд ли Вам понадобится, так как обычно исходный текст программы существенно превосходит по объему свой объектный код. Так же, как и первый вариант требует наличия свободного места на диске для объектного и промежуточного файлов.
3.3 Пример компиляции
Ниже подробно рассматривается пример компиляции небольшой программы на Паскале, использующий второй формат команды COMPILE. Предположим, что требуется откомпилировать следующую программу:
{¤W-} program table(input,output); { Prints the squares and cubes of 1..10 } var i:integer; begin writeln('Number':10,'Square':10,'Cube':10); for i:=1 to 10 dp writeln(i:10,sqr(i):10,i*sqr(i):10) end.
Комментарий в первой строке программы - это режим компиляции, указывающий компилятору не ждать нажатия клавиши <ВВОД> в случае обнаружения ошибки. Имеется возможность устанавливать различные параметры компиляции, которые обсуждаются в 4-й главе. Компилятору безразлично, какими буквами набрана программа, прописными или строчными, поэтому, например первые две строки аналогичны следующим:
{¤w-} Program Table(Input,Output);
В обеих случаях результат компиляции будет одинаковым. Естественно это не относится к строкам, заключенным в апострофы.
Исходный текст программы может быть создан в редакторе, как это описывалось в предыдущей главе. Как только текст будет готов, запишите его на диск и выйдите в командный режим с помощью f4''.
В нашем примере мы не хотим, чтобы объектный код автоматически записался на диск. И поэтому, так как исходный текст находится в памяти, введем команду
COMPILE<ВВОД>
Реакция компилятора будет следующей:
ISO-Pascal compiler V. R1.00 1 0 - {¤W-} 2 0 - program table(input,output); 3 0 - { Prints the squares and cubes of 1..10 } 4 0 - var i:integer; 5 0 - begin 6 0 - writeln('Number7:10,'Square':10,'Cube':10); 7 0 - for i:=1 to 10 dp 8 0 - writeln(i:10,sqr(i):10,i*sqr(i):10) ^ ** Error 32 at line 8 in RAM 9 0 - end. 1 Compilation error(s) Code size = 105 bytes
Номер версии и размер объектного кода могут немного отличаться, но количество ошибок должно быть одинаковым. Если используется дисковая версия компилятора для сопроцессора 6502, под номером ошибки должно быть напечатано его значение. Резидентный компилятор напечатает только номер ошибки, так как этот режим устанавливается по умолчанию. Значение номера ошибки можно посмотреть в приложении В. Номеру 32 соответствует фраза 'Do expected'. Данная ошибка вызвана опечаткой, допущенной в конце седьмой строки. Для ее исправления введите E.<ВВОД> для возврата в редактор. Исходный текст все еще в памяти. Исправьте 'p' на 'o' и выйдите из редактора. Повторная компиляция должна пройти без замечаний.
Номер строки, указанный в сообщении об ошибке является номером строки исходного текста. Если используется режим компиляции цепочки файлов, печатаемый номер строки при обнаружении ошибки можно использовать только в отношении первого файла в цепочке.
Имя 'RAM' используется в сообщениях об ошибках, при компиляции из памяти, в противном случае используется имя файла, указанного в команде COMPILE.
После печати своего названия и версии компилятор начинает просматривать исходный текст. Обычно, компилятор печатает листинг, так, как это покахано в предыдущем примере. Выдачу листинга можно отменить воспользовавшись параметром компиляции 'L-', действие которого описано в 4-й главе. Первое число в каждой строке листинга - это номер строки, следующее - уровень вложенности, который увеличивается при объявлении новой функции или процедуры и уменьшается при окончании их описания. Так как в нашем примере нет ни процедур, ни функций, это число везде равно нулю.
Следующий символ в большинстве строк '-'. Вместо него печатается символ 'C', если вся строка является комментарием. Если Вы забудете закрыть комментарий - весь последующий текст программы будет восприниматься как его продолжение, и в каждой строке будет печататься вместо символа '-' символ 'C', что сразу бросится в глаза.
Остаток каждой строки листинга - просто сам исходный текст. В конце листинга печатается количество обнаруженных ошибок. На следующей строке печатается величина объектного кода в байтах. Размер исходного файла в нашем примере равен 209, так что даже при небольших размерах исходного текста, объектный код получается еще меньше. Хотя размер объектного кода печатается независимо от результатов компиляции, запустить его можно только в случае отсутствия ошибок.
Компиляция, как и выполнение программы на Паскале, может быть прервана нажатием 'РЕД'. Это приведет к печати сообщения 'Escape' и выходу в командный режим. Если прерванная программа была откомпилирована с включенным параметром отладки, будут напечатаны номер строки и имя процедуры, в которых произошло прерывание. По умолчанию, компиляция производится с выключенным параметром отладки.
Предположим, что повторная компиляция прошла успешно и получен объектный код. В нашем примере он распологается в памяти машины и может быть выполнен командой GO. Если в команде компиляции было укзано имя объектного файла, его можно запустить с помощью команды RUN, или просто набрав его имя.
Результат выполнения откомпилированной команды будет таким:
NumberSquareCube 111 248 3927 41664 525125 636216 749343 864512 981729 101001000
.ст pascal.4
[an error occurred while processing this directive]