"SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек", Алексей Черкес
Кратко рассказано о том, что такое биндинг и Pуthon c API. Краткий обзор средств биндинга для Python. SWIG: что такое, зачем нужен, особенности, схема работы утилит, порядок запуска и сборки, принципы работы, как происходит сопоставление объектных моделей С++ и целевого языка. Примеры на Python и C#. Опыт применения, плюсы/минусы.
2. Why
High level (Python, Ruby, Java, C#, Go, … )
● Высокая скорость разработки (программы для людей)
o Быстрое создание прототипов
o Рефакторинг
o Легче делать UI, сетевое взаимодействие и т.п
o REPL
● Легко кастомизируется, конфигурируется и перенастраивается
Low level (С, С++ ?)
● Высокая скорость исполнения (программы для компьютеров)
● Доступ к системным компонентам (OpenGL, DirectX и т.п)
● Портируемость на уровне исходных кодов
● Огромное количество существующего и создаваемого кода (даже на чистом C)
o libgit (C89)
o libvirt
o systemd
o CPython!
● Debug cycle (compile, run, attach, debug …)
3. Survey
Extending and Embedding
Dynamic and Static
Python -- библиотека для компиляции и интерпретации
байт-кода написанная на C
Явный поиск и загрузка dll, so. Интроспекция бинарных объектов.
13. Python C API (use)
gcc -dynamiclib -I/usr/include/python2.5 -lpython -lreadline mod_readline.c
-o readline.so
Use setup.py instead
14. Python C API (conclusion)
● Самая тесная интеграция с Python из всех
возможных
● Лучшая производительность
● Нужно все время считать ссылки
● Нужно хорошо знать C
15. Python C API (conclusion)
● Несложный в понимании и изучении для
людей с C-background
● Хорошо документирован
● Объемный
● Опасно использовать не понимая
● Что если функций не 2 а 200?
16. Survey
● Python C API
● Ctypes
● Boost.Python
● Cython (pyrex)
● RPython
● SWIG
17. Boost.Python (keynotes)
● Позволяет небольшими усилиями экспортировать
типы из C++ в Python
● Без сторонних утилит, только С++ компилятор
● None intrusive wrapping (подходит для оборачивания
сторонних библиотек без изменения их кода)
● Extensions and embedding
18. Boost.Python (keynotes)
● Надежная устоявшаяся библиотека (в
boost фигню не берут)
● Обновляется не часто (последний коммит
осень 2013, минорная поддержка)
● Python 3 есть
● Много successful stories...
23. Boost.Python (features, version 2)
● References and Pointers
● Globally Registered Type Coercions
● Automatic Cross-Module Type Conversions
● Efficient Function Overloading
● C++ to Python Exception Translation
● Default Arguments
● Keyword Arguments
● Manipulating Python objects in C++
● Exporting C++ Iterators as Python Iterators
● Documentation Strings
24. Boost.Python (C++)
● Это modern С++, детка
● Потенциально медленная
компиляция
● Потонциально сложный для
отладки и анализа код
● Ошибки инстанцирования
шаблонов
● Не header-only библиотека
26. Survey
● Python C API
● Ctypes
● Boost.Python
● Cython (pyrex)
● RPython
● SWIG
27. Survey
● Python C API
● Ctypes
● Boost.Python
● Cython (pyrex)
● RPython
● SWIG
28. RPython
● Язык реализации PyPy
● Restricted Python
o Возможность статического вывода типов
o Types are inferred, not stated explicitly
o All that analysis happens on a whole-program basis!
● Трансформируется в C => компилируется
● RPython is not Python
29. Survey
● Python C API
● Ctypes
● Boost.Python
● Cython (pyrex)
● RPython
● SWIG
30. SWIG
● User story -- мультиплатформенная бизнес логика
● Simplified Wrapper and Interface Generator
● Проект развивался с 1995
● Зародился в университетских кругах
● Постоянно обновлятся, версии выходят часто
(последняя 2014.05.27)
● GPL license -- на SWIG, что хотите -- на
сгенерированный код
38. SWIG (example)
/* File : example.c *//* A global variable */double Foo = 3.0;/* Compute
the greatest common divisor of positive integers */int gcd(int x, int y) {
int g;
g = y;
while (x > 0) {
g = x;
x = y % x;
y = g;
}
return g;}
39. SWIG (example)
/* File : example.i */%module example%inline %{
extern int gcd(int x, int y);
extern double Foo;%}
46. SWIG (example)
# file: runme.pyimport example # Call our gcd() function
x = 42
y = 105
g = example.gcd(x,y)print "The gcd of %d and %d is %d" % (x,y,g)#
Manipulate the Foo global variable# Output its current valueprint "Foo = ",
example.cvar.Foo# Change its value
example.cvar.Foo = 3.1415926# See if the change took effectprint "Foo = ",
example.cvar.Foo
47. SWIG (interface file)
● Принцип отделения от оригинального *.h файла
● C, С++ препроцессор и парсер (include по
умолчанию выключены)
● % — начало всех SWIG директив
● %{ … }% -- копируется во wrap
48. SWIG (interface file)
● Принцип отделения от оригинального *.h файла
● C, С++ препроцессор и парсер (include по
умолчанию выключены)
● % — начало всех SWIG директив
● %{ … }% -- копируется во wrap
49. SWIG (cases)
● Работает очень прозрачно, без магии
● Basic Type Handling
o integers
o char -- строка
o bool -- int или bool, если есть
50. SWIG (cases)
● Simple pointers
o непрозрачные сущности
o храняться void* и type-tag (проверка типов на
границах)
o Разыменовать нельзя
o Получить значение можно, но это бессмысленно;
поменять значения нельзя
51. SWIG (cases)
● Simple pointers
disown() — снять флаг владения
acquire() — установить флаг владения
own() — проверка владения (bool)
next()
append()
61. SWIG (cunclusion)
● Написан на C, C++
● Без зависимостей (для запуска нужен один .exe), не
нужны целевые языки
● Доступен на многих платформах
● Работает очень быстро
● Хорошая документация
● Хороший генерируемый код (можно разобраться)
● Кастомизируемый (можно модифицировать
поведение генератора)
62. SWIG (cunclusion)
● Много языков (интересен универсальностью)
● Очень желательно понимать C/C++
● Не навязывает мораль (разрешает отстрелить ногу)
● Но при этом кастомизируемый, гибкий
● Требует немного больше времени на изучение, чем
Boost.Python, но начать с простого легко
● Хороший и прозрачный генерируемый код