SlideShare a Scribd company logo
1 of 64
SWIG
cоздание мультиязыковых интерфейсов
для C/C++ библиотек
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 …)
Survey
Extending and Embedding
Dynamic and Static
Python -- библиотека для компиляции и интерпретации
байт-кода написанная на C
Явный поиск и загрузка dll, so. Интроспекция бинарных объектов.
Survey
● Python C API
● Ctypes
● Boost.Python
● Cython (pyrex)
● RPython
● SWIG
● Shiboken (PySide)
● SIP (PyQt)
Survey
● Python C API
● Ctypes
● Boost.Python
● Cython (pyrex)
● RPython
● SWIG
● Shiboken (PySide)
● SIP (PyQt)
Python C API (пример)
Враппер над двумя функциями
char *readline(const char *);int
add_history(const char *);
Python C API (пример)
#include <Python.h>#include <readline/readline.h>
PyObject *
fn_readline(PyObject *self, PyObject *args){
char *prompt;
char *line;
PyObject *o;
if (!PyArg_ParseTuple(args, “s”, &prompt))
return NULL;
line = readline(prompt);
o = Py_BuildValue(“s”, line);
free(line);
return o;}
Python C API (пример)
PyObject *
fn_add_history(PyObject *self, PyObject *args){
char *line;
int status;
PyObject *o;
if (!PyArg_ParseTuple(args, "s", &line))
return NULL;
status = add_history(line);
o = Py_BuildValue("i", status);
return o;}
Python C API (пример)
Py_INCREF(Py_None); return Py_None;
Python C API (пример)
static PyMethodDef
methods[] = {
{"readline", fn_readline, METH_VARARGS, NULL},
{"add_history", fn_add_history, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}};
PyMODINIT_FUNC
initreadline(void){
(void) Py_InitModule("readline", methods);}
Python C API (пример)
PyMODINIT_FUNC PyInit_spam(void)
{
return PyModule_Create(&spammodule);
}
PyMODINIT_FUNC initspam(void)
{
(void) Py_InitModule("spam", SpamMethods);
}
Python C API (use)
Python C API (use)
gcc -dynamiclib -I/usr/include/python2.5 -lpython -lreadline mod_readline.c
-o readline.so
Use setup.py instead
Python C API (conclusion)
● Самая тесная интеграция с Python из всех
возможных
● Лучшая производительность
● Нужно все время считать ссылки
● Нужно хорошо знать C
Python C API (conclusion)
● Несложный в понимании и изучении для
людей с C-background
● Хорошо документирован
● Объемный
● Опасно использовать не понимая
● Что если функций не 2 а 200?
Survey
● Python C API
● Ctypes
● Boost.Python
● Cython (pyrex)
● RPython
● SWIG
Boost.Python (keynotes)
● Позволяет небольшими усилиями экспортировать
типы из C++ в Python
● Без сторонних утилит, только С++ компилятор
● None intrusive wrapping (подходит для оборачивания
сторонних библиотек без изменения их кода)
● Extensions and embedding
Boost.Python (keynotes)
● Надежная устоявшаяся библиотека (в
boost фигню не берут)
● Обновляется не часто (последний коммит
осень 2013, минорная поддержка)
● Python 3 есть
● Много successful stories...
Boost.Python (projects)
Их много, например …
● Civilization IV
● OpenSceneGraph Bindings
● PythonMagick
● Fusion (часть Twisted)
Boost.Python (code)
char const* greet(){
return "hello, world";}
>>> import hello_ext>>>
print hello_ext.greet()
hello, world
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(hello_ext){
using namespace boost::python;
def("greet", greet);}
Boost.Python (code)
class_<World>("World", init<std::string>())
.def(init<double, double>())
.def("greet", &World::greet)
.def("set", &World::set);
struct World{
World(std::string msg): msg(msg) {} // added constructor
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;};
Boost.Python (features)
● Constructors
● Class Properties
● Inheritance
● Class Virtual Functions
● Virtual Functions with Default
Implementations
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
Boost.Python (C++)
● Это modern С++, детка
● Потенциально медленная
компиляция
● Потонциально сложный для
отладки и анализа код
● Ошибки инстанцирования
шаблонов
● Не header-only библиотека
Boost.Python (conclusion)
Отличная библиотека, если не боитесь C++
Survey
● Python C API
● Ctypes
● Boost.Python
● Cython (pyrex)
● RPython
● SWIG
Survey
● Python C API
● Ctypes
● Boost.Python
● Cython (pyrex)
● RPython
● SWIG
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
Survey
● Python C API
● Ctypes
● Boost.Python
● Cython (pyrex)
● RPython
● SWIG
SWIG
● User story -- мультиплатформенная бизнес логика
● Simplified Wrapper and Interface Generator
● Проект развивался с 1995
● Зародился в университетских кругах
● Постоянно обновлятся, версии выходят часто
(последняя 2014.05.27)
● GPL license -- на SWIG, что хотите -- на
сгенерированный код
SWIG (langs)
Allegro CL
C#
CFFI
CLISP
Chicken
D
Go
Guile
Java
Javascript
UFFI
Lua
Modula-3
Mzscheme
OCAML
Octave
Perl
PHP
Python
R
Ruby
Tcl
SWIG (projects)
● Subversion
● PyOgre
● PyOpenGL
● wxPython
● XML::Xerces
● OpenCV
● Crystal Space 3D
● … (много других)
example.c
example.h
example.c
example.h
example.i
example.c
example.h
example_wrap.c
example.py
example.i
SWIG
example.c
example.h
example_wrap.c
example.py
example.i python setup.by build
_example.so (pyd)
example.c
example.h
example_wrap.c
example.py
example.i pip install -e .
_example.so (pyd)
module example
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;}
SWIG (example)
/* File : example.i */%module example%inline %{
extern int gcd(int x, int y);
extern double Foo;%}
SWIG (example)
example_wrap.c
около 4000 строк кода
#ifdef __cplusplus
extern "C" {#endif
SWIGINTERN PyObject *_wrap_gcd(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
int arg1 ;
int arg2 ;
int val1 ;
int ecode1 = 0 ;
int val2 ;
int ecode2 = 0 ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
int result;
if (!PyArg_ParseTuple(args,(char *)"OO:gcd",&obj0,&obj1)) SWIG_fail;
ecode1 = SWIG_AsVal_int(obj0, &val1);
if (!SWIG_IsOK(ecode1)) {
SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "gcd" "', argument " "1"" of type '" "int""'");
}
arg1 = static_cast< int >(val1);
ecode2 = SWIG_AsVal_int(obj1, &val2);
if (!SWIG_IsOK(ecode2)) {
SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "gcd" "', argument " "2"" of type '" "int""'");
}
arg2 = static_cast< int >(val2);
result = (int)gcd(arg1,arg2);
resultobj = SWIG_From_int(static_cast< int >(result));
return resultobj;
fail:
return NULL;}
#ifdef __cplusplus
extern "C" {#endif
SWIGINTERN PyObject *_wrap_gcd(PyObject *SWIGUNUSEDPARM(self),
PyObject *args) {
PyObject *resultobj = 0;
int arg1 ;
int arg2 ;
int val1 ;
int ecode1 = 0 ;
int val2 ;
int ecode2 = 0 ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
int result;
...}
if (!PyArg_ParseTuple(args,(char *)"OO:gcd",&obj0,&obj1)) SWIG_fail;
ecode1 = SWIG_AsVal_int(obj0, &val1);
if (!SWIG_IsOK(ecode1)) {
SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "gcd" "',
argument " "1"" of type '" "int""'");
}
arg1 = static_cast< int >(val1);
result = (int)gcd(arg1,arg2);
resultobj = SWIG_From_int(static_cast< int >(result));
return resultobj;
fail:
return NULL;
}
SWIG (example)
example.py
80 строк кода
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
SWIG (interface file)
● Принцип отделения от оригинального *.h файла
● C, С++ препроцессор и парсер (include по
умолчанию выключены)
● % — начало всех SWIG директив
● %{ … }% -- копируется во wrap
SWIG (interface file)
● Принцип отделения от оригинального *.h файла
● C, С++ препроцессор и парсер (include по
умолчанию выключены)
● % — начало всех SWIG директив
● %{ … }% -- копируется во wrap
SWIG (cases)
● Работает очень прозрачно, без магии
● Basic Type Handling
o integers
o char -- строка
o bool -- int или bool, если есть
SWIG (cases)
● Simple pointers
o непрозрачные сущности
o храняться void* и type-tag (проверка типов на
границах)
o Разыменовать нельзя
o Получить значение можно, но это бессмысленно;
поменять значения нельзя
SWIG (cases)
● Simple pointers
disown() — снять флаг владения
acquire() — установить флаг владения
own() — проверка владения (bool)
next()
append()
SWIG (cases)
%module fileioFILE *fopen(char *, char *);int fclose(FILE *);unsigned
fread(void *ptr, unsigned size, unsigned nobj, FILE *);unsigned fwrite(void
*ptr, unsigned size, unsigned nobj, FILE *);void *malloc(int nbytes);void
free(void *);
SWIG (cases)
# Copy a file def filecopy(source,target):
f1 = fopen(source,"r")
f2 = fopen(target,"w")
buffer = malloc(8192)
nbytes = fread(buffer,8192,1,f1)
while (nbytes > 0):
fwrite(buffer,8192,1,f2)
nbytes = fread(buffer,8192,1,f1)
free(buffer)
SWIG (cases)
● Derived types, structs, and classes
Everything else is a
pointer
Даже Undefined data types
+ Proxy
SWIG (cases)
struct Vector {
double x,y,z;
}
SWIG (cases)
struct Vector {
double x,y,z;
}
SWIG (cases)
double Vector_x_get(struct Vector *obj) {
return obj->x;}double Vector_y_get(struct Vector *obj) {
return obj->y;}double Vector_z_get(struct Vector *obj) {
return obj->z;}void Vector_x_set(struct Vector *obj, double value) {
obj->x = value;}void Vector_y_set(struct Vector *obj, double value) {
obj->y = value;}void Vector_z_set(struct Vector *obj, double value) {
obj->z = value;}
SWIG (cases)
struct Vector *new_Vector() {
return (Vector *) calloc(1,sizeof(struct
Vector));}void delete_Vector(struct Vector *obj) {
free(obj);}
SWIG (cases)
v = new_Vector()
Vector_x_set(v,2)
Vector_y_set(v,10)
Vector_z_set(v,-5)...
delete_Vector(v)
SWIG (cases)
class Vector(_object):
__swig_setmethods__ = {}
__setattr__ = lambda self, name, value: _swig_setattr(self, Vector, name, value)
__swig_getmethods__ = {}
__getattr__ = lambda self, name: _swig_getattr(self, Vector, name)
__repr__ = _swig_repr
__swig_setmethods__["x"] = _example.Vector_x_set
__swig_getmethods__["x"] = _example.Vector_x_get
if _newclass:x = _swig_property(_example.Vector_x_get, _example.Vector_x_set)
__swig_setmethods__["y"] = _example.Vector_y_set
__swig_getmethods__["y"] = _example.Vector_y_get
if _newclass:y = _swig_property(_example.Vector_y_get, _example.Vector_y_set)
__swig_setmethods__["z"] = _example.Vector_z_set
__swig_getmethods__["z"] = _example.Vector_z_get
if _newclass:z = _swig_property(_example.Vector_z_get, _example.Vector_z_set)
def __init__(self):
this = _example.new_Vector() try: self.this.append(this) except: self.this = this
__swig_destroy__ = _example.delete_Vector
__del__ = lambda self : None;
Vector_swigregister = _example.Vector_swigregister
Vector_swigregister(Vector)
SWIG (cunclusion)
● Написан на C, C++
● Без зависимостей (для запуска нужен один .exe), не
нужны целевые языки
● Доступен на многих платформах
● Работает очень быстро
● Хорошая документация
● Хороший генерируемый код (можно разобраться)
● Кастомизируемый (можно модифицировать
поведение генератора)
SWIG (cunclusion)
● Много языков (интересен универсальностью)
● Очень желательно понимать C/C++
● Не навязывает мораль (разрешает отстрелить ногу)
● Но при этом кастомизируемый, гибкий
● Требует немного больше времени на изучение, чем
Boost.Python, но начать с простого легко
● Хороший и прозрачный генерируемый код
SWIG (cunclusion)
Может оказаться очень полезным
элементом архитектуры
Спасибо за внимание!
aleksei.cherkes@gmail.com
https://www.facebook.com/aleksei.cherkes

More Related Content

What's hot

Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Введение в потоки питона
Введение в потоки питонаВведение в потоки питона
Введение в потоки питонаAndrey Niahajchyk
 
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonMaxim Kulsha
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
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
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and catscorehard_by
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
"Модифицируй это!" или "Больше магии Python с помощью изменения AST""Модифицируй это!" или "Больше магии Python с помощью изменения AST"
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"PyNSK
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Groovy presentation on Exception #7 conference
Groovy presentation on Exception #7 conferenceGroovy presentation on Exception #7 conference
Groovy presentation on Exception #7 conferencevoituk
 
ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3it-people
 

What's hot (20)

Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Введение в потоки питона
Введение в потоки питонаВведение в потоки питона
Введение в потоки питона
 
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 Practical Python Packaging / Стас Рудаков / Web Developer Wargaming Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
Practical Python Packaging / Стас Рудаков / Web Developer Wargaming
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
"Модифицируй это!" или "Больше магии Python с помощью изменения AST""Модифицируй это!" или "Больше магии Python с помощью изменения AST"
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Groovy presentation on Exception #7 conference
Groovy presentation on Exception #7 conferenceGroovy presentation on Exception #7 conference
Groovy presentation on Exception #7 conference
 
ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 

Viewers also liked

Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingPython Meetup
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Python Meetup
 
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Python Meetup
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Python Meetup
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Python Meetup
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...Python Meetup
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюPython Meetup
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Python Meetup
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка TwistedPython Meetup
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014Python Meetup
 

Viewers also liked (13)

Про асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer WargamingПро асинхронность / Максим Щепелин / Web Developer Wargaming
Про асинхронность / Максим Щепелин / Web Developer Wargaming
 
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
Как скачать статистику игроков World of Tanks / Павел Пересторонин [Python Me...
 
Pebble
PebblePebble
Pebble
 
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15] Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
Machine learning with Python / Олег Шидловский / Doist [Python Meetup 27.03.15]
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
Почему я пишу хороший код, но его никто не ценит, кроме моей мамы / Павел Меш...
 
Wargaming: тыл - фронту!
Wargaming: тыл - фронту!Wargaming: тыл - фронту!
Wargaming: тыл - фронту!
 
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
OpenSource CMS и ERP система в одном флаконе / Олег Курьян / технический дире...
 
Redis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностьюRedis. Как мы боролись со сложностью
Redis. Как мы боролись со сложностью
 
Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне Обзор способов написания конкурентных программ в питоне
Обзор способов написания конкурентных программ в питоне
 
Обзор фреймворка Twisted
Обзор фреймворка TwistedОбзор фреймворка Twisted
Обзор фреймворка Twisted
 
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
S.O.L.I.D. - Павел Кохан, Python Meetup 26.09.2014
 

Similar to SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек

доклад про Llvm
доклад про Llvmдоклад про Llvm
доклад про LlvmVadim Evard
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPythonAnton Patrushev
 
[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)Alexander Bausk
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodNikita Baksalyar
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
 
Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3it-people
 
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)IT-Доминанта
 
Инструменты профайлинга С++ кода
Инструменты профайлинга С++ кодаИнструменты профайлинга С++ кода
Инструменты профайлинга С++ кодаcorehard_by
 
Mixing c++ and python
Mixing c++ and pythonMixing c++ and python
Mixing c++ and pythoncorehard_by
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON
 
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питонеekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питонеit-people
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Nikita Baksalyar
 
Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Fwdays
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
 

Similar to SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек (20)

доклад про Llvm
доклад про Llvmдоклад про Llvm
доклад про Llvm
 
Erlang
ErlangErlang
Erlang
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPython
 
[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
DevOps для 1С
DevOps для 1СDevOps для 1С
DevOps для 1С
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3
 
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)
 
Инструменты профайлинга С++ кода
Инструменты профайлинга С++ кодаИнструменты профайлинга С++ кода
Инструменты профайлинга С++ кода
 
Mixing c++ and python
Mixing c++ and pythonMixing c++ and python
Mixing c++ and python
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питонеekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Отладка в Python: 2016 edition
Отладка в Python: 2016 editionОтладка в Python: 2016 edition
Отладка в Python: 2016 edition
 
Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016
 
Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 

More from Python Meetup

Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данныхPython Meetup
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Python Meetup
 
Использование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиИспользование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиPython Meetup
 
Введение в GIL и новый GIL
Введение в GIL и новый GILВведение в GIL и новый GIL
Введение в GIL и новый GILPython Meetup
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки PythonPython Meetup
 
Социальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаСоциальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаPython Meetup
 
Портируем на Python 3
Портируем на Python 3Портируем на Python 3
Портируем на Python 3Python Meetup
 
Garbage collector and a bit of memory management
Garbage collector and a bit of memory managementGarbage collector and a bit of memory management
Garbage collector and a bit of memory managementPython Meetup
 
Неочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкцийНеочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкцийPython Meetup
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Dictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txtDictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txtPython Meetup
 

More from Python Meetup (11)

Python для анализа данных
Python для анализа данныхPython для анализа данных
Python для анализа данных
 
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
 
Использование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузкиИспользование gevent для эмуляции высокой нагрузки
Использование gevent для эмуляции высокой нагрузки
 
Введение в GIL и новый GIL
Введение в GIL и новый GILВведение в GIL и новый GIL
Введение в GIL и новый GIL
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки Python
 
Социальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшенаСоциальный игровой сервер на Python: от первого коммита до продакшена
Социальный игровой сервер на Python: от первого коммита до продакшена
 
Портируем на Python 3
Портируем на Python 3Портируем на Python 3
Портируем на Python 3
 
Garbage collector and a bit of memory management
Garbage collector and a bit of memory managementGarbage collector and a bit of memory management
Garbage collector and a bit of memory management
 
Неочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкцийНеочевидное поведение некоторых конструкций
Неочевидное поведение некоторых конструкций
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Dictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txtDictionary в Python. По мотивам Objects/dictnotes.txt
Dictionary в Python. По мотивам Objects/dictnotes.txt
 

SWIG — cоздание мультиязыковых интерфейсов для C/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. Интроспекция бинарных объектов.
  • 4. Survey ● Python C API ● Ctypes ● Boost.Python ● Cython (pyrex) ● RPython ● SWIG ● Shiboken (PySide) ● SIP (PyQt)
  • 5. Survey ● Python C API ● Ctypes ● Boost.Python ● Cython (pyrex) ● RPython ● SWIG ● Shiboken (PySide) ● SIP (PyQt)
  • 6. Python C API (пример) Враппер над двумя функциями char *readline(const char *);int add_history(const char *);
  • 7. Python C API (пример) #include <Python.h>#include <readline/readline.h> PyObject * fn_readline(PyObject *self, PyObject *args){ char *prompt; char *line; PyObject *o; if (!PyArg_ParseTuple(args, “s”, &prompt)) return NULL; line = readline(prompt); o = Py_BuildValue(“s”, line); free(line); return o;}
  • 8. Python C API (пример) PyObject * fn_add_history(PyObject *self, PyObject *args){ char *line; int status; PyObject *o; if (!PyArg_ParseTuple(args, "s", &line)) return NULL; status = add_history(line); o = Py_BuildValue("i", status); return o;}
  • 9. Python C API (пример) Py_INCREF(Py_None); return Py_None;
  • 10. Python C API (пример) static PyMethodDef methods[] = { {"readline", fn_readline, METH_VARARGS, NULL}, {"add_history", fn_add_history, METH_VARARGS, NULL}, {NULL, NULL, 0, NULL}}; PyMODINIT_FUNC initreadline(void){ (void) Py_InitModule("readline", methods);}
  • 11. Python C API (пример) PyMODINIT_FUNC PyInit_spam(void) { return PyModule_Create(&spammodule); } PyMODINIT_FUNC initspam(void) { (void) Py_InitModule("spam", SpamMethods); }
  • 12. Python C API (use)
  • 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...
  • 19. Boost.Python (projects) Их много, например … ● Civilization IV ● OpenSceneGraph Bindings ● PythonMagick ● Fusion (часть Twisted)
  • 20. Boost.Python (code) char const* greet(){ return "hello, world";} >>> import hello_ext>>> print hello_ext.greet() hello, world #include <boost/python.hpp> BOOST_PYTHON_MODULE(hello_ext){ using namespace boost::python; def("greet", greet);}
  • 21. Boost.Python (code) class_<World>("World", init<std::string>()) .def(init<double, double>()) .def("greet", &World::greet) .def("set", &World::set); struct World{ World(std::string msg): msg(msg) {} // added constructor void set(std::string msg) { this->msg = msg; } std::string greet() { return msg; } std::string msg;};
  • 22. Boost.Python (features) ● Constructors ● Class Properties ● Inheritance ● Class Virtual Functions ● Virtual Functions with Default Implementations
  • 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, что хотите -- на сгенерированный код
  • 32. SWIG (projects) ● Subversion ● PyOgre ● PyOpenGL ● wxPython ● XML::Xerces ● OpenCV ● Crystal Space 3D ● … (много других)
  • 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;%}
  • 41. #ifdef __cplusplus extern "C" {#endif SWIGINTERN PyObject *_wrap_gcd(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; if (!PyArg_ParseTuple(args,(char *)"OO:gcd",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "gcd" "', argument " "1"" of type '" "int""'"); } arg1 = static_cast< int >(val1); ecode2 = SWIG_AsVal_int(obj1, &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "gcd" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); result = (int)gcd(arg1,arg2); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL;}
  • 42. #ifdef __cplusplus extern "C" {#endif SWIGINTERN PyObject *_wrap_gcd(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; int result; ...}
  • 43. if (!PyArg_ParseTuple(args,(char *)"OO:gcd",&obj0,&obj1)) SWIG_fail; ecode1 = SWIG_AsVal_int(obj0, &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "gcd" "', argument " "1"" of type '" "int""'"); } arg1 = static_cast< int >(val1);
  • 44. result = (int)gcd(arg1,arg2); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; }
  • 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()
  • 52. SWIG (cases) %module fileioFILE *fopen(char *, char *);int fclose(FILE *);unsigned fread(void *ptr, unsigned size, unsigned nobj, FILE *);unsigned fwrite(void *ptr, unsigned size, unsigned nobj, FILE *);void *malloc(int nbytes);void free(void *);
  • 53. SWIG (cases) # Copy a file def filecopy(source,target): f1 = fopen(source,"r") f2 = fopen(target,"w") buffer = malloc(8192) nbytes = fread(buffer,8192,1,f1) while (nbytes > 0): fwrite(buffer,8192,1,f2) nbytes = fread(buffer,8192,1,f1) free(buffer)
  • 54. SWIG (cases) ● Derived types, structs, and classes Everything else is a pointer Даже Undefined data types + Proxy
  • 55. SWIG (cases) struct Vector { double x,y,z; }
  • 56. SWIG (cases) struct Vector { double x,y,z; }
  • 57. SWIG (cases) double Vector_x_get(struct Vector *obj) { return obj->x;}double Vector_y_get(struct Vector *obj) { return obj->y;}double Vector_z_get(struct Vector *obj) { return obj->z;}void Vector_x_set(struct Vector *obj, double value) { obj->x = value;}void Vector_y_set(struct Vector *obj, double value) { obj->y = value;}void Vector_z_set(struct Vector *obj, double value) { obj->z = value;}
  • 58. SWIG (cases) struct Vector *new_Vector() { return (Vector *) calloc(1,sizeof(struct Vector));}void delete_Vector(struct Vector *obj) { free(obj);}
  • 59. SWIG (cases) v = new_Vector() Vector_x_set(v,2) Vector_y_set(v,10) Vector_z_set(v,-5)... delete_Vector(v)
  • 60. SWIG (cases) class Vector(_object): __swig_setmethods__ = {} __setattr__ = lambda self, name, value: _swig_setattr(self, Vector, name, value) __swig_getmethods__ = {} __getattr__ = lambda self, name: _swig_getattr(self, Vector, name) __repr__ = _swig_repr __swig_setmethods__["x"] = _example.Vector_x_set __swig_getmethods__["x"] = _example.Vector_x_get if _newclass:x = _swig_property(_example.Vector_x_get, _example.Vector_x_set) __swig_setmethods__["y"] = _example.Vector_y_set __swig_getmethods__["y"] = _example.Vector_y_get if _newclass:y = _swig_property(_example.Vector_y_get, _example.Vector_y_set) __swig_setmethods__["z"] = _example.Vector_z_set __swig_getmethods__["z"] = _example.Vector_z_get if _newclass:z = _swig_property(_example.Vector_z_get, _example.Vector_z_set) def __init__(self): this = _example.new_Vector() try: self.this.append(this) except: self.this = this __swig_destroy__ = _example.delete_Vector __del__ = lambda self : None; Vector_swigregister = _example.Vector_swigregister Vector_swigregister(Vector)
  • 61. SWIG (cunclusion) ● Написан на C, C++ ● Без зависимостей (для запуска нужен один .exe), не нужны целевые языки ● Доступен на многих платформах ● Работает очень быстро ● Хорошая документация ● Хороший генерируемый код (можно разобраться) ● Кастомизируемый (можно модифицировать поведение генератора)
  • 62. SWIG (cunclusion) ● Много языков (интересен универсальностью) ● Очень желательно понимать C/C++ ● Не навязывает мораль (разрешает отстрелить ногу) ● Но при этом кастомизируемый, гибкий ● Требует немного больше времени на изучение, чем Boost.Python, но начать с простого легко ● Хороший и прозрачный генерируемый код
  • 63. SWIG (cunclusion) Может оказаться очень полезным элементом архитектуры