[Из песочницы] Как «прикрутить» CLIPS к приложению под Linux
Продукт CLIPS (C-language Integrated Production System) появился в 1984 году как среда для разработки экспертных систем для проектов NASA. Несмотря на то, что данный проект был приостановлен, разработчики продолжили совершенствования данной среды — последнее обновление было выпущено в 2006 году.CLIPS предусматривает интеграцию в различные приложения, написанные как на языках C и C++, так и на Java. Интересно, что в расширенном руководстве программиста среды показаны варианты интеграции в windows-приложения, но нет ни слова об интеграции в приложения, написанные под Linux.
В процессе написания диссертации я столкнулся со следующей проблемой: мою экспертную систему необходимо было запустить в Linux-подобной ОС, при этом основное приложение, использующее экспертную систему, должно было быть написано на чистом С. Для проверки такой возможности была выбрана Fedora, а весь код был написан в ECLIPSE. Возможно, данный опыт может показаться кому-либо полезным.Начну с того, что CLIPS предлагает следующие варианты интеграции [1]:
1. Интеграция с использованием открытого кода.Наличие открытого кода подразумевает, что нужно перекомпилировать весь проект, «подцепив» к нему все исходные файлы, а дальше уже обращаться ко всем функциям среды напрямую. Вариант был отсеян, т.к. кроме подключения экспертной системы было необходимо еще обрабатывать данные, поступающие в неё, в реальном времени, а тратить время на постоянную долгую компиляцию не хотелось.
2. Интеграция с использованием DLL.Один из основных вариантов, предлагаемых разработчиками, в руководстве имеется полное описание функций и вариантами их подключения. Отличный вариант для Windows-приложений, но абсолютно непригодный для использования в Linux.
3. Интеграция с использованием Shared objects.Разработчиками заботливо собрана библиотека libclips.so, доступная в репозитарии, но полностью забытая в документации. Данный вариант и был принят для реализации, хотя в некоторые моменты я об этом очень пожалел.
На примере основной функции «создать окружение», конечные действия для подключения данной библиотеки к программе можно описать следующим алгоритмом:
1. С помощью команды nm -D /usr/lib/libclips.so.2.0.0 получается список всех функций, которые есть в библиотеке. Подводный камень заключается в том, что некоторые функции данной библиотеки имеют имена, не совпадающие в header-файлах. К примеру, функция CreateEnvironment записана как __CreateEnvironment.
2. В header-файлах ищем описание конкретной функции и определяем её как тип в своей программе: typedef void * (*CreateEnvironmentPtr)(void);
3. Затем определяется переменная данного типа: CreateEnvironmentPtr __CreateEnvironment;
4. После стандартного подключения библиотеки libclips.so с помощью команды dlopen, выполняется загрузка функции из библиотеки:__CreateEnvironment = (CreateEnvironmentPtr) dlsym (dll_handle, «CreateEnvironment»);
5. Определяется указатель: void *theEnv; с помощью которого и создаётся окружение CLIPS: theEnv = __CreateEnvironment ();
После выполнения стандартных для среды действий по загрузке запуску экспертной системы, конечная программа полноценно использует механизм экспертных систем. Например, как показано на рисунке:
Таким образом, мы запустили среду создания экспертных систем (как и саму экспертную систему) в приложении, написанном под Linux.
P.S. В программе можно полностью передать контроль среде, используя при этом команду CommandLoop и реализуя командную строку системы.
Литература1. CLIPS Reference Manual. Volume II. Advanced Programming Guide.