Программирование в среде Турбо Паскаль - Дмитрий Поляков 6 стр.


2.2. Принятые в системе расширения имен файлов

Система Турбо Паскаль воспринимает все виды расширений в именах файлов, используемых в среде MS-DOS. Они обычно зависят от области применения или от вида программы. Турбо Паскаль по умолчанию использует несколько выделенных расширений для имен файлов:

TPU - файл модуля, содержащий подобие объектного кода модуля и (необязательно) отладочную информацию.

TPL - файл библиотек Турбо Паскаля. Стандартный набор модулей языка находится в файле TURBO.TPL. Этот файл можно модифицировать с помощью утилиты TPUMOVER.EXE (см. Приложение 4).

TP и CFG - файлы конфигурации для TURBO.EXE и TPC.EXE. Эти файлы позволяют сохранить значения различных опций, установленных для компиляторов. Файлы с расширением .TP могут иметь различные имена, но файл TPC.CFG (см. Приложение 3) в текущем каталоге может быть только один.

PCK - расширение файла истории работ Турбо Паскаля. Этот файл указателя содержит информацию о состоянии редактора, и поэтому после перерыва в сеансе работы с системой редактор восстановит свое последнее состояние.

- 48 -

PAS - стандартное расширение для файлов, содержащих исходный текст на Паскале.

BAK - расширение резервной копии исходного файла. Редактор интегрированной среды программирования всегда переименовывает существующий файл на диске в файл резервной копии, если на диск записывается измененная копия этого файла. Система позволяет установить или отменить генерацию файлов с расширением .BAK.

EXE - выполняемый файл, построенный компилятором.

MAP - расширение справочного файла, генерируемого системой, если опция Options/Compiler/Map File установлена в значение On.

HLP - файл с упакованными текстами для справочной системы (TURBO.HLP)

- 49 -

Часть II. Язык Турбо Паскаль

Глава 3. Построение программ

В этой главе рассмотрены алфавит и ключевые слова языка, правила написания идентификаторов, а также особенности построение программ на Турбо Паскале и его отличия от стандартного Паскаля. Здесь же приведены правила условной компиляции программ.

3.1. Алфавит языка и зарезервированные слова

Как и любой другой язык программирования, Турбо Паскаль имеет свой алфавит - набор символов, разрешенных к использованию и воспринимаемых компилятором. В алфавит языка входят:

1. Латинские строчные и прописные буквы:

A, B,..., Z и a, b,..., z

2. Цифры от 0 до 9.

3. Символ подчеркивания "_" (код ASCII номер 95). Из этих символов (и только из них!) конструируются идентификаторы - имена типов, переменных, констант, процедур, функций и модулей, а также меток переходов. Имя может состоять из любого числа перечисленных выше символов, но должно начинаться с буквы, например:

X CharVar My_Int_Var C_Dd16_32m

Прописные и строчные буквы не различаются: идентификаторы FILENAME и filename - это одно и тоже. Длина имен формально не ограничена, но различаются в них "лишь" первые 63 символа (остальные игнорируются).

4. Символ "пробел" (код 32). Пробел является разделителем в языке. Если между двумя буквами имени или ключевого слова стоит пробел, то две буквы будут считаться принадлежащими разным именам (словам). Пробелы отделяют

- 50 -

ключевые слова от имен. Количество пробелов не является значащим. Там, где можно поставить один пробел, можно поставить их сколько угодно. Например, выражения

C:=2+2; и C := 2 + 2 ;

для компилятора эквивалентны.

5. Символы с кодами ASCII от 0 до 31 (управляющие коды). Они могут участвовать в написании значений символьных и строчных констант. Некоторые из них (7, 10, 13, 8, 26) имеют специальный смысл при проведении ряда операций с ними. Символы, замыкающие строку (коды 13 и 10), и символ табуляции (код 9) также могут быть разделителями:

C := 2+2;

эквивалентно построению

C := 2

+

2;

6. Специальные символы, участвующие в построении конструкций языка:

+ - * / = < > [ ] . , ( ) : ;^ @ { } $ # '

7. Составные символы, воспринимаемые как один символ:

<= >= := (* *) (. .) ..

Разделители (пробелы) между элементами составных символов недопустимы.

Как видно, символы из расширенного кода ASCII, т.е. символы с номерами от 128 до 255 (а именно в этот диапазон входит алфавит кириллицы на IBM-совместимых ПЭВМ), а также некоторые другие из основного набора клавиатуры ( !, %, и др.) не входят в алфавит языка. Тем не менее они могут использоваться в тексте программы, но только в виде значений констант символов и (или) строк, а также в тексте комментариев. В имена (идентификаторы) эти символы входить не могут. Обычно это не вызывает проблем. Главное, что можно выводить знаки кириллицы и псевдографики на экран и принимать их с клавиатуры.

Турбо Паскаль имеет большое количество зарезервированных (или ключевых) слов. Эти слова не могут быть использованы в качестве имен (идентификаторов) в программе. Попытка нарушить

- 51 -

этот запрет вызовет ошибку при обработке программы компилятором языка. Список зарезервированных слов Турбо Паскаля таков:

ABSOLUTE AND ARRAY BEGIN CASE CONST CONSTRUCTOR DESTRUCTOR DIV DO DOWNTO ELSE END

EXTERNAL FILE FOR FORWARD FUNCTION GOTO IF IMPLEMENTATION IN INLINE INTERFACE INTERRUPT LABEL

MOD NIL NOT OBJECT OF OR PACKED PROCEDURE PROGRAM RECORD REPEAT SET SHL

SHR STRING THEN TO TYPE UNIT UNTIL USES VAR VIRTUAL WHILE WITH XOR

Примечание: Зарезервированное слово PACKED (упакованный) в Турбо Паскале игнорируется.

3.2. Общая структура программ

Самая короткая программа на Турбо Паскале выглядит следующим образом:

| BEGIN

| END.

Более длинные программы обрастают различными смысловыми блоками: описаниями меток переходов, константами, объявлениями типов и переменных, затем процедурами и функциями. Порядок размещения их в тексте программы для Турбо Паскаля может быть таким же жестким, что и для стандартного Паскаля. Написанная по правилам стандарта языка программа будет иметь в своем полном варианте структуру, показанную на рис. 3.1.

Регистр написания заголовков блоков неважен. Название программы в Турбо Паскале имеет чисто декоративное назначение, как комментарий. Обязательная для многих других версии Паскаля конструкция

PROGRAM Имя ( input, output, ... )

здесь не является необходимой.

- 52 -

| PROGRAM Имя_программы;

| USES

| Список используемых библиотек (модулей);

| LABEL

| Список меток в основном блоке программы;

| CONST

| Определение констант программы;

| TYPE

| Описание типов;

| VAR

| Определене глобальных переменных программы;

| ОПРЕДЕЛЕНИЕ ПРОЦЕДУР (заголовки и, возможно, тела процедур);

| ОПРЕДЕЛЕНИЕ ФУНКЦИЙ (заголовки и, возможно, тела функций);

| BEGIN

| Основной блок программы

| END.

Рис. 3.1

Директива USES - первый в программе действительно работающий оператор. С ее помощью подключаются библиотечные модули, из стандартного набора Турбо Паскаля или написанные пользователем, расширяя тем самым список используемых в программе процедур, функций, переменных и констант. У директивы USES есть свое четкое место. Если она присутствует, то должна стоять перед прочими директивами и разделами. Кроме того, слово USES может появиться в программе только один раз. Список библиотек дается через запятую:

USES

CRT, DOS, Graph;

{ подключены три библиотеки с соответствующими именами }

Если библиотеки не используются, то директива USES не ставится.

Блок описания меток LABEL содержит перечисленные через запятую метки переходов, установленные в основном блоке программы. Блоков LABEL может быть сколько угодно (лишь бы метки не повторялись), и стоять они могут где угодно до начала основного блока. Метки могут обозначаться целым числом в диапазоне 0...9999 или символьными конструкциями длиной не более 63 букв, например:

- 53 -

LABEL

Loop, 1, 123, m1, m2, Stop;

{описываем шесть различных меток }

Если метки не используются, то блоки LABEL отсутствуют.

Блок объявления констант CONST так же, как блок LABEL может располагаться в любом месте программы. Таких блоков может быть несколько или может не быть вообще. В них размещаются определения констант различных видов.

Необязательный, как и все предыдущие, блок описания типов TYPE содержит определения вводимых программистом новых типов, в том числе для описания типов "объект". В этом блоке могут быть использованы константы из блока CONST. Если это так, то блок TYPE может быть расположен где угодно, но не выше соответствующего блока CONST. Если же описания типов ни с чем не связаны, то они могут быть помещены в любом месте между другими блоками, но выше того места, где будут использованы.

Раздел описания глобальных переменных VAR формально тоже не обязателен и может отсутствовать. Реально же он, конечно, объявляется и содержит список глобальных переменных программы и их типы. Блоков VAR может быть несколько, но переменные в них не должны повторяться.

Если в программе описываются процедуры и (или) функции, то их определение должно предшествовать основному блоку. В любом случае должны быть описаны заголовки процедур и функций. Обычно заголовком сразу следует реализация (тело) процедуры (функции), но они могут быть и разнесены внутри программы. Если процедура или функция объявляется как внешняя, то ее тело вообще будет отсутствовать в тексте на Паскале. Библиотечные процедуры и функции, подсоединяемые директивой USES, не описываются в тексте, а только используются.

Основной блок - это собственно программа, использующая все, что было описано и объявлено. Он обязательно начинается словом BEGIN и заканчивается END с точкой. После основного блока, вернее после завершающей его точки, любой текст игнорируется. Поэтому основной блок всегда замыкает программу.

Язык Турбо Паскаль предоставляет гораздо большую гибкость в организации текста программы, чем стандарт языка: структура программы на рис. 3.2 более читаема и удобна, чем жесткая последовательность блоков на рис. 3.1.

Существуют, однако, ограничения на перемещения блоков в программе. Программа компилируется последовательно, и все что в

- 54 -

| PROGRAM Сложная_программа;

| USES

| Подключаемые библиотеки (модули);

| CONST Константы и переменные для

| VAR выполнения математических расчетов

| Определения процедур и функций

| математических расчетов

| CONST Константы, типы и переменные,

| TYPE нужные для графического представления

| VAR результатов расчетов

| Определения процедур и функций

| построения графиков

| LABEL Метки, константы и переменные,

| CONST используемые только в основном

| VAR блоке программы

| BEGIN

| Основной блок программы

| END.

Рис. 3.2

ней вводится, должно быть объявлено, до того как будет использовано. Так, переменные из самого нижнего блока VAR (см. рис. 3.2) будут недоступны в определяемых выше процедурах. Попытка использовать их в процедурах вызовет ошибку и остановку компиляции. Исправить такую ошибку просто: надо перенести нужные переменные в блок VAR перед процедурами.

Компилятор Турбо Паскаля накладывает некоторые ограничения на текст программ. Так, длина строки не может превысить 126 символов, а объем файла программы (текста) - 64K (максимально).

3.3. Комментарии и ключи компиляции

Кроме конструкций языка, программа может содержать комментарии и ключи компиляции. Комментарии - это произвольный текст в любом месте программы, заключенный в фигурные скобки:

{ текст комментария }

или в круглые скобки со знаком умножения (звездочкой):

(* текст комментария *)

- 55 -

между скобками и звездочкой не должно быть пробелов. Комментарии не могут пересекать друг друга:

{ пример пересечения (* комментариев } - так нельзя *),

но могут быть вложенными. При этом внешний и внутренний комментарии должны быть заключены в разные скобки:

(* внешний охватывает { внутренний } комментарий *)

Длина комментария не ограничивается одной строкой. Можно, например, закомментировать целый кусок текста:

{

много

строк

комментариев

}

Турбо Паскаль позволяет программе (тексту) управлять режимом компиляции: включать или выключать контроль ошибок, использовать или эмулировать математический сопроцессор, изменять распределение памяти и др. Для изменения режима используются ключи компиляции: специальные комментарии, содержащие символ "$" и букву-ключ с последующим знаком "+" (включить режим) или "-" (выключить). Например:

{$R-} отключить проверку диапазонов индексов массивов;

{$N+} использовать сопроцессор 80Х87 и т.д.

Список ключей компиляции приведен в Приложении 2. Можно объединять ключи в один комментарий:

{$N+,R-}

Открывающие скобки, символ "$" и ключ должны быть написаны без пробелов между ними. Подобные конструкции можно вставлять в программу, и при компиляции она сама будет задавать режим работы компилятора. Ключи подразделяются на глобальные (раз установленный режим уже не может измениться) или локальные (можно изменять режимы для разных частей программы). Глобальные ключи должны стоять в начале программы, а локальные - где угодно программисту. Стартовые значения ключей (значения по умолчанию) задаются в среде программирования посредством меню Options/Compiler.

Некоторые ключи задают не режим, а компоновку программы из внешних составных частей. Таков, например, ключ

{$I ИмяФайлаВключения}

- 56 -

называемый командой включения в программу внешнего текстового файла. Обратите внимание на отсутствие знаков "+" или "-". Вместо них стоит пробел и имя файла. Эта команда заставляет компилятор считать заданный внешний файл частью обрабатываемой программы, т.е. отлаженные законченные блоки текста могут быть записаны на диск и заменены в программе на команды их включения. Это немного замедляет процесс компиляции, но может сэкономить массу места в программе, так как последняя превращается в "цепочку" различных файлов на диске. Примеры задания включения файлов-блоков:

{$I incproc.pas}, или, что то же самое,

{$I incproc},

{$I c:\pascal\pas\graf.inc},

{$I ..\USER\Block1.blk}

Текст включаемого блока должен удовлетворять двум условиям: будучи подставленным на место соответствующей команды {$I...}, он обязан вписаться в структуру и смысл программы без ошибок и должен содержать законченный смысловой фрагмент. Последнее означает, что блок от BEGIN до END (например, тело процедуры) должен храниться целиком в одном файле.

Включаемые тексты сами могут содержать команды {$I...}, вставляющие как бы уже дважды вложенные тексты, а те, в свою очередь, тоже могут содержать директивы {$I...}. Максимальный уровень подобной вложенности равен восьми.

Кроме текстов, можно включать коды в формате OBJ, полученные другими компиляторами или утилитами. Включаемые коды, конечно, не компилируются, но подключаются к выполнимому коду программы на этапе компоновки. В них должны содержаться реализации внешних процедур и (или) функций. Включение происходит почти так же, как и для текстовых блоков:

{$L code.obj}

или, что то же самое,

{$L code} {$L c:\pascal\obj\grafproc.obj}

Обычно после директивы {$L...} в тексте программы сразу ставятся описания внешних процедур и функций, реализованных в подключенном коде.

К той же серии компонующих структуру программы ключей можно отнести команду объявления оверлейных (перекрывающихся) наборов процедур и функций:

- 57 -

{$O ИмяОверлейногоМодуляНаДиске}

Подробную информацию об оверлейных структурах смотрите в гл. 18 "Модуль Overlay".

3.4. Условная компиляция программ

Принципы условной компиляции тесно связаны с построением программ на Турбо Паскале. Разрешая группировать блоки VAR, TYPE и прочие по функциональным признакам и размещать их в различных местах программы, Турбо Паскаль предоставляет еще и средства управления порядком компиляции (не путать с режимами!). Любой, кто отлаживал свои программы, знает, как исключить из работы фрагмент текста: надо оформить его как комментарий или обойти оператором перехода типа GOTO. Но все это нарушает исходный текст. Турбо Паскаль вводит особый набор ключей компиляции для решения подобных вопросов. Их немного:

{$DEFINE КлючевоеСлово } задание ключевого слова,

{$UNDEF КлючевоеСлово } сброс ключевого слова,

{$IFDEF КлючевоеСлово } проверка задания слова,

{$IFNDEF КлючевоеСлово } проверка отсутствия задания ключевого слова,

{$IFOPT КлючИзнак } проверка режима компиляции,

{$ELSE) альтернативная ветвь,

{$ENDIF) обязательный конец условия.

Ключ $DEFINE определяет (задает) условное ключевое слово, которое становится активным и известным компилятору и по которому будут срабатывать другие ключи: $IFDEF - проверка условия активности этого слова и $IFNDEF - проверка отсутствия его задания (рис. 3.3).

Назад Дальше