5 Компиляция модулей: tpu-файлы
Особенности модулей требуют подробно рассмотреть их компиляцию и использование. При компиляции программы не оговаривается связь имени в заголовке программы и имени внешнего файла, содержащего эту программу. Поскольку сам заголовок является необязательным, такая связь не имеет смысла.
Заголовок модуля имеет значение, так как программа или другой модуль, использующие данный, будут ссылаться на него в uses-спецификации. Поэтому при трансляции программы, использующей модули, компилятор должен каким-то образом отыскать коды этих модулей, чтобы подключить их к компилируемой программе. Принято за правило, что имя файла, содержащего исходный текст модуля, должно совпадать с именем этого модуля (расширение имени файла при этом несущественно, но по умолчанию предполагается .PAS). Компилятор помещает код модуля, полученный в результате трансляции, в файл с таким же именем и расширением .TPU. При трансляции же программы, использующей этот модуль, компилятор ищет TPU-файл с именем, заданным в uses-спецификации, и связывает его с кодом программы. Таким образом, в спецификации использования фактически задаются не имена модулей, а имена файлов, их содержащих.
Например, для спецификации
uses MyUnit;
помещенной в некоторой программе, компилятор перед трансляцией самой программы должен найти внешний файл с именем MYUNIT.TPU. В этом файле должен находиться код модуля с заголовком вида
unit MyUnit;
Если все-таки необходимо хранить код модуля в файле с другим именем, то можно использовать директиву $U для переопределения имени файла. Эта директива имеет параметр, который трактуется как "настоящее" имя файла с данным модулем. Она должна находиться непосредственно перед именем модуля в спецификации использования. Например, конструкция
uses {$U MY} MyUnit;
приведет к тому, что компилятор будет искать код модуля MyUnit в файле MY.TPU.
6 Компиляция: поиск модулей. Файл turbo.Tpl
При трансляции программы или модуля, использующего другие модули, компилятор последовательно отыскивает файлы, содержащие коды используемых модулей, с тем, чтобы подключить их к компилируемой программе. При этом компилятор работает по следующей схеме:
Компилятор просматривает содержимое системного библиотечного файла модулей TURBO.TPL (Turbo Pascal Library).
Если искомый модуль не найден в файле TURBO.TPL, то компилятор осуществляет поиск соответствующего TPU-файла в ТЕКУЩЕМ каталоге.
Если в текущем каталоге нужный файл не найден, то поиск продолжается в каталогах, заданных в альтернативе Options/ Directories/Unit Directories для интегрированной среды или в параметре /U вызова ТРС-компилятора.
Если файл не найден, то компилятор прекращает работу и выдает диагностическое сообщение об ошибке.
Если компилятор активизирован посредством альтернатив Compile/Маке или Compile/BuiId, то вышеуказанные шаги проводятся в поисках ИСХОДНЫХ ТЕКСТОВ используемых модулей, которые будут оттранслированы перед трансляцией самой программы. При этом подразумевается, что имя файла с текстом модуля совпадает с именем модуля и имеет расширение .PAS.
Сначала компилятор при поиске используемых модулей анализирует системный файл TURBO.TPL. Этот файл имеет специальную структуру и предназначен для компактного хранения и быстрого доступа к наиболее часто используемым модулям. Обычно в этом файле содержатся несколько системных (стандартных) модулей, однако с помощью специальной служебной программы TPUMOVER можно конструировать файл TURBO.TPL, включая в него нужные модули и удаляя неиспользуемые.
Понятие библиотеки модулей является потенциально удобным, но, к сожалению, Turbo Pascal поддерживает только один библиотечный модуль. Нельзя сформировать библиотеку модулей в некотором TPL-файле и обеспечить подключение к программе модулей из этой библиотеки.
