Использование Prolog совместно с другимиЯП. Понятие Dll. Вспомним процесс программирования в DOS. Преобразование исходного текста в машинный код включал всебя 2 процесса компиляцию и линковку. Во время линковки в код программыпомещались не только объявления функций и процедур, но и их полный код. В многозадачной среде подобный подход был бы весьма расточителен, таккак огромное количество функций, отвечающих за прорисовку элементовпользовательского интерфейса,
за обращение к системным ресурсам и т.п.дублировались в каждой программе. В качестве решения возникшей проблемы былапредложена концепция динамической компоновки см. рис. 1 . рис1. DLL библиотекадинамической связи файл, выступающий в качестве коллективной библиотекипредикатов, которые могут быть использованы одновременно в несколькихприложениях. Prologспособен генерировать DLL,включать DLL статическии загружать динамически.
Вызов в программе на VP процедур и функций на других языках. Прежде чемвызвать процедуры и функции на других языках их нужно объявить как внешнийпредикат, упомянув, что он осуществляется на другом языке. При этом необходимознать количество и порядок входных параметров GLOBAL PREDICATES procedure add integer A, integer B, integerC i,i,o language pascal Замечание обратите внимание, что в
VPявно указывается язык процедурыПередачавходных выходных параметров и возвращение значений. Размер входныхпараметров определен однозначно и зависит только от объявленного типа. Выходнойпараметр 32 битный указатель на область памяти, где хранится выходноезначение. Следует отметить,что функции на Pascalне могут возвращать значения в формате чисел с плавающей точкой, а функции C – структуры но могут,конечно, возвращать указатели на них .Многочисленныедекларации. Предикат VP может иметь различныекомбинации входных выходных параметров, и для каждой из них необходимаотдельная процедура. Идентификаторы, используемые в Prolog должны совпадать сидентификаторами в библиотеке суффикс X, где X целое число порядковый номер процедуры, нумерация начинается с 0 . Еслисуществует только один вариант, то суффикс отсутствует.
Рассмотрим пример GLOBALPREDICATES subtraction integer, integer, integer i,i,o , i,o,i , o,i,i , i,i,i language C change integer, integer i,o languageC GOAL subtraction 2,2,X , write 2-2 ,X , nl, subtraction 2,Y,5 , write 2-5 ,Y , nl, subtraction Z,5,4 , write 5-4 ,X , nl, subtraction 2,2,5 , write 2-2 равно 5 , nl, change 5, Ch , write Ch .Модуль, связываемый сэтой программой должен содержать процедуры subtraction 0 int x,
int y, int z z x-y subtraction 1 int x, int y, int z y x-z subtraction 2 int x, int y, int z x y-z subtraction 3 int x, int y, int z if x-y ! z RUN Fail change int a, int b b a Примечание если процедура написана на языке C, то параметры заносятся в стек в обратном порядке послевозврата значений указатель автоматически корректируется VP , в противном случае, параметрызаносятся в стек в нормальном порядке см. таблицу 1 . Форматы объектныхфайлов в
Win32. Под Win32 используется 2 форматаобъектных файлов OMF объектно-модульный формат используется, например, Borland C и COFF Общий объектно-файловый формат,используется, например, Visual C .1. При использовании файла в формате OMF имя предиката должно совпадать сименем функции.2. При использовании файла в формате COFF, к имени предиката добавляется знакподчеркивания, и после символа
указывается количество байт, добавленных встек например, если предикат nameимеет 2 целых аргумента, то он должен быть объявлен как name 8 см. таблицу 1 .Установка указателяна стек. Существует дваспособа установки указателя на стек при объявлении функции и при ее вызове.Так сложилось, что Pascalустанавливает указатель при объявлении функции, а С при вызове см. таблицу1 . Конвертирует имена в верхний регистр. Порядок аргументов прямой. Устанавливает указатель на стек при объявлении. Необходимость конвертировать имена в формат COFF. C pascal stdcall – syscall – Таблица 1 вызовмодулей из VP. Неавтоматическое обозначение внешних предикатов. Идентификатор процедуры или функции в VP не обязательно должен совпадать с идентификатором во внешнеммодуле.
В этом случае объявление такогопредиката имеет вид GLOBAL PREDICATES add integer,integer, integer i,o language c as myadd 12 Эквивалентность типов. Большинство простых типов переменных в VP имеют эквиваленты в других языкахпрограммирования, однако размер резервируемой для них памяти может не совпадать см. таблицу 2 . Тип переменной Размер
Win32 . char, byte 1 байт short, word 2 байт long, dword 4 байт unsigned, integer 4 байт Real 8 байт Ref 4 байт Таблица 2 размерпеременных в VP. Обработка списков. Ниже приведен пример программы, преобразующей список в массив, и затемвновь возвращающей данные в список. Программа ListToArrayна языке С преобразует список целых чисел в массив, записывает в стек элементымассива и возвращает количество элементов массив и количество элементовпередаются в программу
как параметры . Преобразование списка проходит в 2 этапа 1. Просматривается список и находится количество элементовв нем.2. Целые числа из списка заносятся в массив, состоящий изизвестного количества элементов. Programlstar p.pro project lstar global domainsilist integer global predicatesinclist ilist,ilist – i,o language cgoalinclist 1,2,3,4,5,6,7 ,L , write
L . Programlstar c.c define listfno 1 define nilfno 2typedef unsigned char BYTE void MEM AllocGStack unsigned typedefstruct ilist BYTE Functor int Value struct ilist Next IINTLIST SaveList List int Array, len register int ArrP register int i количество элементов в списке i 0 while List- gt Functor listfno i List List- gt Next len i Array MEM AllocGStack i sizeof int ArrP Array перемещение элементов списка вмассив List SaveList while i ! 0 ArrP List- gt Value List List- gt Next i ResultArray Array return len void ArrayToList register int ArrP,register int n,register INTLIST ListPP while n !
0 ListPP MEM AllocGStack sizeof INTLIST ListPP – gt Functor listfno ListPP – gt Value ArrP ListPP amp ListPP – gt Next n ListPP MEM AllocGStack sizeof ListPP – gt Functor конец списка ListPP – gt Functor nilfno voidinclist INTLIST InList,INTLIST OutList register int ArrP, i, len int Array len
ListToArray InList, amp Array ArrP Array for i 0 i lt len i ArrP ArrayToList Array,len,OutList Вызов предикатов VP. VP способен нетолько вызывать предикаты, но и предоставлять их другим программам. Нижеприведен пример вызова предиката prowin msgиз программы на С Program hello p.pro global predicatescharprowin msg string – i language chello c – language cclausesprowin
msg S,C -write S, press any key ,readchar C .goalprowin msg Hello from PDCProlog ,hello c. Programhello c.c char prowin msg char voidhello c while prowin msg Hellofrom C press C ! C 2003 Pechenkinpechenkin pochtamt.ruwww.cs.vsu.ru pechenkin