Часть полного текста документа:Использование Prolog совместно с другими ЯП. Понятие Dll.     Вспомним процесс программирования в DOS. Преобразование исходного текста в машинный код включал в себя 2 процесса: компиляцию и линковку. Во время линковки в код программы помещались не только объявления функций и процедур, но и их полный код.     В многозадачной среде подобный подход был бы весьма расточителен, так как огромное количество функций, отвечающих за прорисовку элементов пользовательского интерфейса, за обращение к системным ресурсам и т.п. дублировались в каждой программе. В качестве решения возникшей проблемы была предложена концепция динамической компоновки (см. рис. 1). рис 1.     DLL (библиотека динамической связи) - файл, выступающий в качестве коллективной библиотеки предикатов, которые могут быть использованы одновременно в нескольких приложениях. Prolog способен генерировать DLL, включать DLL статически и загружать динамически. Вызов в программе на VP процедур и функций на других языках.     Прежде чем вызвать процедуры и функции на других языках их нужно объявить как внешний предикат, упомянув, что он осуществляется на другом языке. При этом необходимо знать количество и порядок входных параметров: GLOBAL PREDICATES     procedure add(integer A, integer B, integer C) - (i,i,o) language pascal      Замечание: обратите внимание, что в VP явно указывается язык процедуры Передача входных/выходных параметров и возвращение значений.     Размер входных параметров определен однозначно и зависит только от объявленного типа. Выходной параметр - 32 битный указатель на область памяти, где хранится выходное значение.     Следует отметить, что функции на Pascal не могут возвращать значения в формате чисел с плавающей точкой, а функции C - структуры (но могут, конечно, возвращать указатели на них). Многочисленные декларации. Предикат VP может иметь различные комбинации входных/выходных параметров, и для каждой из них необходима отдельная процедура. Идентификаторы, используемые в Prolog должны совпадать с идентификаторами в библиотеке + суффикс _X, где X - целое число (порядковый номер процедуры, нумерация начинается с 0). Если существует только один вариант, то суффикс отсутствует. Рассмотрим пример:          GLOBAL PREDICATES      subtraction(integer, integer, integer) - (i,i,o), (i,o,i), (o,i,i), (i,i,i) language C     change(integer, integer) - (i,o) language C     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.  ............   |