ОБ ЭТОМ ДОКУМЕНТЕ .................................................. 11
1. ДИРЕКТИВЫ КОМПИЛЯТОРА ........................................... 12
1.1. Локальные директивы ........................................ 12
1.1.1. $A или $ALIGN : Выравнивание данных ................. 12
1.1.2. $A1, $A2, $A4 и $A8 ................................. 13
1.1.3. $ASMMODE : Режим ассемблера (только для Intel 80x86) 13
1.1.4. $B или $BOOLEVAL : Полная проверка логических выражений
1.1.5. $C или $ASSERTIONS : Поддержка формальных утверждений 14
1.1.6. $BITPACKING : Включить битовую упаковку ............. 14
1.1.7. $CALLING : Определить соглашение о вызовах .......... 15
1.1.8. $CHECKPOINTER : Проверять значения указателя ........ 15
1.1.9. $CODEALIGN : Установить выравнивание кода ........... 15
1.1.10. $COPERATORS : Разрешить C-подобные операторы ....... 16
1.1.11. $DEFINE или $DEFINEC : Определить идентификатор .... 17
1.1.12. $ELSE : Переключатель условной компиляции .......... 17
1.1.13. $ELSEC : Переключатель условной компиляции ......... 17
1.1.14. $ELSEIF или $ELIFC : Переключатель условной компиляции
1.1.15. $ENDC : Завершение условной компиляции ............. 18
1.1.16. $ENDIF : Завершение условной компиляции ............ 18
1.1.17. $ERROR или $ERRORC : Генерировать сообщение об ошибке
1.1.18. $EXTENDEDSYM: Игнорируемый ......................... 18
1.1.19. $F : Дальний или ближний вызов функций ............. 19
1.1.20. $FATAL : Генерировать сообщения о фатальных ошибках 19
1.1.21. $FPUTYPE : Выбрать тип сопроцессора ................ 20
1.1.22. $GOTO : Поддерживать Goto и Label .................. 20
1.1.23. $H или $LONGSTRINGS : Использовать AnsiStrings ..... 20
1.1.24. $HINT : Генерировать сообщение с подсказкой ........ 21
1.1.25. $HINTS : Разрешить подсказки ....................... 21
1.1.26. $HPPEMIT: Игнорируется ............................. 21
1.1.27. $IF : Начать условную компиляцию ................... 21
1.1.28. $IFC : Начать условную компиляцию .................. 22
1.1.29. $IFDEF Имя : Начать условную компиляцию ............ 22
1.1.30. $IFNDEF : Начать условную компиляцию ............... 22
1.1.31. $IFOPT : Начать условную компиляцию ................ 22
1.1.32. $IMPLICITEXCEPTIONS : Неявное завершение
генерации кода ..................................... 22
1.1.33. $INFO : Генерировать информационное сообщение ...... 23
1.1.34. $INLINE : Разрешить встраиваемый код ............... 23
1.1.35. $INTERFACES : Указать тип интерфейса ............... 23
1.1.36. $I или $IOCHECKS : Проверка ввода/вывода ........... 23
1.1.37. $I или $INCLUDE : Подключить файл .................. 24
1.1.38. $I или $INCLUDE : Включать информацию компилятора .. 25
1.1.39. $I386_XXX : Определить формат ассемблера (Intel 80x86)
1.1.40. $J или $WRITEABLECONST : Разрешить присваивание
для типизированных констант ........................ 26
1.1.41. $L или $LINK : Компоновать объектный файл .......... 26
1.1.42. $LINKFRAMEWORK : Компоновать в структуру ........... 27
1.1.43. $LINKLIB : Компоновать библиотеку .................. 27
1.1.44. $M или $TYPEINFO : Генерировать информацию о типах . 27
1.1.45. $MACRO : Разрешить использование макросов .......... 28
1.1.46. $MAXFPUREGISTERS : Максимальное количество
регистров FPU для переменных ....................... 28
1.1.47. $MESSAGE : Генерировать информационное сообщение ... 29
1.1.48. $MINENUMSIZE : Указать минимальный размер перечисления
1.1.49. $MINFPCONSTPREC : Указать точность констант
с плавающей точкой ................................. 29
1.1.50. $MMX : Поддержка MMX (только Intel 80x86) .......... 29
1.1.51. $NODEFINE : Игнорируется ........................... 30
1.1.52. $NOTE : Генерировать примечание .................... 30
1.1.53. $NOTES : Выводить примечания ....................... 30
1.1.54. $OBJECTCHECKS : Проверять объект ................... 30
1.1.55. $OPTIMIZATION : Включить оптимизацию ............... 31
1.1.56. $OUTPUT_FORMAT : Указать выходной формат ........... 31
1.1.57. $PACKENUM или $Z : Минимальный размер
перечисляемого типа ................................ 32
1.1.58. $PACKRECORDS : Выравнивание элементов записи ....... 33
1.1.59. $PACKSET : Указать размер множества ................ 33
1.1.60. $POP : Перезаписать настройки компилятора .......... 33
1.1.61. $PUSH : Сохранить настройки компилятора ............ 34
1.1.62. $Q или $OV или $OVERFLOWCHECKS: Проверка переполнения
1.1.63. $R или $RANGECHECKS : Проверка диапазона ........... 34
1.1.64. $R или $RESOURCE : Подключить ресурс ............... 35
1.1.65. $SATURATION : Насыщенность операций ................ 35
1.1.66. $SETC : Определить и присвоить значение идентификатору
1.1.67. $STATIC : Разрешить использование
ключевого слова Static ............................. 36
1.1.68. $STOP : Генерировать сообщение о фатальной ошибке .. 36
1.1.69. $T или $TYPEDADDRESS : Тип оператора адреса (@) .... 36
1.1.70. $UNDEF или $UNDEFC : Разыменовать идентификатор .... 37
1.1.71. $V или $VARSTRINGCHECKS : Проверка Var-строки ...... 37
1.1.72. $W или $STACKFRAMES : Генерировать кадры стека ..... 37
1.1.73. $WAIT : Ожидать нажатия клавиши ENTER .............. 38
1.1.74. $WARNING : Генерировать предупреждение ............. 38
1.1.75. $WARNINGS : Выводить предупреждения ................ 38
1.1.76. $Z1, $Z2 и $Z4 ..................................... 38
1.2. Глобальные директивы ....................................... 39
1.2.1. $APPID : Указать ID приложения ...................... 39
1.2.2. $APPNAME : Указать имя приложения ................... 39
1.2.3. $APPTYPE : Указать тип приложения ................... 39
1.2.4. $CALLING : Соглашение о вызовах по умолчанию ........ 40
1.2.5. $CODEPAGE : Установить кодовую страницу ............. 40
1.2.6. $COPYRIGHT: Указать сведения об авторских правах .... 40
1.2.7. $D или $DEBUGINFO : Отладочные символы .............. 41
1.2.8. $DESCRIPTION : Описание приложения .................. 41
1.2.9. $E : Эмуляция сопроцессора .......................... 41
1.2.10. $G : Генерировать код 80286 ........................ 41
1.2.11. $INCLUDEPATH : Указать путь подключений ............ 42
1.2.12. $INTERFACES : Тип интерфейса по умолчанию .......... 42
1.2.13. $L или $LOCALSYMBOLS : Локальная символьная информация
1.2.14. $LIBRARYPATH : Указать путь библиотек .............. 42
1.2.15. $M или $MEMORY : Размер памяти ..................... 43
1.2.17. $MODESWITCH : Выбор функций режима ................. 44
1.2.18. $N : Цифровая обработка ............................ 45
1.2.19. $O : Второй уровень оптимизации .................... 45
1.2.20. $OBJECTPATH : Указать пути для объектных файлов .... 45
1.2.21. $P или $OPENSTRINGS : Использовать открытые строки . 45
1.2.22. $PASCALMAINNAME : Установить имя точки ввода ....... 46
1.2.23. $PIC : Генерировать код PIC ........................ 46
1.2.24. $PROFILE : Профилирование .......................... 46
1.2.25. $S : Проверка стека ................................ 46
1.2.26. $SCREENNAME : Указать имя экрана ................... 47
1.2.27. $SMARTLINK : Использовать «умную компоновку» ....... 47
1.2.28. $THREADNAME : Установить имя потока в Netware ...... 47
1.2.29. $THREADING : Разрешить использование потоков ....... 47
1.2.30. $UNITPATH : Указать путь модулей ................... 48
1.2.31. $VERSION : Указать версию DLL ...................... 48
1.2.32. $WEAKPACKAGEUNIT : Игнорируется .................... 48
1.2.33. $X или $EXTENDEDSYNTAX : Расширенный синтаксис ..... 49
1.2.34. $Y или $REFERENCEINFO :
Вставить информацию обозревателя ................... 49
2. ИСПОЛЬЗОВАНИЕ УСЛОВНЫХ ОПЕРАТОРОВ, СООБЩЕНИЙ И МАКРОСОВ ......... 50
2.1. Условные операторы ......................................... 50
2.1.1. Предопределённые идентификаторы ..................... 51
2.2. Макросы .................................................... 51
2.3. Переменные времени компиляции .............................. 53
2.4. Выражения времени компиляции ............................... 53
2.4.1. Определение ......................................... 53
2.4.2. Использование ....................................... 55
2.5. Сообщения .................................................. 58
3. ИСПОЛЬЗОВАНИЕ ЯЗЫКА АССЕМБЛЕРА .................................. 60
3.1. Использование ассемблера в исходных кодах .................. 60
3.2. Встроенный ассемблер Intel 80x86 ........................... 61
3.2.1. Синтаксис Intel ..................................... 61
3.2.2. Синтаксис AT&T ...................................... 63
3.3. Встроенный ассемблер Motorola 680x0 ........................ 65
3.4. Сигнализация изменения регистров ........................... 65
4. СГЕНЕРИРОВАННЫЙ КОД ............................................. 67
4.1. Модули ..................................................... 67
4.2. Программы .................................................. 68
5. ПОДДЕРЖКА INTEL MMX ............................................. 69
5.1. О чем это? ................................................. 69
5.2. Поддержка насыщенности ..................................... 69
5.3. Ограничения поддержки MMX .................................. 70
5.4. Поддерживаемые операции MMX ................................ 71
5.5. Оптимизация поддержки MMX .................................. 71
6. ВОПРОСЫ КОДИРОВАНИЯ ............................................. 72
6.1. Соглашения о регистрах ..................................... 72
6.1.1. Аккумулятор ......................................... 72
6.1.2. 64-разрядный аккумулятор ............................ 72
6.1.3. Регистр результата с плавающей точкой ............... 72
6.1.4. Регистр объектов .................................... 72
6.1.5. Регистр-указатель кадра ............................. 72
6.1.6. Регистр-указатель стека ............................. 73
6.1.7. Временные регистры .................................. 73
6.1.8. Таблица регистров процессора ........................ 73
6.2. Преобразование имён ........................................ 74
6.2.1. Преобразование имён для блоков данных ............... 74
6.2.2. Преобразование имён для блоков кода ................. 75
6.2.3. Модификация преобразованных имён .................... 76
6.3. Механизм вызова ............................................ 77
6.4. Вложенные процедуры и функции .............................. 78
6.5. Вызовы конструктора и деструктора .......................... 78
6.5.1. Объекты ............................................. 78
6.5.2. Классы .............................................. 79
6.6. Код входа/выхода ........................................... 79
6.6.1. Стандартная процедура начала/завершения Intel 80x86 . 79
6.6.2. Стандартная процедура начала/завершения Motorola 680x0
6.7. Передача параметра ......................................... 80
6.7.1. Выравнивание параметров ............................. 80
6.8. Ограничения стека .......................................... 81
7. ВОПРОСЫ КОМПОНОВКИ .............................................. 82
7.1. Использование внешнего кода и переменных ................... 82
7.1.1. Объявление внешних функций и процедур ............... 82
7.1.2. Объявление внешних переменных ....................... 83
7.1.3. Объявление модификатора соглашений о вызовах ........ 84
7.1.4. Объявление внешнего объектного кода ................. 85
Компоновка объектного файла ......................... 85
Компоновка библиотеки ............................... 86
7.2. Создание библиотек ......................................... 87
7.2.1. Экспорт функций ..................................... 88
7.2.2. Экспорт переменных .................................. 88
7.2.3. Компилирование библиотек ............................ 88
7.2.4. Стратегия поиска модуля ............................. 89
7.3. Использование умной компоновки ............................. 89
8. ВОПРОСЫ ПАМЯТИ .................................................. 91
8.1. Модель памяти .............................................. 91
8.2. Форматы данных ............................................. 91
8.2.1. Целочисленные типы .................................. 91
8.2.2. Символьные типы ..................................... 91
8.2.3. Логические типы ..................................... 91
8.2.4. Перечисляемые типы .................................. 92
8.2.5. Типы с плавающей точкой ............................. 92
Single .............................................. 92
Double .............................................. 93
Extended ............................................ 93
Comp ................................................ 93
Real ................................................ 93
8.2.6. Указатели ........................................... 94
8.2.7. Строки .............................................. 94
Ansistring .......................................... 94
Shortstring ......................................... 94
Widestring .......................................... 94
8.2.8. Множества ........................................... 94
8.2.9. Статические массивы ................................. 95
8.2.10. Динамические массивы ............................... 95
8.2.11. Записи ............................................. 95
8.2.12. Объекты ............................................ 95
8.2.13. Классы ............................................. 96
8.2.14. Файлы .............................................. 97
8.2.15. Процедурные типы ................................... 98
8.3. Выравнивание данных ........................................ 98
8.3.1. Выравнивание типизированных переменных и констант ... 98
8.3.2. Выравнивание структурированных типов ................ 98
8.4. Куча ....................................................... 98
8.4.1. Стратегия выделения динамической памяти ............. 99
8.4.2. Увеличение кучи ..................................... 99
8.4.3. Отладка кучи ........................................ 100
8.4.4. Написание вашего собственного менеджера памяти ...... 100
8.5. Использование памяти DOS под расширителем Go32 ............. 105
8.6. При переносе кода Турбо Паскаль ............................ 106
8.7. Memavail и Maxavail ........................................ 106
9. СТРОКИ РЕСУРСОВ ................................................. 108
9.1. Введение ................................................... 108
9.2. Файл строковых ресурсов .................................... 108
9.3. Обновление таблиц строк .................................... 109
9.4. GNU gettext ................................................ 111
9.5. Предупреждения ............................................. 112
10. ПРОГРАММИРОВАНИЕ ПОТОКОВ ....................................... 113
10.1. Введение .................................................. 113
10.2. Программирование потоков .................................. 113
10.3. Критические разделы ....................................... 116
10.4. Менеджер потоков .......................................... 117
11. ОПТИМИЗАЦИИ .................................................... 119
11.1. Независимо от процессора .................................. 119
11.1.1. Сложение констант ................................. 119
11.1.2. Слияние констант .................................. 119
11.1.3. Сокращённая оценка ................................ 119
11.1.4. Константы множеств ................................ 119
11.1.5. Небольшие множества ............................... 120
11.1.6. Проверка диапазона ................................ 120
11.1.7. And вместо modulo ................................. 120
11.1.8. Сдвиг вместо умножения или деления ................ 120
11.1.9. Автоматическое выравнивание ....................... 120
11.1.10. Умная компоновка ................................. 120
11.1.11. Встроенные подпрограммы .......................... 121
11.1.12. Пропуск кадра стека .............................. 121
11.1.13. Регистры переменных .............................. 121
11.2. Конкретные процессоры ..................................... 121
11.2.1. Intel 80x86 ....................................... 121
11.2.2. Motorola 680x0 .................................... 123
11.3. Переключатели оптимизации ................................. 123
11.4. Советы по генерации наиболее быстрого кода ................ 124
11.5. Советы по генерации наименьшего кода ...................... 125
11.6. Оптимизация программы в целом ............................. 125
11.6.1. Общие сведения .................................... 125
11.7. Основные принципы ......................................... 126
11.7.1. Как использовать .................................. 126
11.7.2. Доступные оптимизации WPO ......................... 127
11.7.3. Формат файла WPO .................................. 128
12. ПРОГРАММИРОВАНИЕ ОБЩЕДОСТУПНЫХ БИБЛИОТЕК ....................... 129
12.1. Введение .................................................. 129
12.2. Создание библиотеки ....................................... 129
12.3. Использование библиотеки в программе на Паскале ........... 130
12.4. Использование библиотек Паскаль с программами на С ........ 132
12.5. Некоторые вопросы Windows ................................. 133
13. ИСПОЛЬЗОВАНИЕ РЕСУРСОВ WINDOWS ................................. 134
13.1. Директива ресурса $R ...................................... 134
13.2. Создание ресурсов ......................................... 134
13.3. Использование строковых таблиц ............................ 135
13.4. Вставка информации о версии ............................... 135
13.5. Вставка значка приложения ................................. 136
13.6. Использование препроцессора Pascal ........................ 136
ПРИЛОЖЕНИЕ А: АНАТОМИЯ ФАЙЛА МОДУЛЯ ................................ 138
A.1. Основы ..................................................... 138
A.2. Чтение ppu-файлов .......................................... 138
A.3. Заголовок .................................................. 139
A.4. Разделы .................................................... 139
A.5. Создание ppu-файлов ........................................ 141
ПРИЛОЖЕНИЕ B: СТРУКТУРА ДЕРЕВА ИСХОДНОГО КОДА КОМПИЛЯТОРА И RTL .... 143
B.1. Дерево исходного кода компилятора .......................... 143
B.2. Дерево исходного кода RTL .................................. 143
ПРИЛОЖЕНИЕ С: ОГРАНИЧЕНИЯ КОМПИЛЯТОРА .............................. 145
ПРИЛОЖЕНИЕ D: РЕЖИМЫ КОМПИЛЯТОРА ................................... 146
D.1. Режим FPC .................................................. 146
D.2. Режим TP ................................................... 146
D.3. Режим Delphi ............................................... 146
D.4. Режим OBJFPC ............................................... 147
D.5. Режим MAC .................................................. 147
ПРИЛОЖЕНИЕ Е: ИСПОЛЬЗОВАНИЕ fpcmake ................................ 149
E.1. Введение ................................................... 149
E.2. Функциональность ........................................... 149
E.3. Использование .............................................. 150
E.4. Формат файла конфигурации .................................. 151
E.4.1. clean ............................................... 151
E.4.2. compiler ............................................ 151
E.4.3. Default ............................................. 151
E.4.4. Dist ................................................ 151
E.4.5. Install ............................................. 153
E.4.6. Package ............................................. 153
E.4.7. Prerules ............................................ 154
E.4.8. Requires ............................................ 154
E.4.9. Rules ............................................... 154
E.4.10. Target ............................................. 155
E.5. Программы, необходимые для работы с созданным makefile ..... 155
E.6. Переменные, которые влияют на генерируемый makefile ........ 156
E.6.1. Переменные каталогов ................................ 156
E.6.2. Переменные командной строки компилятора ............. 157
E.7. Переменные, установленные с помощью fpcmake ................ 157
E.7.1. Переменные каталогов ................................ 158
E.7.2. Целевые переменные .................................. 159
E.7.3. Переменные командной строки компилятора ............. 160
E.7.4. Имена программ ...................................... 160
E.7.5. Расширения файлов ................................... 161
E.7.6. Целевые файлы ....................................... 161
E.8. Правила и цели, созданные с помощью fpcmake ................ 162
E.8.1. Шаблонные правила ................................... 162
E.8.2. Правила сборки ...................................... 162
E.8.3. Правила очистки ..................................... 162
E.8.4. Правила архивации ................................... 163
E.8.5. Правила инсталляции ................................. 163
E.8.6. Информативные правила ............................... 163
ПРИЛОЖЕНИЕ F: КОМПИЛЯЦИЯ КОМПИЛЯТОРА ............................... 164
F.1. Введение ................................................... 164
F.2. Перед стартом .............................................. 164
F.3. Компиляция с использованием make ........................... 165
F.4. Компиляция вручную ......................................... 166
F.4.1. Компиляция RTL ...................................... 166
F.4.2. Компиляция компилятора .............................. 167
ПРИЛОЖЕНИЕ G: ОПРЕДЕЛЕНИЯ КОМПИЛЯТОРА ВО ВРЕМЯ КОМПИЛЯЦИИ .......... 169
ПРИЛОЖЕНИЕ H: КОНФИГУРАЦИЯ СТЕКА ................................... 171
H.1. DOS ........................................................ 171
H.2. Linux ...................................................... 171
H.3. Netbsd ..................................................... 171
H.4. Freebsd .................................................... 171
H.5. BeOS ....................................................... 171
H.6. Windows .................................................... 171
H.7. OS/2 ....................................................... 171
H.8. Amiga ...................................................... 171
H.9. Atari ...................................................... 171
ПРИЛОЖЕНИЕ I: СПЕЦИФИЧЕСКОЕ ПОВЕДЕНИЕ ОПЕРАЦИОННОЙ СИСТЕМЫ ......... 172