- •Часть I. Язык Borland Pascal...................................12
- •Глава 1. Что такое программа Borland Pascal?...................12
- •Глава 2. Лексемы...............................................22
- •Глава 3. Константы.............................................32
- •Глава 4. Типы..................................................34
- •Глава 5. Переменные и типизированные константы.................72
- •Глава 6. Выражения.............................................93
- •Глава 7. Операторы............................................117
- •Глава 8. Блоки, локальность и область действия................133
- •Глава 9. Процедуры и функции..................................139
- •Глава 10. Программы и модули..................................170
- •Глава 11. Динамически компонуемые библиотеки..................180
- •Глава 12. Библиотеки исполняющей системы......................194
- •Глава 13. Стандартные процедуры и функции.....................199
- •Глава 14. Ввод и вывод........................................215
- •Глава 15. Использование сопроцессора 80x87....................248
- •Глава 16. Модуль Dоs..........................................259
- •Глава 17. Программирование в защищенном режиме dos............270
- •Глава 18. Строки с завершающим нулем..........................297
- •Глава 19. Использование графического интерфейса Borland.......308
- •Глава 20. Использование оверлеев..............................329
- •Часть III. В среде Borland Pascal.............................348
- •Глава 21. Использование памяти................................348
- •Глава 22. Вопросы управления..................................388
- •Глава 23. Автоматическая оптимизация..........................405
- •Часть IV. Использование Borland Pascal с языком ассемблера....411
- •Глава 24. Встроенный ассемблер................................411
- •Глава 25. Компоновка с программами на языке ассемблера........437
- •Часть II "Библиотеки исполняющей системы" содержит информа-
- •Часть I. Язык Borland Pascal
- •Глава 1. Что такое программа Borland Pascal?
- •Глава 2. Лексемы
- •Глава 3. Константы
- •Глава 4. Типы
- •Глава 5. Переменные и типизированные константы
- •Глава 6. Выражения
- •Глава 7. Операторы
- •Глава 8. Блоки, локальность и область действия
- •Глава 9. Процедуры и функции
- •Глава 10. Программы и модули
- •Глава 11. Динамически компонуемые библиотеки
- •Часть II. Глава 12. Библиотеки исполняющей системы
- •Глава 13. Стандартные процедуры и функции
- •Глава 14. Ввод и вывод
- •Глава 15. Использование сопроцессора 80x87
- •Глава 16. Модуль Dоs
- •Глава 17. Программирование в защищенном режиме dos
- •Глава 18. Строки с завершающим нулем
- •Глава 19. Использование графического интерфейса Borland
- •Глава 20. Использование оверлеев
- •Часть III. В среде Borland Pascal
- •Глава 21. Использование памяти
- •Глава 22. Вопросы управления
- •Глава 23. Автоматическая оптимизация
- •Часть IV. Использование Borland Pascal с языком ассемблера
- •Глава 24. Встроенный ассемблер
- •Глава 25. Компоновка с программами на языке ассемблера
Часть II "Библиотеки исполняющей системы" содержит информа-
цию о стандартных модулях, образующих библиотеку исполняющей сис-
темы, и о том, как их использовать. Здесь рассказывается также,
как писать программы для защищенного режима DOS.
В Части III "В среде Borland Pascal" дается техническая ин-
формация для продвинутых пользователей. Здесь рассказывается:
- об использовании памяти в Borland Pascal;
- о том, как в Borland Pascal реализовано управление прог-
раммой;
- о деталях по вводу и выводу;
- об оптимизации вашего кода.
В Части IV "Использование Borland Pascal с языком ассембле-
ра" поясняется, как использовать встроенный ассемблер и как ком-
поновать ваши программы Паскаля с кодом Турбо Ассемблера.
B.Pascal 7 & Objects/LR - 12 -
───────────────────────────────────────────────────────────────────────
Часть I. Язык Borland Pascal
─────────────────────────────────────────────────────────────────
Глава 1. Что такое программа Borland Pascal?
─────────────────────────────────────────────────────────────────
Следующие несколько глав посвящены формальному определению
языка Borland Pascal. В каждой главе обсуждается один из элемен-
тов Borland Pascal. Совместно эти элементы образуют программу
Borland Pascal.
Однако, изучая части, трудно понять целое. В данной главе
дается общий обзор программы Borland Pascal, опуская детали.
Здесь приводится краткое описание каждого элемента программы, а
затем показывается, как все это компонуется вместе. Подробности
элементов языка освещаются главах 2 - 11.
B.Pascal 7 & Objects/LR - 13 -
Программа Borland Pascal
─────────────────────────────────────────────────────────────────
В своей простейшей форме программа Borland Pascal состоит из
заголовка программы, который именует программу, и основного прог-
раммного блока, выполняющего назначение программы. В основном
программном блоке находится секция кода, заключенная между ключе-
выми словами begin и end. Приведем простейшую программу, иллюст-
рирующую эти принципы:
program Privet;
begin
Writeln('Добро пожаловать в Borland Pascal');
end.
Первая строка - это заголовок программы, который именует
данную программу. Остальная часть программы - это исходный код,
который начинается ключевым словом begin и заканчивается end. Хо-
тя данная конкретная программа содержит только одну строку, их
может быть много. В любой программе Borland Pascal все действия
выполняются между begin и end.
Процедуры и функции
─────────────────────────────────────────────────────────────────
Код между последними операторами begin и end программы уп-
равляет логикой программы. В очень простой программе в этой сек-
ции кода может содержаться все, что вам нужно. В более крупных и
сложных программах размещение в этой секции всего программного
кода может затруднить чтение и понимание программы. К тому же ее
будет труднее разрабатывать.
Процедуры и функции позволяют разделить логику программы на
более мелкие и управляемые фрагменты и аналогичны подпрограммам в
других языках. Как и в основном блоке программы, все действия в
процедурах и функциях заключаются в begin и end. Каждый из этих
сегментов кода выполняет конкретную задачу.
┌──────────────────────────────────────────────────────────┐
│ Процедура или функция │
│┌────────────────────────────────────────────────────────┐│
││ Заголовок процедуры или функции ││
│└────────────────────────────────────────────────────────┘│
│┌────────────────────────────────────────────────────────┐│
││ Блок процедуры или функциями ││
││ begin ││
││┌──────────────────────────────────────────────────────┐││
│││ Логика │││
││└──────────────────────────────────────────────────────┘││
││ end; ││
│└────────────────────────────────────────────────────────┘│
└──────────────────────────────────────────────────────────┘
B.Pascal 7 & Objects/LR - 14 -
Рис. 1.1 Диаграмма процедуры или функции.
Если вы обнаружите, что в вашей диаграмме одни и те же дейс-
твия выполняются многократно, такую логику желательно выделить в
процедуру или функцию. Вы можете один раз записать этот код в
процедуре или функции, а затем многократно вызывать его в прог-
рамме.
Приведем пример функции. Следующая функция GetNumber получа-
ет число от пользователя:
function GetNumber: Real;
var
Responce: Real;
begin
Write('Введите число: ');
Readln(Response);
GetNumber := Response;
end;
Процедура или функция должна содержаться в программе перед
секцией основного кода. В основном коде она может затем использо-
ваться (вызываться).
┌──────────────────────────────────────────────────────────┐
│ Процедура или функция │
│┌────────────────────────────────────────────────────────┐│
││ Заголовок процедуры или функции ││
│└────────────────────────────────────────────────────────┘│
│┌────────────────────────────────────────────────────────┐│
││ Блок процедуры или функциями ││
││┌──────────────────────────────────────────────────────┐││
│││ Процедуры или функции (0 или более) │││
││└──────────────────────────────────────────────────────┘││
││ begin ││
││┌──────────────────────────────────────────────────────┐││
│││ Логика │││
││└──────────────────────────────────────────────────────┘││
││ end; ││
│└────────────────────────────────────────────────────────┘│
└──────────────────────────────────────────────────────────┘
Рис. 1.2 Простая программа на Паскале.
В следующем примере дается набросок программы, в которой ис-
пользуется функция GetNumber. Программист разделил логику прог-
раммы на три задачи:
1. Получение числа от пользователя.
2. Выполнение с этим числом необходимых вычислений.
3. Печать отчета.
B.Pascal 7 & Objects/LR - 15 -
Основная логика программы заключена в последнем блоке
begin..end.
Program Report;
var
A: Real;
{ другие описания }
.
.
.
function GetNumber: Real;
var
Responce: Real;
begin
Write('Введите число: ');
Readln(Response);
GetNumber := Response;
end;
procedure Calculate(X: Real);
.
.
.
procedure PrintReport;
.
.
.
begin
A: = GetNumber;
Calculate(A);
PrintReport;
end.
Основная логика программы достаточно проста для понимания.
Все детали убраны в тела процедур и функций. Использование проце-
дур и функций позволяет вам рассматривать программу более удобным
и модульным способом.
Операторы
─────────────────────────────────────────────────────────────────
Исходный код между begin и end содержит операторы, которые
описывают выполняемые программой действия. Это называются опера-
торной частью программы. Приведем примеры операторов:
A := B + C; { присвоить значение }
Calculate(Length, Height); { активизировать процедуру }
if X < 2 then { оператор условия }
Answer := X * Y;
B.Pascal 7 & Objects/LR - 16 -
begin { составной оператор }
X := 3;
Y := 4;
Z := 5;
end;
while not EOF(InFile) do { оператор цикла }
begin
ReadLn(InFile, Line);
Process(Line);
end;
В простых операторах можно присваивать значение, активизиро-
вать процедуру или функцию или передавать управление на другую
часть кода. Структурные операторы могут быть составными и содер-
жать несколько операторов, оператор цикла или оператор условия,
управляющий логикой программы, а также операторы with, упрощающие
доступ к данным в записи.
Выражения
─────────────────────────────────────────────────────────────────
Оператор Паскаля состоит из выражений. Выражения оператора
могут состоять из операндов и операций. Обычно в выражениях вы-
полняется сравнение либо арифметические, логические или булевские
операции.
Выражения Паскаля могут состоять из более простых выражений.
О комбинации операндов и операций вы можете прочитать в Главе 6.
Они могут быть достаточно сложными. Приведем некоторые примеры
выражений:
X + Y
Done <> Error
I <= Length
-X
B.Pascal 7 & Objects/LR - 17 -
Лексемы
─────────────────────────────────────────────────────────────────
Лексемы - это наименьшие значащие элементы в программе Пас-
каля. Они образуются операндами и операциями выражений. Лексемы -
это специальные символы, зарезервированные слова, идентификаторы,
метки и строковые константы. Приведем примеры лексем Паскаля:
function { зарезервированное слово }
( { специальный символ }
:= { специальный символ }
Calculate { идентификатор процедуры }
9 { число }
Приведем пример, из которого вы можете видеть, что операторы
состоят из выражений, которые в свою очередь состоят из лексем.
┌──────────────────────────────────────────────────────────┐
│ Операторы (1 или более) │
│┌────────────────────────────────────────────────────────┐│
││ Выражения (1 или более) ││
││┌──────────────────────────────────────────────────────┐││
│││ Лексемы (1 или более) │││
││└──────────────────────────────────────────────────────┘││
│└────────────────────────────────────────────────────────┘│
└──────────────────────────────────────────────────────────┘
Рис. 1.3 Диаграмма оператора.
Типы, переменные, константы и типизированные константы
─────────────────────────────────────────────────────────────────
Переменная может содержать изменяемое значение. Каждая пере-
менная должна иметь тип. Тип переменной определяет множество зна-
чений, которые может иметь переменная.
Например, в следующей программе описываются переменные X и
Y, имеющие тип Integer. Таким образом, X и Y могут содержать
только целые значения (числа). Если в вашей программе предприни-
мается попытка присвоить этим переменным значения другого типа,
Borland Pascal сообщает об ошибке.
program Example;
const
A = 12; { константа A не изменяет значения }
B: Integer = 23; { типизированная константа B получает
начальное значение }
var
X, Y: Integer; { переменные X и Y имеют тип Integer }
J: Real; { переменная J имеет тип Real }
B.Pascal 7 & Objects/LR - 18 -
begin
X := 7; { переменной X присваивается значение }
Y := 7; { переменной Y присваивается значение }
X := Y + Y; { значение переменной X изменяется }
J := 0.075; { переменной J присваивается значение
с плавающей точкой }
end.
В этой простой и не очень полезной программе X первоначально
присваивается значение 7; двумя операторами ниже ей присваивается
новое значение: Y + Y. Как можно видеть, значение переменной мо-
жет изменяться.
A - это константа. Программа назначает ей значение 12, и это
значение изменяться не может - в ходе выполнения программы оно
остается постоянным.
B представляет собой типизированную константу. Ей присваива-
ется значение при описании, но дается также тип Integer. Типизи-
рованую константу можно рассматривать как переменную с начальным
значением. Позднее программа может изменить первоначальное значе-
ние B на какое-то другое значение.
Если вы вернетесь обратно к приведенному в начале главы при-
меру кода, то увидите, что функция GetNumber имеет раздел описа-
ний, в котором описывается переменная. Процедуры и функции могут
содержать разделы описаний также как программы и модули.
B.Pascal 7 & Objects/LR - 19 -
Компоновка частей
─────────────────────────────────────────────────────────────────
Теперь, когда вы познакомились с основными компонентами
программы Borland Pascal, давайте посмотрим, как все это работает
вместе. Приведем диаграмму программы Borland Pascal:
┌──────────────────────────────────────────────────────────┐
│ Программа на Паскале │
│┌────────────────────────────────────────────────────────┐│
││ Заголовок программы ││
│└────────────────────────────────────────────────────────┘│
│┌────────────────────────────────────────────────────────┐│
││ Необязательные операторы uses ││
│└────────────────────────────────────────────────────────┘│
│┌────────────────────────────────────────────────────────┐│
││ Основной блок программы ││
││┌──────────────────────────────────────────────────────┐││
│││ Описания │││
││└──────────────────────────────────────────────────────┘││
││┌──────────────────────────────────────────────────────┐││
│││ Процедуры или функции (0 или более) │││
│││┌────────────────────────────────────────────────────┐│││
││││ Описания ││││
│││└────────────────────────────────────────────────────┘│││
│││ begin │││
│││ ┌────────────────────────────────────────────────┐│││
│││ │ Операторы (1 или более) ││││
│││ └────────────────────────────────────────────────┘│││
│││ end; │││
││└──────────────────────────────────────────────────────┘││
││ begin ││
││ ┌────────────────────────────────────────────────────┐││
││ │ Операторы (1 или более) │││
││ │┌──────────────────────────────────────────────────┐│││
││ ││ Выражения (1 или более) ││││
││ ││┌────────────────────────────────────────────────┐││││
││ │││ Лексемы (1 или более) │││││
││ ││└────────────────────────────────────────────────┘││││
││ │└──────────────────────────────────────────────────┘│││
││ └────────────────────────────────────────────────────┘││
││ end. ││
│└────────────────────────────────────────────────────────┘│
└──────────────────────────────────────────────────────────┘
Рис. 1.4 Расширенная диаграмма программы на Паскале.
Программу на Паскале составляют заголовок программы, необя-
зательный оператор uses (о нем будет рассказано позднее) и основ-
ной блок программы. В основном блоке могут присутствовать более
мелкие блоки процедур и функций. Хотя на диаграмме это не пока-
зано, процедуры им функции могут быть вложенными в другие проце-
дуры или функции. Другими словами, блоки могут содержать другие
B.Pascal 7 & Objects/LR - 20 -
блоки.
В сочетании с другими лексемами и пробелами лексемы могут
образовывать выражения, формирующие оператор. Операторы, в свою
очередь, в сочетании с разделом описаний образуют блоки основной
программы или блок в процедуре или функции.
Модули
─────────────────────────────────────────────────────────────────
Программа Borland Pascal может использовать блоки кода в
программных модулях. Модуль (unit) можно рассматривать как ми-
ни-программу, которую может использовать ваша прикладная програм-
ма. Как и программа, он имеет заголовок (который называется заго-
ловком модуля) и основной блок, ограниченный begin и end.
Основной блок любой программы Borland Pascal может включать
в себя строку, позволяющую программе использовать один или более
модулей. Например, если вы пишете программу DOS с именем Colors и
хотите изменять цвета выводимого на экран текста, то ваша прог-
рамма может использовать стандартный модуль Crt, являющийся
частью библиотеки исполняющей системы Borland Pascal:
program Colors;
uses Crt;
begin
.
.
.
end.
Строка uses Crt сообщает Borland Pascal, что нужно включить
модуль Crt в выполняемую программу. Кроме всего прочего, модуль
Crt содержит весь необходимый код для изменения цвета в вашей
программе. Путем простого включения uses Crt ваша программа может
использовать весь код, содержащийся в модуле Crt. Поэтому опера-
тор uses называют также оператором использования. Если бы вы по-
местили весь код, необходимый для реализации функциональных воз-
можностей Crt, в свою программу, это потребовало бы огромных уси-
лий и отвлекло бы вас от основной цели программы.
Библиотеки исполняющей системы Borland Pascal включают в се-
бя несколько модулей, которые вы найдете весьма полезными. Напри-
мер, благодаря использованию модулей Dos или WinDos, ваша прог-
рамма может получить доступ к нескольким подпрограммам операцион-
ной системы и подпрограммам работы с файлами.
Вы можете также писать свои собственные модули. Применяйте
их для разделения больших программ на логические связанные фраг-
менты. Программный код, который вы помещаете в модуль, может ис-
пользоваться любой программой. Вам нужно написать исходный код
только один раз, а затем вы сможете много раз его использовать.
B.Pascal 7 & Objects/LR - 21 -
Синтаксические диаграммы
─────────────────────────────────────────────────────────────────
При изучении глав 2 - 11, где определяется язык Borland
Pascal, вы встретите синтаксические диаграммы, например:
┌───┐ ┌──────────────┐ ┌───┐
константа-массив ───>│ ( ├────>│типизированная├──┬─>│ ) ├──>
└───┘ ^ │ константа │ │ └───┘
│ └──────────────┘ │
│ ┌───┐ │
└──────┤ , │<────────┘
└───┘
Чтобы прочитать диаграмму, следуйте по стрелкам. Часто
встречаются альтернативные пути: путь, начинающийся слева и за-
канчивающийся стрелкой справа, является допустимым. Путь пересе-
кает блоки, содержащие имена элементов, используемых для построе-
ния этой части синтаксиса.
Имена в прямоугольных рамках с текстом должны быть заменены
действительными конструкциями. Некоторые рамки содержат зарезер-
вированные слова, знаки операций и знаки пунктуации, то есть фак-
тические термы, используемые в программе. Имена в блоках - это
конструкции языка. Имена, написанные по-английски (например,
procedure), представляю собой зарезервированные слова и операции
Borland Pascal.
B.Pascal 7 & Objects/LR - 22 -
───────────────────────────────────────────────────────────────────────