- •Часть 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
Администратор динамически распределяемой области памяти
Windows поддерживает динамическое распределение памяти в
двух различных динамически распределяемых областях: глобальной
динамически распределяемой области и локальной динамически расп-
ределяемой области.
Примечание: Более подробно о локальной и глобальной
динамически распределяемой области рассказывается в "Руко-
водстве программиста по Windows".
Глобальная динамически распределяемая область - это пул па-
мяти, доступный для всех прикладных программ. Хотя могут выде-
ляться блоки глобальной памяти любого размера, глобальная динами-
чески распределяемая область памяти предназначена только для
"больших" областей памяти (256 байт или более). Каждый блок гло-
бальной памяти имеет избыточный размер 20 байт, и при работе в
стандартной среде Windows в улучшенном режиме 386 существует ог-
раничение в 8192 блока памяти, только некоторые из которых дос-
тупны для отдельной прикладной программы.
Локальная динамически распределяемая область памяти - это
пул памяти, доступной только для вашей прикладной программы или
библиотеки. Она расположена в верхней части сегмента данных прик-
ладной программы или библиотеки. Общий размер блоков локальной
памяти, которые могут выделяться в локальной динамически распре-
деляемой области, равен 64К, минус размер стека прикладной прог-
раммы и статических данных. По этой причине локальная динамически
распределяемая область памяти лучше подходит для "небольших" бло-
ков памяти (26 байт или менее). По умолчанию размер локальной ди-
намически распределяемой области равен 8К, но с помощью директивы
компилятора $M это значение можно изменить.
Примечание: Borland Pascal не поддерживает механизм
распределения памяти с помощью процедур Mark и Release, ко-
торые предусмотрены в версии для DOS.
Borland Pascal включает в себя подсистему управления динами-
чески распределяемой памятью (администратор памяти), которая реа-
лизует стандартные процедуры New, Dispose, GetMem и FreeMem. Для
всех выделений памяти подсистема динамически управления распреде-
ляемой областью памяти использует глобальную динамически распре-
деляемую область. Поскольку глобальная динамически распределяемая
область памяти имеет системное ограничение в 8192 блока (что оп-
ределенно меньше, чем может потребоваться в некоторых прикладных
задачах), подсистема управления динамически распределяемой об-
ластью памяти Borland Pascal для улучшения производительности и
обеспечения выделения существенно большего числа блоков включает
в себя алгоритм вторичного распределения сегмента.
Примечание: Более подробно об этом рассказывается в
Главе 11 "Динамически компонуемые библиотеки".
Алгоритм вторичного выделения сегмента работает следующим
образом: при распределении большого блока администратор динами-
чески распределяемой области памяти просто выделяет глобальный
блок памяти, используя подпрограмму Windows ClobalAlloc. При вы-
делении маленького блока администратор динамически распределяемой
области памяти выделяет больший блок памяти, а затем делит его на
более мелкие блоки (как требуется). При выделении "маленьких"
блоков перед тем, как администратор динамически распределяемой
области памяти выделит блок глобальной динамически распределяемой
памяти (который будет в свою очередь разбит на блоки), повторно
используются все доступные мелкие блоки.
Границу между маленькими и большими блоками определяется пе-
ременной HeapLimit. По умолчанию она имеет значение 1024 байта.
Переменная HeapBlock определяет размер, который использует под-
система управления динамически распределяемой областью памяти при
выделении блоков для вторичного разбиения. По умолчанию она имеет
значение 8192 байта. Изменять эти значения вам незачем, но если
вы решите это сделать, убедитесь что HeapBlock имеет значение по
крайней мере в четыре раза превышающее HeapLimit.
Переменная HeapAllocFlags определяет значение флагов атрибу-
тов, передаваемых GlobalAlloc, когда администратор памяти распре-
деляет глобальные блоки. В программе по умолчанию используется
значение gmem_Moveable, а в библиотеке - gmem_Moveable +
gmem_SSEShure.
Блоки глобальной памяти, выделяемые администратором динами-
чески распределяемой области памяти, всегда блокируются непос-
редственно после своего выделения (с помощью GlobalLock) немед-
ленно после своего выделения и не разблокируются, пока не будут
освобождены. Этим обеспечивается, что селекторы (адреса сегмен-
тов) блоков не изменяются. В стандартной среде Windows и улучшен-
ных режимах процессора 386 фиксированные блоки могут, тем не ме-
нее, перемещаться в физической памяти, освобождая место для дру-
гих запросов по выделению памяти, поэтому это не ухудшает произ-
водительности администратора динамически распределяемой области
памяти Borland Pascal. Однако в реальном режиме, если от Windows
требуется расширение локальной динамически распределяемой облас-
ти, администратор памяти Windows, возможно, не сможет переместить
их, чтобы выделить другие блоки. Если ваша прикладная программа
использует локальную динамически распределяемую область и должна
выполняться в реальном режиме, можно рассмотреть при выделении
блоков динамической памяти возможность использования средств
распределения памяти, предоставляемых Windows.