Caché Native Access. InterSystems Meetup 2014
-
Upload
evgeny-shvarov -
Category
Software
-
view
187 -
download
0
description
Transcript of Caché Native Access. InterSystems Meetup 2014
![Page 1: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/1.jpg)
Caché Native Access Новый механизм вызова сторонних библиотек
Дмитрий Трефилов Санкт-Петербург, 2014
![Page 2: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/2.jpg)
История вопроса (RegEx)
• PCRE – Perl Compatible Regular Expressions • “The PCRE library is a set of functions that implement regular
expression pattern matching using the same syntax and semantics as Perl 5. PCRE has its own native API, as well as a set of wrapper functions that correspond to the POSIX regular expression API. The PCRE library is free, even for building proprietary software.”
• ~ 30 нужных экспортируемых функций • Задача не была завершена
это было давно и неправда…
![Page 3: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/3.jpg)
История вопроса (ShellExecute)
• Shell32.DLL • lpOperation =
– edit • Launches an editor and opens the document for editing. If lpFile is not a document file, the
function will fail. – explore
• Explores a folder specified by lpFile. – find
• Initiates a search beginning in the directory specified by lpDirectory. – open
• Opens the item specified by the lpFile parameter. The item can be a file or folder. – print
• Prints the file specified by lpFile. If lpFile is not a document file, the function fails. – NULL
• The default verb is used, if available. If not, the "open" verb is used. If neither verb is available, the system uses the first verb listed in the registry.
ближе к истине
![Page 4: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/4.jpg)
Что такое Callout…
• Встроенный механизм для вызова внешних библиотек (исполняемого кода) • Требует создания промежуточного модуля, созданного по определенным правилам
• Является посредником для вызова внешних функций – ~ 10000 экспортов функций в Windows 7 – ~ 50000 в Linux (RHEL 6)
• Статический подход – Компиляция ядра Caché
• Динамический подход – Загрузка библиотек и вызов функций «на лету»
• Недостатки – Требуются исходный код и настроенное окружение – Каждый раз необходима перекомпиляция и тестирование
…и с чем его едят
![Page 5: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/5.jpg)
Что такое Callout… (часть 2) Существующая реализация («из коробки»)
void Function1(arg1) char * Function2() int FunctionN(a, b)
ZFENTRY Function1
ZFENTRY Function2
ZFENTRY FunctionN
Caché
![Page 6: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/6.jpg)
Истина где-то рядом… ShellExecute + JNA (Java Native Access)
Классы Java libFFI
Диспетчер
Java Applet Библиотека : ИмяФункции (Аргументы…)
ИмяФункции (Аргументы…)
![Page 7: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/7.jpg)
libFFI
• FFI stands for Foreign Function Interface. A foreign function interface is the popular name for the interface that allows code written in one language to call code written in another language. The libffi library really only provides the lowest, machine dependent layer of a fully featured foreign function interface. A layer must exist above libffi that handles type conversions for values passed between the two languages.
• The libffi library provides a portable, high level programming interface to various calling conventions. This allows a programmer to call any function specified by a call interface description at run-time.
https://sourceware.org/libffi/
![Page 8: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/8.jpg)
libFFI (Part 2) Open Source and Ported to Many Different Platforms
ОС \ Arch Linux Windows Cygwin
Windows MingW iOS Mac OS X FreeBSD Solaris Tru64 AIX OpenBSD AMIGA OS/2 HURD IRIX
AArch64 (ARM64)
Alpha
ARM
AVR32
IA-‐64
MIPS
MIPS64
PowerPC
PowerPC 32-‐bit
PowerPC 64-‐bit
SPARC
SPARC64
TILE-‐Gx/TILEPro
X86
X86-‐64
Xtensa
![Page 9: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/9.jpg)
Наш вариант совмещаем полезное с приятным
void Function1(arg1) char * Function2() int FunctionN(a, b)
Caché
libCNA libFFI Диспетчер
COS Callout Gateway
Библиотека : ИмяФункции (Аргументы…)
ИмяФункции (Аргументы…)
![Page 10: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/10.jpg)
Применение
• Внешний движок регулярных выражений • Обработка изображений • Распознавание и конвертация данных • Компьютерное зрение • Научные вычисления • Работа с аудио/видео • Криптография • …
+100500 вариантов
![Page 11: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/11.jpg)
Техническая реализация
![Page 12: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/12.jpg)
Схема работы
Caché Native Access
Callout Gateway Caché libcna
libffi
external library
Класс CNA
![Page 13: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/13.jpg)
Caché Native Access
• CNA — связка класса Caché и библиотеки, написанной на С
• CNA — интерфейс для вызова функций из любых динамических библиотек
• Ничего, кроме COS, для вызова функций не нужно
• Цель CNA — расширение функциональности Caché за счет существующих библиотек
Что это?
![Page 14: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/14.jpg)
Caché Native Access
• $ZF(-1) , $ZF(-2)
• Позволяют вызывать системные команды и консольные программы
• Недостатки: – Сильно ограничена передача аргументов – Нет всей функциональности библиотек
Что есть сейчас? Caché Callout Gateway
![Page 15: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/15.jpg)
Caché Native Access
• $ZF(-3) , $ZF(-5), $ZF( )
• Позволяют вызывать динамические и статические библиотеки специального вида (Callout Libraries)
• Недостатки: – Чтобы сделать из обычной библиотеки Callout Library необходимо:
• Иметь доступ к исходному коду • Иметь настроенное окружение для сборки • Для каждой функции прописать некоторое формальное описание
– Поддерживается очень ограниченный набор типов (int и указатели),
Что есть сейчас? Caché Callout Gateway
![Page 16: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/16.jpg)
Caché Native Access
• Можно вызывать функции из любой динамической библиотеки, бинарно совместимой с C
• Поддержка всех простых типов языка C, size_t и указателей
• Поддержка структур (и вложенных структур)
• Поддержка потоков Caché
• Работает на Linux (x86-32/64), Windows (x86-32/64)
Возможности
![Page 17: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/17.jpg)
Caché Native Access
• Linux:
– make libffi && make
• Windows
– make libffi && make в mingw или mingw-w64
– или можно загрузить бинарные файлы
• Импортируем файл cna.xml
– do $system.OBJ.Load("путь к cna.xml", "c")
Установка
![Page 18: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/18.jpg)
Caché Native Access
CallFunction()
Класс CNA.CNA
LoadLibrary() FreeLibrary()
PointerGetAt() PointerSetAt()
ConvertStringToPointer() ConvertPointerToString() ConvertStreamToPointer()
NULL
#VOID #UCHAR #SCHAR #UINT #INT #USHORT #SHORT
#ULONG #LONG #UINT64 #INT64 #FLOAT #DOUBLE #LONGDOUBLE #POINTER #SIZET
![Page 19: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/19.jpg)
Caché Native Access Пример работы с CNA
set cna = ##class(CNA.CNA).%New("libcna.dll") do cna.LoadLibrary("C:\Windows\system32\msvcrt.dll") set string = cna.ConvertStringToPointer("Hello") set argTypes = $lb(cna.#POINTER) set result = cna.CallFunction("strlen", cna.#SIZET, argTypes, string)
write result, ! do cna.FreeLibrary()
size_t strlen(const char *str);
![Page 20: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/20.jpg)
Подробности реализации
![Page 21: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/21.jpg)
Caché Native Access
• CNA основывается на libffi – libffi – интерфейс для вызова внешних функций – libffi поддерживает различные соглашения о вызове (calling
conventions)
• libffi – библиотека, написанная на C – То есть, для доступа в libffi из Caché, нужно использовать
Callout Gateway
• CNA – Callout Library и оболочка (wrapper) над libffi
Подробности реализации
![Page 22: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/22.jpg)
Caché Native Access
• Мы хотим вызывать функцию, используя ее имя
• Однако, для использования libffi нужен адрес функции
• Чтобы получить адрес нужно использовать платформо-зависимые интерфейсы: POSIX и WinAPI
– Функции dlopen() и dlsym() из POSIX
– Функции LoadLibrary() и GetProcAddress() из WinAPI
Получение адреса функции
![Page 23: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/23.jpg)
Caché Native Access
• Проблема: – Callout Gateway поддерживает очень мало типов данных
• Решение: – преобразовывать данные на стороне Caché – в CNA передавать строки с бинарными данными в формате языка C
Преобразование данных
![Page 24: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/24.jpg)
А дальше что?
![Page 25: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/25.jpg)
Ссылки на ресурсы
• Исходный код CNA и всех примеров выложен на github под лицензией MIT
– https://github.com/intersystems-‐ru/cna
• Документация по Caché Callout – http://docs.intersystems.com/cache20141/csp/docbook/
DocBook.UI.Page.cls?KEY=BGCL • libFFI
– https://sourceware.org/libffi/
полезные и не очень J
![Page 26: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/26.jpg)
Планы
• %DispatchXXX и более удобная обвязка на стороне COS
• Пополнение примеров
• Расширение списка типов и платформ
• …
которых громадьё…
Используйте!
Делитесь успехами!
![Page 27: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/27.jpg)
Спасибо за внимание! [email protected]
![Page 28: Caché Native Access. InterSystems Meetup 2014](https://reader033.fdocuments.net/reader033/viewer/2022052601/5589e945d8b42ac2378b4676/html5/thumbnails/28.jpg)
Caché Native Access Новый механизм вызова сторонних библиотек
Дмитрий Трефилов Санкт-Петербург, 2014