Модульное программирование
Программа в Turbo Prolog’е может состоять из отдельных модулей. Модули могут быть описаны, отредактированы отдельно, а затем связаны в программу. В модулях все имена и области значений считаются локальными (локальный – иначе местный), т.е. в разных модулях можно использовать одинаковые имена. Всякий модуль определяется посредством своего первого имени (без типа файла). Все модули входят в одну программу, которая называется проект. Имя проекта должно быть задано в начале каждого модуля следующим предикатом: Project «newproject» – уникальное (свое) имя Файл, содержащий проект, имеет специальное расширение prj. Среди модулей, входящих в проект, только один модуль может иметь имя «global.pro» (обязательно – это главный) Если программа состоит из модулей, то Turbo Prolog ищет заданные, определяющим словом Project, имена модулей, которые должны быть обработаны. Для этого необходимо, чтобы в библиотеке имелся специальный файл, который имеет имя librarian и который содержит список имен модулей в виде: имя1 + имя2 + имя3+ … Для составления этого файла в меню SETUP имеется подменю librarian. При создании проекта автоматически создается символьная таблица, которая сохраняется в файле obj – оглавление и имеет расширение sym. Для компиляции и связывания модулей должны быть выполнены следующие условия. 1. Всякий модуль должен начинаться с директивы Project. 2. Только один модуль может иметь имя global.pro. 3. Только один из модулей может иметь раздел goal. 4. Модули должны компилироваться с опцией to obj. Последний модуль компилируется с to exe. В этом случае автоматически запускается редактор связи и создается исполнимая программа. Редактировать, значит связать все файлы в единое целое. Процесс связывания можно реализовать с помощью файла проекта и ВАТ-файла PLINK следующим образом: PLINK NEW proj, где NEW PROJ –имя проекта файла. PLINK может быть использована из под DOS. В ней могут быть заданы групповые имена, т.е. параметры %1, %2, %3 (вместо % можно ставить имя): %1 – имя проекта или модуля, %2 – имя устройства и путь, задающий оглавление, в которое будет записан exe файл, %3 – имя устройства и путь к каталогу, где располагаются следующие программы: prolog.lib, init. Obj. При запуске из Turbo Prolog’а в режиме автоматического связывания эти параметры принимают следующие значения: 1. имя проекта или программы, 2. текущий путь exe оглавления системы Turbo Prolog, 3. текущий путь оглавления Turbo Prolog’а. При запуске из-под DOS обязательно следует задать первый параметр. По умолчанию 2 и 3 параметры будут использовать текущие оглавления. Команда PLINK проверяет существует ли файл с расширением sym и выбирает связывать проект или редактировать один объектный файл. Программы, которые взаимодействуют через границы модулей, должны использовать предикаты из специальной секции: global predicates, и иметь общие данные из секции: global domains. При описании глобальных предикатов они записываются в следующем виде: predicate (d1, d2,…dn) – (f, f, f)(f, f,…f), где d1, d2,…dn – глобальные области значений, группа f – задает потоковый шаблон. Каждый модуль исходного проекта должен содержать одни и те же глобальные предикаты и одну и ту же глобальную область значений. Поэтому его записывают в один файл и подключают ко всем остальным с помощью оператора include. Тогда общая структура модуля будет иметь следующий вид: domains global domains database predicates global predicates goal clauses Запишем пример содержимого файла проекта под именем coma.prj main1+ delo+ и два файла *.pro main1.pro project «coma» global domains text=string global predicates write1(text) predicates turbo goal turbo clauses turbo:–write(“gggg”). Файл delo.pro project «coma» global domains text=string global predicates write1(text)-(i) clauses write1(X):–write(X). Все файлы следует поместить в каталог, где находится файл prolog.exe со всеми своими модулями. Затем производится компиляция в режиме compile project. Откомпилированные модули записываются в директорию, куда распределяются файлы EXE (туда помещаются файлы coma.exe, coma.sym, delo.obj, main1.obj).
|