Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник_Final.doc
Скачиваний:
59
Добавлен:
09.11.2019
Размер:
10.39 Mб
Скачать

3.7. Вызов внешних функций из Пролог-программы и интерфейс с программами на других языках программирования

Вызов внешних функций из Пролог-программы продемонстрируем на примере реализации интерфейса с программой, написанной на языке программирования Borland C.

Компиляция программы из среды Turbo-Prolog

Основная программа на языке Турбо-Пролог [3] компилируется из среды в OBJ-файл. Во всех глобальных именах должен стоять предварительный символ подчеркивания. Описание внешней функции, которая будет вызвана из основной программы, имеет вид:

_имя_функции() – language c.

Пример.

/* Основная программа вызывает внешнюю функцию _hello_c, */

/* написанную на Borland C */

global predicates

_message (string) – (i) language c

_hello_c – language c

goal

_message ("Hello from Turbo Prolog!"),

_hello_c.

clauses

_message (S) :-

makewindow (13, 7, 7, "", 10, 10, 3, 50),

write (S),

readchar (_),

removewindow.

Компиляция программы на языке Borland С

Все функции должны быть скомпилированы в obj-файлы с использованием опции компилятора. Так, для среды ВС++ 2.0 эта директива выглядит следующим образом:

bcc.exe -c -ml имя_файла (модель памяти large).

К глобальному имени функции необходимо добавить символы «_0», например: имя_функции_0().

Пример.

/* Функция _hello_c, написанная на языке Borland C */

/*и вызываемая из Пролог-программы */

void hello_c_0 ()

{

message_0 ("Hello from Turbo C!");

}

domains

integerlist = integer*

global predicates

_message (integer) – (i) language c

_hello_c (integer) – (i) language c

predicates

write_list (integerlist)

int_list (integerlist)

read_list (integerlist)

add_list (integerlist, integerlist, integerlist)

read_list1 (integerlist, integerlist, string)

goal

makewindow (1, 14, 13, "Привет, это Пролог!", 0, 0, 25, 80),

clearwindow,

int_list (List),

read_list (List),

removewindow (1, 0).

clauses

int_list ([]).

add_list ([], L, L).

add_list ([N | L1], L2, [N | L3]) :-

add_list (L1, L2, L3).

read_list1 (X1, X2, S) :- str_int (S, Z),

add_list (X1, [Z], X2), !.

read_list1 (X1, X2, S) :-

write_list (X1),

fail.

read_list (List) :-

write("Введите элемент списка "),

readln (S),

read_list1 (List, L, S),

read_list (L).

write_list ([]) :- nl.

write_list([H|T]) :-

_hello_c (H).

_message(N) :-

makewindow (13, 30, 30, "Сообщение", 5, 5, 15, 50),

write(N),

readchar (_),

removewindow.

Получение исполнимого файла

Первый этап процесса получения исполнимого файла представляет собой компиляцию исходного текста программы, отличающуюся от работы интерпретатора тем, что в ее результате создается объектный файл. Для рассматриваемого примера − это файлы Пролога hello_pr.obj и hello_pr.sym, а также файл на языке Borland C − hello_c.obj. Компилятор выполняет преобразование исходной программы в программу на языке машинных команд.

Следующий этап − это компоновка, т.е. собственно создание исполнимого файла, заключающийся в объединении в общем коде всех необходимых объектных файлов и подстыковке требуемых библиотек. В рассматриваемом примере объектные модули на языках Пролог и Borland C включаются в исполнимый файл outfile.exe.

В дистрибутиве Пролог роль компоновщика выполняет специальная программа связи или так называемая TLINK-программа.

Вызов TLINK-программы из командной строки ИС Турбо-Пролог для рассматриваемого примера имеет следующий вид:

Tlink init.obj hello_pr.obj hello_c.obj hello_pr.sym, outfile,, prolog

где init.obj – стандартный файл Турбо-Пролог,

hello_pr.obj, hello_pr.sym – файлы, получаемые после компиляции hello_pr.pro,

outfile.exe – результирующий исполнимый файл.