SlideShare uma empresa Scribd logo
1 de 28
Baixar para ler offline
Caché Native Access 
Новый механизм вызова сторонних 
библиотек 
Дмитрий Трефилов 
Санкт-Петербург, 2014
История вопроса (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 нужных экспортируемых функций 
• Задача не была завершена
История вопроса (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.
Что такое Callout… 
…и с чем его едят 
• Встроенный механизм для вызова внешних библиотек (исполняемого кода) 
• Требует создания промежуточного модуля, созданного по определенным 
правилам 
• Является посредником для вызова внешних функций 
– ~ 10000 экспортов функций в Windows 7 
– ~ 50000 в Linux (RHEL 6) 
• Статический подход 
– Компиляция ядра Caché 
• Динамический подход 
– Загрузка библиотек и вызов функций «на лету» 
• Недостатки 
– Требуются исходный код и настроенное окружение 
– Каждый раз необходима перекомпиляция и тестирование
Что такое Callout… (часть 2) 
Существующая реализация («из коробки») 
void Function1(arg1) char * Function2() int FunctionN(a, b) 
ZFENTRY 
Function1 
ZFENTRY 
Function2 
ZFENTRY 
FunctionN 
Caché
Истина где-то рядом… 
ShellExecute + JNA (Java Native Access) 
Библиотека : ИмяФункции (Аргументы…) 
Классы 
Java Applet 
Диспетчер 
libFFI Java 
ИмяФункции (Аргументы…)
libFFI 
https://sourceware.org/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.
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
Наш вариант 
совмещаем полезное с приятным 
Caché 
COS Callout Gateway 
Диспетчер 
Библиотека : 
ИмяФункции (Аргументы…) 
libFFI libCNA 
ИмяФункции (Аргументы…) 
void Function1(arg1) char * Function2() int FunctionN(a, b)
Применение 
+100500 вариантов 
• Внешний движок регулярных выражений 
• Обработка изображений 
• Распознавание и конвертация данных 
• Компьютерное зрение 
• Научные вычисления 
• Работа с аудио/видео 
• Криптография 
• …
Техническая реализация
Caché Native Access 
Схема работы 
Caché Callout Gateway libcna 
libffi 
external library 
Класс 
CNA
Caché Native Access 
Что это? 
• CNA — связка класса Caché и библиотеки, 
написанной на С 
• CNA — интерфейс для вызова функций из 
любых динамических библиотек 
• Ничего, кроме COS, для вызова функций не 
нужно 
• Цель CNA — расширение функциональности 
Caché за счет существующих библиотек
Caché Native Access 
Что есть сейчас? Caché Callout Gateway 
• $ZF(-1) , $ZF(-2) 
• Позволяют вызывать системные команды и 
консольные программы 
• Недостатки: 
– Сильно ограничена передача аргументов 
– Нет всей функциональности библиотек
Caché Native Access 
Что есть сейчас? Caché Callout Gateway 
• $ZF(-3) , $ZF(-5), $ZF( ) 
• Позволяют вызывать динамические и статические библиотеки 
специального вида (Callout Libraries) 
• Недостатки: 
– Чтобы сделать из обычной библиотеки Callout Library необходимо: 
• Иметь доступ к исходному коду 
• Иметь настроенное окружение для сборки 
• Для каждой функции прописать некоторое формальное описание 
– Поддерживается очень ограниченный набор типов (int и указатели),
Caché Native Access 
Возможности 
• Можно вызывать функции из любой динамической 
библиотеки, бинарно совместимой с C 
• Поддержка всех простых типов языка C, size_t 
и 
указателей 
• Поддержка структур (и вложенных структур) 
• Поддержка потоков Caché 
• Работает на Linux (x86-32/64), Windows (x86-32/64)
Caché Native Access 
• Linux: 
– make 
libffi 
&& 
make 
• Windows 
– make 
libffi 
&& 
make 
в mingw или mingw-w64 
– или можно загрузить бинарные файлы 
• Импортируем файл cna.xml 
– do 
$system.OBJ.Load("путь 
к 
cna.xml", 
"c") 
Установка
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
Caché Native Access 
Пример работы с CNA 
set 
cna 
= 
##class(CNA.CNA).%New("libcna.dll") 
do 
cna.LoadLibrary("C:Windowssystem32msvcrt.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);
Подробности реализации
Caché Native Access 
Подробности реализации 
• CNA основывается на libffi 
– libffi – интерфейс для вызова внешних функций 
– libffi поддерживает различные соглашения о вызове (calling 
conventions) 
• libffi – библиотека, написанная на C 
– То есть, для доступа в libffi из Caché, нужно использовать 
Callout Gateway 
• CNA – Callout Library и оболочка (wrapper) над libffi
Caché Native Access 
Получение адреса функции 
• Мы хотим вызывать функцию, используя ее имя 
• Однако, для использования libffi нужен адрес функции 
• Чтобы получить адрес нужно использовать 
платформо-зависимые интерфейсы: POSIX и WinAPI 
– Функции dlopen() 
и dlsym() 
из POSIX 
– Функции LoadLibrary() 
и GetProcAddress() 
из WinAPI
Caché Native Access 
Преобразование данных 
• Проблема: 
– Callout Gateway поддерживает очень мало типов данных 
• Решение: 
– преобразовывать данные на стороне Caché 
– в CNA передавать строки с бинарными данными в формате языка C
А дальше что?
Ссылки на ресурсы 
полезные и не очень J 
• Исходный код 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/
Планы 
которых громадьё… 
• %DispatchXXX и более удобная обвязка на стороне COS 
• Пополнение примеров 
• Расширение списка типов и платформ 
• … 
Используйте! 
Делитесь успехами!
Спасибо за внимание! 
Dmitry.Trefilov@intersystems.com
Caché Native Access 
Новый механизм вызова сторонних 
библиотек 
Дмитрий Трефилов 
Санкт-Петербург, 2014

Mais conteúdo relacionado

Mais procurados

Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonMaxim Kulsha
 
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionJVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionNikita Lipsky
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GOPython Meetup
 
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 Practical Python Packaging / Стас Рудаков / Web Developer Wargaming Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Practical Python Packaging / Стас Рудаков / Web Developer WargamingPython Meetup
 
Командная строка Unix
Командная строка UnixКомандная строка Unix
Командная строка UnixYandex
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilationNikita Lipsky
 
Не превращайте ваши логи в клинопись
Не превращайте ваши логи в клинописьНе превращайте ваши логи в клинопись
Не превращайте ваши логи в клинописьAndrey Rebrov
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPИван Кочуркин
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programmingAndrei Pangin
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Ontico
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоFuenteovejuna
 
Flask, гордость и предубеждение
Flask, гордость и предубеждениеFlask, гордость и предубеждение
Flask, гордость и предубеждениеYehor Nazarkin
 
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Ruby Meditation
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Anton Arhipov
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - BytecodeAnton Arhipov
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)Ontico
 

Mais procurados (20)

Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
 
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference EditionJVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
JVM: краткий курс общей анатомии, JPoint 2016 Conference Edition
 
Язык программирования GO
Язык программирования GOЯзык программирования GO
Язык программирования GO
 
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 Practical Python Packaging / Стас Рудаков / Web Developer Wargaming Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 
Командная строка Unix
Командная строка UnixКомандная строка Unix
Командная строка Unix
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Не превращайте ваши логи в клинопись
Не превращайте ваши логи в клинописьНе превращайте ваши логи в клинопись
Не превращайте ваши логи в клинопись
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHP
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
 
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 
DLR Hosting
DLR HostingDLR Hosting
DLR Hosting
 
Компиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей РоманенкоКомпиляция скриптов PHP. Алексей Романенко
Компиляция скриптов PHP. Алексей Романенко
 
Flask, гордость и предубеждение
Flask, гордость и предубеждениеFlask, гордость и предубеждение
Flask, гордость и предубеждение
 
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101Joker 2016 - Bytecode 101
Joker 2016 - Bytecode 101
 
JPoint 2016 - Bytecode
JPoint 2016 - BytecodeJPoint 2016 - Bytecode
JPoint 2016 - Bytecode
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)
 

Semelhante a Caché Native Access. InterSystems Meetup 2014

2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел КрынецкийJSC “Arcadia Inc”
 
Scripting languages
Scripting languagesScripting languages
Scripting languagesLev Panov
 
Клиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhoneКлиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhonePavel Bashmakov
 
Cocoa Networking
Cocoa NetworkingCocoa Networking
Cocoa Networkingguest57eb8a
 
Approaches to the Fragmentation of a Paravirtualization System
Approaches to the Fragmentation of a Paravirtualization SystemApproaches to the Fragmentation of a Paravirtualization System
Approaches to the Fragmentation of a Paravirtualization SystemIosif Itkin
 
BlackBox testing
BlackBox testingBlackBox testing
BlackBox testingbeched
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...DevDay
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeGetDev.NET
 
Локальное окружение на Docker
Локальное окружение на DockerЛокальное окружение на Docker
Локальное окружение на DockerМихаил Бакулин
 
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
Внедрение аспектов в PHP с помощью библиотеки GO! AOPВнедрение аспектов в PHP с помощью библиотеки GO! AOP
Внедрение аспектов в PHP с помощью библиотеки GO! AOPAlexander Lisachenko
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)Pavel Tsukanov
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и DjangoTaras Lyapun
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingTatiana Volkova
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действииNikita Lipsky
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на GoAndrey Smirnov
 
JVM: краткий курс общей анатомии
JVM: краткий курс общей анатомииJVM: краткий курс общей анатомии
JVM: краткий курс общей анатомииNikita Lipsky
 
библиотеки программирования
библиотеки программированиябиблиотеки программирования
библиотеки программированияmcroitor
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeIosif Itkin
 

Semelhante a Caché Native Access. InterSystems Meetup 2014 (20)

2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
 
Scripting languages
Scripting languagesScripting languages
Scripting languages
 
Клиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhoneКлиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhone
 
Cocoa Networking
Cocoa NetworkingCocoa Networking
Cocoa Networking
 
Approaches to the Fragmentation of a Paravirtualization System
Approaches to the Fragmentation of a Paravirtualization SystemApproaches to the Fragmentation of a Paravirtualization System
Approaches to the Fragmentation of a Paravirtualization System
 
Kolibri OS
Kolibri OSKolibri OS
Kolibri OS
 
BlackBox testing
BlackBox testingBlackBox testing
BlackBox testing
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
Локальное окружение на Docker
Локальное окружение на DockerЛокальное окружение на Docker
Локальное окружение на Docker
 
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
Внедрение аспектов в PHP с помощью библиотеки GO! AOPВнедрение аспектов в PHP с помощью библиотеки GO! AOP
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
 
Введение в Python и Django
Введение в Python и DjangoВведение в Python и Django
Введение в Python и Django
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в Processing
 
лекция 3
лекция 3лекция 3
лекция 3
 
Excelsior JET в действии
Excelsior JET в действииExcelsior JET в действии
Excelsior JET в действии
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на Go
 
JVM: краткий курс общей анатомии
JVM: краткий курс общей анатомииJVM: краткий курс общей анатомии
JVM: краткий курс общей анатомии
 
библиотеки программирования
библиотеки программированиябиблиотеки программирования
библиотеки программирования
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: Genode
 

Mais de InterSystems

InterSystems Developers Community Update Global Summit 2019
InterSystems Developers Community Update Global Summit 2019InterSystems Developers Community Update Global Summit 2019
InterSystems Developers Community Update Global Summit 2019InterSystems
 
InterSystems IRIS Data Platfrom: Sharding and Scalability
InterSystems IRIS Data Platfrom: Sharding and ScalabilityInterSystems IRIS Data Platfrom: Sharding and Scalability
InterSystems IRIS Data Platfrom: Sharding and ScalabilityInterSystems
 
DeepSee Web: Angular Render for InterSystems DeepSee Dashboards
DeepSee Web: Angular Render for InterSystems DeepSee DashboardsDeepSee Web: Angular Render for InterSystems DeepSee Dashboards
DeepSee Web: Angular Render for InterSystems DeepSee DashboardsInterSystems
 
InterSystems Caché REST Forms
InterSystems Caché REST FormsInterSystems Caché REST Forms
InterSystems Caché REST FormsInterSystems
 
InterSystems Caché Localization Manager
InterSystems Caché Localization Manager InterSystems Caché Localization Manager
InterSystems Caché Localization Manager InterSystems
 
Source Control Addon for InterSystems Caché with UDL support
Source Control Addon for InterSystems Caché with UDL supportSource Control Addon for InterSystems Caché with UDL support
Source Control Addon for InterSystems Caché with UDL supportInterSystems
 
DeepSee SYSMON - InterSystems Caché System Monitoring Analytics
DeepSee SYSMON - InterSystems Caché System Monitoring AnalyticsDeepSee SYSMON - InterSystems Caché System Monitoring Analytics
DeepSee SYSMON - InterSystems Caché System Monitoring AnalyticsInterSystems
 
InterSystems Community and Projects in CIS November 2015
InterSystems Community and Projects in CIS November 2015InterSystems Community and Projects in CIS November 2015
InterSystems Community and Projects in CIS November 2015InterSystems
 
Caché github continuous intergration
Caché github continuous intergrationCaché github continuous intergration
Caché github continuous intergrationInterSystems
 
InterSystems news Meetup Sankt-Peterburg2015
InterSystems news Meetup Sankt-Peterburg2015InterSystems news Meetup Sankt-Peterburg2015
InterSystems news Meetup Sankt-Peterburg2015InterSystems
 
Web and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard LebedyukWeb and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard LebedyukInterSystems
 
InterSystems Healthshare +DeepSee. Hospitalization queue
InterSystems Healthshare +DeepSee. Hospitalization queueInterSystems Healthshare +DeepSee. Hospitalization queue
InterSystems Healthshare +DeepSee. Hospitalization queueInterSystems
 
Deep see mobile meetup красноярск
Deep see mobile meetup красноярскDeep see mobile meetup красноярск
Deep see mobile meetup красноярскInterSystems
 
InterSystems High Availability and Mirroring solutions
InterSystems High Availability and Mirroring solutionsInterSystems High Availability and Mirroring solutions
InterSystems High Availability and Mirroring solutionsInterSystems
 
Enterprise Serial Bus on InterSystems Ensemble
Enterprise Serial Bus on InterSystems EnsembleEnterprise Serial Bus on InterSystems Ensemble
Enterprise Serial Bus on InterSystems EnsembleInterSystems
 
Интеграционная шина на базе InterSystems Ensemble
Интеграционная шина на базе InterSystems EnsembleИнтеграционная шина на базе InterSystems Ensemble
Интеграционная шина на базе InterSystems EnsembleInterSystems
 
Перевод базы Caché из 8 бит в Unicode
Перевод базы Caché из 8 бит в UnicodeПеревод базы Caché из 8 бит в Unicode
Перевод базы Caché из 8 бит в UnicodeInterSystems
 
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014InterSystems
 
Примеры использования iknow в медицине - InterSystems Meetup Sankt-Peterburg ...
Примеры использования iknow в медицине - InterSystems Meetup Sankt-Peterburg ...Примеры использования iknow в медицине - InterSystems Meetup Sankt-Peterburg ...
Примеры использования iknow в медицине - InterSystems Meetup Sankt-Peterburg ...InterSystems
 
Управление изменениями и коллективная разработка в Caché. InterSystems Meetup...
Управление изменениями и коллективная разработка в Caché. InterSystems Meetup...Управление изменениями и коллективная разработка в Caché. InterSystems Meetup...
Управление изменениями и коллективная разработка в Caché. InterSystems Meetup...InterSystems
 

Mais de InterSystems (20)

InterSystems Developers Community Update Global Summit 2019
InterSystems Developers Community Update Global Summit 2019InterSystems Developers Community Update Global Summit 2019
InterSystems Developers Community Update Global Summit 2019
 
InterSystems IRIS Data Platfrom: Sharding and Scalability
InterSystems IRIS Data Platfrom: Sharding and ScalabilityInterSystems IRIS Data Platfrom: Sharding and Scalability
InterSystems IRIS Data Platfrom: Sharding and Scalability
 
DeepSee Web: Angular Render for InterSystems DeepSee Dashboards
DeepSee Web: Angular Render for InterSystems DeepSee DashboardsDeepSee Web: Angular Render for InterSystems DeepSee Dashboards
DeepSee Web: Angular Render for InterSystems DeepSee Dashboards
 
InterSystems Caché REST Forms
InterSystems Caché REST FormsInterSystems Caché REST Forms
InterSystems Caché REST Forms
 
InterSystems Caché Localization Manager
InterSystems Caché Localization Manager InterSystems Caché Localization Manager
InterSystems Caché Localization Manager
 
Source Control Addon for InterSystems Caché with UDL support
Source Control Addon for InterSystems Caché with UDL supportSource Control Addon for InterSystems Caché with UDL support
Source Control Addon for InterSystems Caché with UDL support
 
DeepSee SYSMON - InterSystems Caché System Monitoring Analytics
DeepSee SYSMON - InterSystems Caché System Monitoring AnalyticsDeepSee SYSMON - InterSystems Caché System Monitoring Analytics
DeepSee SYSMON - InterSystems Caché System Monitoring Analytics
 
InterSystems Community and Projects in CIS November 2015
InterSystems Community and Projects in CIS November 2015InterSystems Community and Projects in CIS November 2015
InterSystems Community and Projects in CIS November 2015
 
Caché github continuous intergration
Caché github continuous intergrationCaché github continuous intergration
Caché github continuous intergration
 
InterSystems news Meetup Sankt-Peterburg2015
InterSystems news Meetup Sankt-Peterburg2015InterSystems news Meetup Sankt-Peterburg2015
InterSystems news Meetup Sankt-Peterburg2015
 
Web and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard LebedyukWeb and mobile development for intersystems caché, Eduard Lebedyuk
Web and mobile development for intersystems caché, Eduard Lebedyuk
 
InterSystems Healthshare +DeepSee. Hospitalization queue
InterSystems Healthshare +DeepSee. Hospitalization queueInterSystems Healthshare +DeepSee. Hospitalization queue
InterSystems Healthshare +DeepSee. Hospitalization queue
 
Deep see mobile meetup красноярск
Deep see mobile meetup красноярскDeep see mobile meetup красноярск
Deep see mobile meetup красноярск
 
InterSystems High Availability and Mirroring solutions
InterSystems High Availability and Mirroring solutionsInterSystems High Availability and Mirroring solutions
InterSystems High Availability and Mirroring solutions
 
Enterprise Serial Bus on InterSystems Ensemble
Enterprise Serial Bus on InterSystems EnsembleEnterprise Serial Bus on InterSystems Ensemble
Enterprise Serial Bus on InterSystems Ensemble
 
Интеграционная шина на базе InterSystems Ensemble
Интеграционная шина на базе InterSystems EnsembleИнтеграционная шина на базе InterSystems Ensemble
Интеграционная шина на базе InterSystems Ensemble
 
Перевод базы Caché из 8 бит в Unicode
Перевод базы Caché из 8 бит в UnicodeПеревод базы Caché из 8 бит в Unicode
Перевод базы Caché из 8 бит в Unicode
 
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
ECP и API управления процессами. InterSystems Meetup Sankt-Peterburg 2014
 
Примеры использования iknow в медицине - InterSystems Meetup Sankt-Peterburg ...
Примеры использования iknow в медицине - InterSystems Meetup Sankt-Peterburg ...Примеры использования iknow в медицине - InterSystems Meetup Sankt-Peterburg ...
Примеры использования iknow в медицине - InterSystems Meetup Sankt-Peterburg ...
 
Управление изменениями и коллективная разработка в Caché. InterSystems Meetup...
Управление изменениями и коллективная разработка в Caché. InterSystems Meetup...Управление изменениями и коллективная разработка в Caché. InterSystems Meetup...
Управление изменениями и коллективная разработка в Caché. InterSystems Meetup...
 

Caché Native Access. InterSystems Meetup 2014

  • 1. Caché Native Access Новый механизм вызова сторонних библиотек Дмитрий Трефилов Санкт-Петербург, 2014
  • 2. История вопроса (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 нужных экспортируемых функций • Задача не была завершена
  • 3. История вопроса (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.
  • 4. Что такое Callout… …и с чем его едят • Встроенный механизм для вызова внешних библиотек (исполняемого кода) • Требует создания промежуточного модуля, созданного по определенным правилам • Является посредником для вызова внешних функций – ~ 10000 экспортов функций в Windows 7 – ~ 50000 в Linux (RHEL 6) • Статический подход – Компиляция ядра Caché • Динамический подход – Загрузка библиотек и вызов функций «на лету» • Недостатки – Требуются исходный код и настроенное окружение – Каждый раз необходима перекомпиляция и тестирование
  • 5. Что такое Callout… (часть 2) Существующая реализация («из коробки») void Function1(arg1) char * Function2() int FunctionN(a, b) ZFENTRY Function1 ZFENTRY Function2 ZFENTRY FunctionN Caché
  • 6. Истина где-то рядом… ShellExecute + JNA (Java Native Access) Библиотека : ИмяФункции (Аргументы…) Классы Java Applet Диспетчер libFFI Java ИмяФункции (Аргументы…)
  • 7. libFFI https://sourceware.org/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.
  • 8. 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
  • 9. Наш вариант совмещаем полезное с приятным Caché COS Callout Gateway Диспетчер Библиотека : ИмяФункции (Аргументы…) libFFI libCNA ИмяФункции (Аргументы…) void Function1(arg1) char * Function2() int FunctionN(a, b)
  • 10. Применение +100500 вариантов • Внешний движок регулярных выражений • Обработка изображений • Распознавание и конвертация данных • Компьютерное зрение • Научные вычисления • Работа с аудио/видео • Криптография • …
  • 12. Caché Native Access Схема работы Caché Callout Gateway libcna libffi external library Класс CNA
  • 13. Caché Native Access Что это? • CNA — связка класса Caché и библиотеки, написанной на С • CNA — интерфейс для вызова функций из любых динамических библиотек • Ничего, кроме COS, для вызова функций не нужно • Цель CNA — расширение функциональности Caché за счет существующих библиотек
  • 14. Caché Native Access Что есть сейчас? Caché Callout Gateway • $ZF(-1) , $ZF(-2) • Позволяют вызывать системные команды и консольные программы • Недостатки: – Сильно ограничена передача аргументов – Нет всей функциональности библиотек
  • 15. Caché Native Access Что есть сейчас? Caché Callout Gateway • $ZF(-3) , $ZF(-5), $ZF( ) • Позволяют вызывать динамические и статические библиотеки специального вида (Callout Libraries) • Недостатки: – Чтобы сделать из обычной библиотеки Callout Library необходимо: • Иметь доступ к исходному коду • Иметь настроенное окружение для сборки • Для каждой функции прописать некоторое формальное описание – Поддерживается очень ограниченный набор типов (int и указатели),
  • 16. Caché Native Access Возможности • Можно вызывать функции из любой динамической библиотеки, бинарно совместимой с C • Поддержка всех простых типов языка C, size_t и указателей • Поддержка структур (и вложенных структур) • Поддержка потоков Caché • Работает на Linux (x86-32/64), Windows (x86-32/64)
  • 17. Caché Native Access • Linux: – make libffi && make • Windows – make libffi && make в mingw или mingw-w64 – или можно загрузить бинарные файлы • Импортируем файл cna.xml – do $system.OBJ.Load("путь к cna.xml", "c") Установка
  • 18. 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
  • 19. Caché Native Access Пример работы с CNA set cna = ##class(CNA.CNA).%New("libcna.dll") do cna.LoadLibrary("C:Windowssystem32msvcrt.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);
  • 21. Caché Native Access Подробности реализации • CNA основывается на libffi – libffi – интерфейс для вызова внешних функций – libffi поддерживает различные соглашения о вызове (calling conventions) • libffi – библиотека, написанная на C – То есть, для доступа в libffi из Caché, нужно использовать Callout Gateway • CNA – Callout Library и оболочка (wrapper) над libffi
  • 22. Caché Native Access Получение адреса функции • Мы хотим вызывать функцию, используя ее имя • Однако, для использования libffi нужен адрес функции • Чтобы получить адрес нужно использовать платформо-зависимые интерфейсы: POSIX и WinAPI – Функции dlopen() и dlsym() из POSIX – Функции LoadLibrary() и GetProcAddress() из WinAPI
  • 23. Caché Native Access Преобразование данных • Проблема: – Callout Gateway поддерживает очень мало типов данных • Решение: – преобразовывать данные на стороне Caché – в CNA передавать строки с бинарными данными в формате языка C
  • 25. Ссылки на ресурсы полезные и не очень J • Исходный код 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/
  • 26. Планы которых громадьё… • %DispatchXXX и более удобная обвязка на стороне COS • Пополнение примеров • Расширение списка типов и платформ • … Используйте! Делитесь успехами!
  • 27. Спасибо за внимание! Dmitry.Trefilov@intersystems.com
  • 28. Caché Native Access Новый механизм вызова сторонних библиотек Дмитрий Трефилов Санкт-Петербург, 2014