Компилятор Турбо Паскаля автоматически производит оптимизацию выполняемого кода по нескольким критериям:
1. Вычисление выражений, состоящих из констант числовых и символьных типов (в том числе значений функций Abs, Sqr, Succ, Pred, Odd, Lo, Hi, Swap и Ptr от констант) или из конкатенации строк, происходит на этапе компиляции. То есть присваивания A:=10+Sqr(5) и S:='a'+'b' эквивалентны по эффективности кода присваиваниям А:=35 и S:='ab'. Это верно и для выражений в вызовах процедур и функций, а также для вычисления индексов массивов.
2. Одинаковые строковые константы хранятся в ЕХЕ-файле в единственном экземпляре. Например, два или более оператора Write ('Stop—') в одной и той же части программы будут использовать одну и ту же копию строковой константы 'Stop—'.
3. По умолчанию логические выражения вычисляются по короткой схеме (в режиме SB-). Это дает минимальный и быстрый код (см. разд. 9.3).
4. Порядок вычислений выражений в случае равных приоритетов операций выбирается компилятором оптимальным (кроме логических выражений, вычисляемых слева направо).
5. По умолчанию режим проверки корректности диапазонов значений отключен (режим $R-), что уменьшает код и увеличивает быстродействие.
6. Где только возможно, компилятор заменяет целочисленное умножение на степени числа 2 операцией сдвига влево (shl).
7. По умолчанию производится оптимизация размещения данных в памяти, что задается режимом компиляции $А+.
8. В выполняемый файл не будут включены ветви программы, которые заведомо невыполнимы. Например, строка
if False then Оператор;
будет проигнорирована.
На этапе компоновки программы из ЕХЕ-файла будут автоматически удалены те процедуры, функции и разделы объявления переменных, к которым не происходит обращения в тексте программы. В частности, из этого следует, что объем ЕХЕ-файла определяется не как сумма размеров используемых им библиотек (модулей), а как сумма размеров кодов реально работающих подпрограмм и данных.
Оптимизация при компоновке включается только при компиляции программы на диск. {555}
ПРИЛОЖЕНИЕ 7
Список демонстрационных процедур и функций
Глава 6. Управляющие структуры языка
PROGRAM (рис.6.16)
Демонстрация суммирования элементов массивов любого типа
Fact, IntPower (разд. 6.9.6.4)
Примеры рекурсивного вычисления факториала и целой степени числа
UNIT Colors (рис. 6.19)
Модуль, вводящий цветовые константы
Глава 8. Обработка символов и строк
ExplodeString (рис. 8.4)
Процедура вывода строки с эффектом раздвижения и звуковым сигналом
CenterStr (рис. 8.5)
Функция создания строки заданной длины со вставленной в середину подстрокой
ZStr (рис. 8.6)
Процедура преобразования числа в строку так, что предшествующие числу пробелы заменяются на нули
PosN (рис. 8.7)
Функция, возвращающая номер символа, с которого начинается N-e вхождение подстроки в строку
Глава 9. Математические возможности Турбо Паскаля
Binary (рис. 9.1)
Функция перевода целого числа в двоичное представление
Code2to1/DeCode1to2 (рис. 9.2)
Процедуры кодирования/декодирования двух малых чисел в один байт
ATAN2 (рис. 9.3)
Функция, возвращающая значение угла наклона отрезка к оси X в
радианах. Возвращаемое значение находится в диапазоне 0...2*Pi и
учитывает знаки координат
ArcCos, ArcSin (рис. 9.4)
Функции, возвращающие главные значения арккосинуса и арксинуса
Log10 (рис. 9.5)
Функция, возвращающая значение десятичного логарифма
Pwr (рис. 9.6)
Функция, возвращающая значение A в степени X (A>0)
Gauss (рис. 9.7)
Функция, возвращающая случайное вещественное значение, распределенное по нормальному закону {556}
Глава 11. Ссылки, динамические переменные и структуры
HeapAvail (рис. 11.7)
Функция, возвращающая размер свободной области кучи, которая расположена выше значения HeapPtr
UNIT StackManager (рис. 11.10)
Модуль, реализующий набор процедур для работы со стеком произвольных данных
Глава 12. Ввод, вывод данных и файловая система
FileExists (рис. 12.11)
Функция проверки существования файла с данным именем
ReadInteger (рис. 12.14)
Процедура ввода с клавиатуры значения типа Integer с игнорированием любого ввода, не соответствующего этому типу
Глава 13. Объектно-ориентированное программирование
PROGRAM (рис. 13.8)
Каркас программы, реализующей полиморфные операции с динамически распределяемыми объектами с полной обработкой ошибок
Глава 14. Специальные средства языка
Devices (рис. 14.3)
Программа — демонстрация анализа конфигурации ПЭВМ
FillWord (рис. 14.4)
Процедура заполнения блоков памяти значением типа Word (по аналогии с FillChar)
NewExit (рис. 14.7)
Демонстрация процедуры обработки фатальных ошибок и выхода из программы
Глава 15. Модуль CRT
IsBlinking, GetBackGround, GetForeGround (рис. 15.5)
Функции проверки факта мерцания символов на экране, текущего цвета фона и символов
VertStr (рис. 15.9)
Процедура вертикального вывода строки
Spiral (рис. 15.10)
Процедура закраски по спирали области экрана
PROGRAM (рис. 15.11)
Демонстрация работы процедуры ClrEOL
PROGRAM (рис. 15.12, 15.13)
Демонстрация работы процедур InsLine/DelLine
PROGRAM (рис. 15.14)
Демонстрация работы процедур HighVideo, LowVideo {557}
SoundType (рис. 15.15)
Процедура звуковой печати строк
Phone, Bell, Sirena (рис. 15.16)
Процедуры имитации звуков телефонного звонка, зуммера и сирены
Глава 16. Модуль DOS
XDOSVersion (рис. 16.1)
Функция выдачи строки с номером версии MS-DOS
ShowSET (рис. 16.2)
Процедура вывода значений системных переменных MS-DOS
WhatDay (рис. 16.3)
Функция, возвращающая название дня недели по дате
PROGRAM (рис. 16.4)
Пример программы, анализирующей время своей работы
ChangeFTime (рис. 16.5)
Процедура смены даты и времени создания файла
PROGRAM (рис. 16.6)
Пример программы, анализирующей жесткие диски ПЭВМ
GetVolume (рис. 16.7)
Функция, возвращающая метку заданного диска
FileExists (рис. 16.8)
Функция проверки существования файла
ShowDisk (рис. 16.9)
Процедура вывода каталога по заданному шаблону
PrintScreen (рис. 16.13)
Печать экрана на принтере, как при нажатии комбинации клавиш Shift+PrtScr
TestDrives (рис. 16.14)
Процедура определения множества имен дисков в ПЭВМ
Execute (рис. 16.17)
Функция запускает файл с параметрами и возвращает логическое значение True, если запуск был удачен.
HideScr (рис. 16.18)
Резидентная программа скрытия экрана. Работает во всех текстовых режимах и использует пароль (если задан) для возврата.