- •Часть I. Язык Borland Pascal Глава 1. Что такое программа Borland Pascal?
- •Программа Borland Pascal
- •Процедуры и функции
- •Операторы
- •Выражения
- •Лексемы
- •Типы, переменные, константы и типизированные константы
- •Компоновка частей
- •Синтаксические диаграммы
- •Глава 2.Лексемы
- •Специальные символы
- •Зарезервированные слова и стандартные директивы Borland Pascal
- •Идентификаторы
- •Строки символов
- •Комментарии
- •Строки программы
- •Глава 3. Константы
- •Глава 4. Типы
- •Простые типы
- •Порядковые типы
- •Целочисленные типы
- •Булевские типы
- •Символьный тип (char)
- •Перечислимые типы
- •Отрезки типа
- •Вещественные типы
- •Программная поддержка чисел с плавающей точкой
- •Аппаратная поддержка чисел с плавающей точкой
- •Строковые типы
- •Структурные типы
- •Типы массив
- •Типы запись
- •Объектные типы
- •Компоненты и область действия
- •Виртуальные методы
- •Динамические методы
- •Создание экземпляров объектов
- •Активизация методов
- •Активизация уточненных методов
- •Множественные типы
- •Файловые типы
- •Ссылочные типы
- •Тип Pointer
- •Тип pChar
- •Процедурные типы
- •Процедурные значения
- •Совместимость типов
- •Тождественные и совместимые типы
- •Тождественность типов
- •Совместимость типов
- •Совместимость по присваиванию
- •Раздел описания типов
- •Глава 5. Переменные и типизированные константы Описания переменных
- •Сегмент данных
- •Сегмент стека
- •Абсолютные переменные
- •Ссылки на переменные
- •Квалификаторы
- •Массивы, строки и индексы
- •Записи и десигнаторы полей
- •Десигнаторы компонентов объекта
- •Переменные-указатели и динамические переменные
- •Приведение типов переменных
- •Типизированные константы
- •Константы простого типа
- •Константы строкового типа
- •Константы структурного типа
- •Константы типа массив
- •Константы типа запись
- •Константы объектного типа
- •Константы множественного типа
- •Константы ссылочного типа
- •Константы процедурного типа
- •Глава 6. Выражения
- •Синтаксис выражений
- •Операции
- •Арифметические операции
- •Унарные арифметические операции
- •Логические операции
- •Булевские операции
- •Операция со строками
- •Операции над символьными указателями
- •Операции над множествами
- •Операции отношения
- •Сравнение простых типов
- •Сравнение строк
- •Сравнение упакованных строк
- •Сравнение указателей
- •Сравнение символьных указателей
- •Сравнение множеств
- •Проверка на принадлежность к множеству
- •Операция @
- •Использование операции @ для переменной
- •Использование операции @ для процедуры или функции или метода
- •Вызовы функции
- •Описатели множества
- •Приведение типа значений
- •Процедурные типы в выражениях
- •Глава 7. Операторы
- •Простые операторым
- •Оператор присваивания
- •Операторы процедуры
- •Операторы перехода
- •Структурные операторы
- •Составные операторы
- •Условные операторы
- •Оператор условия (if)
- •Оператор варианта (case)
- •Оператор цикла
- •Оператор цикла с постусловием (repeat)
- •Операторы цикла с предусловием (while)
- •Операторы цикла с параметром (for)
- •Оператор with
- •Глава 8. Блоки, локальность и область действия
- •Синтаксис
- •Правила для области действия
- •Область действия для блока
- •Область действия записи
- •Область действия объекта
- •Область действия модуля
- •Глава 9. Процедуры и функции
- •Описания near и far
- •Описания export
- •Описания interrupt
- •Описание forward
- •Описания external
- •Описания assembler
- •Описания inline
- •Описания функций
- •Описания методов
- •Конструкторы и деструкторы
- •Восстановление ошибок конструктора
- •Параметры
- •Параметры-значения
- •Параметры-константы
- •Параметры-переменные
- •Нетипизированные параметры
- •Открытые параметры
- •Открытые строковые параметры
- •Открытые параметры-массивы
- •Динамические переменные объектного типа
- •Процедурные переменные
- •Параметры процедурного типа
- •Глава 10. Программы и модули Синтаксис программ
- •Заголовок программы
- •Оператор uses
- •Синтаксис модулей
- •Заголовок модуля
- •Интерфейсная секция
- •Секция реализации
- •Секция инициализации
- •Косвенные ссылки на модули
- •Перекрестные ссылки на модули
- •Совместное использование описаний
- •Глава 11. Динамически компонуемые библиотеки
- •Что такое dll?
- •Использование dll
- •Модули импорта
- •Статический и динамический импорт
- •Написание dll
- •Директива процедуры export
- •Оператор exports
- •Код инициализации библиотеки
- •Замечания по программированию библиотек
- •Глобальные переменные в dll
- •Глобальные переменные и файлы в dll
- •Dll и модуль System
- •Ошибки этапа выполнения в dll
- •Dll и сегменты стека
- •Создание совместно используемых dll
- •Часть II. Глава 12. Библиотеки исполняющей системы
- •Модули Borland Pascal
- •Модуль System
- •Модуль Dos и WinDos
- •Модуль Crt
- •Модуль WinCrt
- •Модули Turbo3 и Graph3
- •Модули WinTypes и WinProcs
- •Модуль Win31
- •Модуль WinApi
- •Модули, поддерживающие Windows 3.1
- •Глава 13. Стандартные процедуры и функции
- •Процедуры управления работой программы
- •Функции преобразования
- •Арифметические функции
- •Порядковые процедуры и функции
- •Строковые процедуры и функции
- •Процедуры и функции динамического распределения памяти
- •Функции для работы с указателями и адресами
- •Прочие процедуры и функции
- •Предописанные переменные
- •Глава 14. Ввод и вывод
- •Файловый ввод-вывод
- •Текстовые файлы
- •Нетипизированные файлы
- •Переменная FileMode
- •Устройства в Borland Pascal
- •Устройства dos
- •Устройство cоn
- •Устройства lрt1, lрt2 и lрt3
- •Устройства cом1 и cом2
- •Устройство nul
- •Устройства, предназначенные для текстовых файлов
- •Ввод и вывод с помощью модуля Crt
- •Использование модуля crt
- •Окна crt
- •Специальные символы
- •Ввод строк
- •Процедуры и функции модуля Crt
- •Константы и переменные модуля Crt
- •Ввод и вывод с помощью модуля WinCrt
- •Использование модуля WinCrt
- •Специальные символы
- •Ввод строк
- •Процедуры и функции
- •Переменные модуля WinCrt
- •Печать из программы Windows
- •Изменение заголовков
- •Изменение шрифтов
- •Остановка задания печати
- •Специальные символы
- •Процедуры и функции модуля WinPrn
- •Функция Open
- •Функция InOut
- •Функция Flush
- •Функция Clоsе
- •Глава 15. Использование сопроцессора 80x87
- •Типы данных процессора 80x87
- •Арифметические операции с повышенной точностью
- •Сравнение вещественных чисел
- •Стек вычислений сопроцессора 80x87
- •Запись вещественных чисел при использовании сопроцессора 80x87
- •Модули, в которых используется сопроцессор 80x87
- •Распознавание сопроцессора 80х87 в программах dos
- •Распознавание сопроцессора 80x87 в программе Windows
- •Использование эмуляции сопроцессора 80x87 на языке ассемблера
- •Глава 16. Модуль Dоs
- •Процедуры и функции модуля Dos
- •Константы, типы и переменные модуля Dos
- •Переменные модуля Dos
- •Процедуры и функции модуля WinDos
- •Константы, типы и переменные модуля WinDos
- •Переменные модуля WinDos
- •Глава 17. Программирование в защищенном режиме dos
- •Что такое защищенный режим?
- •Расширения Borland защищенного режима dos
- •Dpmi-сервер
- •Администратор этапа выполнения
- •Разработка прикладных программ dos защищенного режима
- •Надежное программирование в защищенном режиме
- •Загрузка в сегментные регистры недопустимых значений
- •Функция Ptr и массивы Mem
- •Абсолютные переменные
- •Операции с сегментами
- •Использование сегментных регистров в качестве временных переменных
- •Доступ к памяти вне границ сегмента
- •Запись в сегмент кода
- •Разыменование указателей nil
- •Сегменты кода и данных
- •Управление динамически распределяемой памятью
- •Предопределенные селекторы
- •Переменная SelectorInc
- •Модуль WinApi
- •Управление памятью
- •Подпрограммы управления памятью api
- •Управление модулем
- •Управление ресурсами
- •Управление селектором
- •Другие подпрограммы api
- •Прямой доступ к dpmi-серверу
- •Компиляция прикладной программы защищенного режима
- •Выполнение программы защищенного режима dos
- •Управление объемом используемой rtm памяти
- •Глава 18. Строки с завершающим нулем
- •Что такое строка с завершающим нулем?
- •Функции модуля Strings
- •Использование строк с завершающим нулем
- •Символьные указатели и строковые литералы
- •Символьные указатели и символьные массивы
- •Индексирование символьного указателя
- •Операции с символьными указателями
- •Строки с завершающим нулем и стандартные процедуры
- •Пример использования функций с завершающим нулем
- •Глава 19. Использование графического интерфейса Borland
- •Драйверы
- •Поддержка устройства ibm 8514
- •Система координат
- •Текущий указатель
- •Графические изображения и их виды
- •Области просмотра и двоичные образы
- •Поддержка страниц и цветов
- •Обработка ошибок
- •Начало работы
- •Пользовательские программы управления динамически распределяемой памятью
- •Процедуры модуля Graph
- •Константы, типы и переменные модуля Graph
- •Константы
- •Переменные
- •Глава 20. Использование оверлеев
- •Администратор оверлеев
- •Управление оверлейным буфером
- •Процедуры и функции модуля Overlay
- •Коды результата
- •Разработка программ с оверлеями
- •Генерация оверлейного кода
- •Требование использования дальнего типа вызовов
- •Инициализация администратора оверлеев
- •Разделы инициализации в оверлейных модулях
- •Что не должно использоваться в качестве оверлеев
- •Отладка оверлеев
- •Внешние программы в оверлеях
- •Задание функции чтения оверлея
- •Оверлеи в файлах .Exe
- •Часть III. В среде Borland Pascal Глава 21. Использование памяти
- •Использование памяти программами реального режима dos
- •Администратор динамически распределяемой области памяти dos
- •Методы освобождения областей динамически распределяемой памяти
- •Список свободных блоков
- •Переменная HeapError
- •Использование памяти в программах dos защищенного режима
- •Сегменты кода
- •Атрибуты сегмента
- •Атрибуты moveable или fixed
- •Атрибуты preload или demandload
- •Атрибуты discardable или permament
- •Сегменты данных и стека
- •Изменение атрибутов
- •Администратор динамически распределяемой области памяти dos
- •Переменная HeapError
- •Использование памяти в программах Windows
- •Атрибуты сегментов
- •Атрибуты moveable или fixed
- •Атрибуты preload или demandload
- •Атрибуты discardable или permanent
- •Изменение атрибутов
- •Сегмент локальных динамических данных
- •Администратор динамически распределяемой области памяти
- •Переменная HeapError
- •Форматы внутреннего представления данных
- •Целочисленные типы
- •Символьный тип
- •Булевский тип
- •Перечислимый тип
- •Типы с плавающей точкой
- •Вещественный тип
- •Тип числа с одинарной точностью
- •Тип числа с двойной точностью
- •Тип числа с повышенной точностью
- •Сложный тип
- •Значения типа указатель
- •Значения строкового типа
- •Значения множественного типа
- •Значения типа массив
- •Значения типа запись
- •Объектные типы
- •Значения файлового типа
- •Процедурные типы
- •Прямой доступ к памяти
- •Прямой доступ к портам
- •Глава 22. Вопросы управления
- •Соглашения по вызовам
- •Параметры-переменные
- •Параметры-значения
- •Открытые строковые параметры
- •Результаты функций
- •Ближние и дальние типы вызовов
- •Вложенные процедуры и функции
- •Соглашения о вызовах методов
- •Вызовы виртуальных методов
- •Вызовы динамических методов
- •Конструкторы и деструкторы
- •Стандартный код входа и выхода
- •Соглашения по сохранению регистров
- •Процедуры выхода
- •Обработка прерываний
- •Разработка процедур обработки прерываний
- •Глава 23. Автоматическая оптимизация
- •Свертывание констант
- •Слияние констант
- •Вычисление по короткой схеме
- •Параметры-константы
- •Устранение избыточной загрузки указателей
- •Подстановка констант множественного типа
- •Малые множества
- •Порядок вычисления
- •Проверка на допустимость границ
- •Использование сдвига вместо умножения
- •Автоматическое выравнивание на границу слова
- •Удаление неиспользуемого кода
- •Эффективная компоновка
- •Часть IV. Использование Borland Pascal с языком ассемблера Глава 24. Встроенный ассемблер
- •Оператор asm
- •Использование регистров
- •Синтаксис операторa ассемблера
- •Размер инструкции ret
- •Автоматическое определение размера перехода
- •Директивы ассемблера
- •Операнды
- •Выражения
- •Различия между выражениями Паскаля и ассемблера
- •Элементы выражений
- •Константы
- •Числовые константы
- •Строковые константы
- •Регистры
- •Идентификаторы
- •Классы выражений
- •Типы выражений
- •Операции в выражениях
- •Процедуры и функции ассемблера
- •Глава 25. Компоновка с программами на языке ассемблера
- •Турбо Ассемблер и Borland Pascal
- •Примеры программ на языке ассемблера
- •Методы на языке ассемблера
- •Включаемый машинный код
- •Операторы Inline
- •Директивы inline
Управление оверлейным буфером
Оверлейный буфер Borland Pascal лучше всего описывается в
виде кольцевого буфера, в котором имеется указатель начала и ука-
затель конца. Оверлеи всегда загружаются в начало буфера. При
этом более "старые" оверлеи смещаются к его концу. Когда буфер
заполняется (то есть между его началом и концом не будет доста-
точно свободного пространства), то оверлеи в конце буфера выгру-
жаются (освобождаются), и освобождается место для новых оверлеев.
Поскольку обычная память по своей природе не имеет характера
кольцевого буфера, действительная реализация кольцевого буфера
предусматривает несколько шагов, обеспечивающих, чтобы буфер
действительно стал кольцевым. Этот процесс показан на Рис. 20.1.
Здесь изображен процесс загрузки оверлеев в первоначально пустой
оверлейный буфер. Сначала загружается оверлей A, затем - оверлей
B, потом C, и, наконец, D. Заштрихованные области показывают сво-
бодное пространство в буфере.
Шаг 1 Шаг 2
------------- -------------
¦ ---------- ¦ ¦ ---------- ¦
¦ ---------- ¦ ¦ ---------- ¦
¦ ---------- ¦ ¦ ---------- ¦
¦ ---------- ¦ Начало ---> +------------+
¦ ---------- ¦ ¦ Оверлей B ¦
Начало ----> +------------+ +------------+
¦ Оверлей А ¦ ¦ Оверлей А ¦
Конец ----> L------------- Конец ---> L-------------
Шаг 3 Шаг 4
------------- -------------
¦ ---------- ¦ ¦ Оверлей С ¦
¦ ---------- ¦ +------------+
Начало ----> +------------+ ¦ Оверлей В ¦
¦ Оверлей С ¦ Конец ---> +------------+
+------------+ ¦ ---------- ¦
¦ Оверлей В ¦ ¦ ---------- ¦
+------------+ Начало ---> +------------+
¦ Оверлей А ¦ ¦ Оверлей D ¦
Конец ----> L------------- L-------------
Рис. 20.1 Загрузка и освобождение оверлеев.
Как можно заметить, при переходе от шага 3 к шагу 4 происхо-
дит несколько интересных моментов. Во-первых, заголовок начала
перемещается к концу оверлейного буфера, приводя к тому, что под-
система управления оверлеями смещает все загруженные оверлеи (и
указатель конца) вверх. Это смещение необходимо, чтобы свободная
область всегда находилась между указателем начала и указателем
конца. Во-вторых, чтобы загрузить оверлей D, подсистеме управле-
ния оверлеями приходится выгрузить из конца буфера оверлей A. В
этом случае оверлей A является оверлеем, которых был загружен
раньше всех, поэтому прежде чем продолжить работу, лучше всего
выгрузить именно его. Администратор оверлеев продолжает освобож-
дать оверлеи в конце буфера, освобождая место в его начале для
новых оверлеев. При этом каждый раз повторяется операция смещения
и переноса указателя начала.
Этот режим операция используется администратором оверлеев
Borland Pascal 0 по умолчанию. Однако, Borland Pascal также поз-
воляет вам использовать возможность оптимизации алгоритма управ-
ления оверлеями.
Предположим, что оверлей A содержит некоторые часто исполь-
зуемые подпрограммы. Хотя некоторые из этих подпрограмм использу-
ются все время, существует вероятность, что оверлей A будет
выгружен из буфера и вскоре загружен в него снова. Проблема здесь
состоит в том, что подсистема управления оверлеями ничего не зна-
ет о частоте вызовов подпрограмм в модуле A. Она знает только,
что если при обращении к подпрограмме оверлея A его нет в памяти,
то нужно загрузить этот оверлей. Одно из решений здесь может сос-
тоять в том, чтобы перехватывать каждое обращение к подпрограммам
оверлея A и затем при каждом вызове перемещать оверлей A в начало
оверлейного буфера, чтобы было отражено его новое состояние, как
последнего использованного оверлея. Такой перехват вызовов к со-
жалению будет слишком непроизводительным в смысле скорости выпол-
нения, и в некоторых случаях может даже более замедлить работу
прикладной программы, чем дополнительная операция загрузки овер-
лея.
В Borland Pascal предусматривается компромиссное решение,
которое практически не увеличивает непроизводительные расходы и
обеспечивает высокую степень успеха в идентификации последних ис-
пользованных оверлеев, которые не следуют разгружать. Когда овер-
лей приближается к концу оверлейного буфера, то начинается его
"тестирование". Если в ходе этого "тестирования" выполняется вы-
зов подпрограммы данного оверлея, "приговор" ему будет отменен, и
он не будет разгружен, когда достигнет конца оверлейного буфера.
Вместо этого он просто перемещается в начало буфера, и начинается
новые цикл его перемещения по кольцевому оверлейному буферу. Ес-
ли, с другой стороны, в процессе "тестирования" обращений к овер-
лею не будет, то оверлей при достижении конца буфера выгружается.
Схема тестирования (проб/отказов) приводит к тому, что часто
используемые оверлеи будут сохраняться в оверлейном буфере за
счет того, что будет перехватываться почти каждый вызов, когда
оверлей приближается к концу оверлейного буфера.
Механизмом тестирования управляют две новые подпрограммы
подсистемы управления оверлеями - OvrSetRetry и OvrGetRetry.
Подпрограмма OvrGetRetry устанавливает размер области в оверлей-
ном буфере, которую нужно тестировать, а OvrGetRetry возвращает
текущее состояние. Если оверлей смещается в последние OvrGetRetry
байт перед концом оверлейного буфера, то он будет автоматически
подвергаться тестированию. Все свободное пространство в оверлей-
ном буфере рассматривается, как часть пробной области (области
тестирования).