SWIG: различия между версиями
[отпатрулированная версия] | [отпатрулированная версия] |
да вроде нет |
РоманСузи (обсуждение | вклад) →Ссылки: источники |
||
Строка 156: | Строка 156: | ||
* [http://sashkoblog.blogspot.com/2007/10/swig-c-ruby.html Опыты со SWIG’ом: C++ код и Ruby ] |
* [http://sashkoblog.blogspot.com/2007/10/swig-c-ruby.html Опыты со SWIG’ом: C++ код и Ruby ] |
||
* [http://habrahabr.ru/blogs/python/139790/ SWIG и Python под Windows] |
* [http://habrahabr.ru/blogs/python/139790/ SWIG и Python под Windows] |
||
== Литература == |
|||
* {{книга |
|||
|автор = Hans Petter Langtangen |
|||
|заглавие = Python Scripting for Computational Science |
|||
|издательство = Springer |
|||
|год = 2008 |
|||
|страниц = 750 |
|||
|isbn = 9783540739159 |
|||
}} |
|||
[[Категория:Свободные инструменты для разработки программного обеспечения]] |
[[Категория:Свободные инструменты для разработки программного обеспечения]] |
Версия от 18:43, 1 августа 2012
SWIG | |
---|---|
Тип | Инструмент для разработки |
Автор | Дэвид М. Бизли[d] |
Разработчик | Сообщество |
Написана на | C, C++ |
Операционные системы | POSIX, MS Windows |
Последняя версия | 2.0.4 (21 мая 2011) |
Репозиторий | github.com/swig/swig |
Лицензия | Лицензия в стиле BSD |
Сайт | www.swig.org |
SWIG (англ. Simplified Wrapper and Interface Generator) — свободный инструмент для не указано название статьи программ и библиотек написанных на C/C++ со скриптовыми языками, такими как Tcl, Perl, Python, Ruby, PHP или другими языками наподобие Java, C#, Scheme или OCaml. Основная цель — достигнуть связи с минимальными усилиями: в файлы заголовка программы добавляется небольшое количество указаний, по которым SWIG генерирует исходный код для склеивания C/C++ и нужного языка. В зависимости от языка, результат склеивания может быть представлен в трех формах:
- исполняемый файл исходной программы со встроенным интерпретатором скриптового языка
- разделяемая библиотека, к которой существующий интерпретатор может подключаться в виде расширения
- разделяемая библиотека, которая может подключаться к другим программам, написанным на нужном языке (например, с помощью JNI для Java)
Существует две основные причины для встраивания скриптового языка в C/C++ программу:
- С помощью скриптового языка вместо C/C++ программа может дорабатываться намного быстрее. Скриптовый движок можно даже сделать доступным пользователям, чтобы они могли автоматизировать свою работу через скрипты. Такой приём повсеместно используется в играх для написания сюжета и уровней.
- Даже если конечный продукт не будет включать скриптовый движок, тем не менее практика написания тестовых скриптов может оказаться полезной.
Есть несколько причин для создания динамических библиотек, которые могут загружаться существующими интерпретаторами:
- Предоставить доступ к C/C++ библиотеке при отсутствии аналогов в скриптовом языке
- Изначальное создание программы полностью на скриптовом языке и переписывание критических участков кода после анализа производительности на C/C++
Сам SWIG написан на С и C++ и публично доступен с февраля 1996 года. Он распространяется на условиях, схожих с лицензией BSD, то есть его можно использовать, распространять дальше и модифицировать практически без ограничений, для коммерческих и некоммерческих целей.
Простой пример использования SWIG (Python)
Предположим, что есть программа на C, реализующая некоторую функцию (печать текста):
/* File : try.c */
#include <stdio.h>
void echo(void) {
printf("\"what's the hell!\"\n");
/* printf("\"Hello World\"\n"); */
}
Для того чтобы можно было воспользоваться этой функцией из Python, нужно написать интерфейсный файл (расширение .i) примерно следующего содержания:
/* File : try.i */
%module mytry
extern void echo(void);
создание модуля расширения может быть выполнено примерно так (на *NIX):
>swig -python try.i
>gcc -c -fpic try_wrap.c try.c -DHAVE_CONFIG_H -I"/usr/local/include/python2.5" -I"/usr/local/lib/python2.5/config"
>gcc -shared try.o try_wrap.o -o _mytry.so
или так (на win* c cygwin):
>swig -python try.i
>gcc -c try_wrap.c try.c -DHAVE_CONFIG_H
>gcc -shared try_wrap.o try.o -o _try.pyd -lpython25
Результат работы
Набираем в интерпретаторе Python следующий текст
>>> import mytry
>>> mytry.echo()
"what's the hell!"
>>>
Если заглянуть внутрь mytry.py то можно увидеть
# This file was automatically generated by SWIG (http://www.swig.org).
# Version 1.3.36
#
# Don't modify this file, modify the SWIG interface instead.
# This file is compatible with both classic and new-style classes.
import _mytry
import new
new_instancemethod = new.instancemethod
try:
_swig_property = property
except NameError:
pass # Python < 2.2 doesn't have 'property'.
def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
if (name == "thisown"): return self.this.own(value)
if (name == "this"):
if type(value).__name__ == 'PySwigObject':
self.__dict__[name] = value
return
method = class_type.__swig_setmethods__.get(name,None)
if method: return method(self,value)
if (not static) or hasattr(self,name):
self.__dict__[name] = value
else:
raise AttributeError("You cannot add attributes to %s" % self)
def _swig_setattr(self,class_type,name,value):
return _swig_setattr_nondynamic(self,class_type,name,value,0)
def _swig_getattr(self,class_type,name):
if (name == "thisown"): return self.this.own()
method = class_type.__swig_getmethods__.get(name,None)
if method: return method(self)
raise AttributeError,name
def _swig_repr(self):
try: strthis = "proxy of " + self.this.__repr__()
except: strthis = ""
return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
import types
try:
_object = types.ObjectType
_newclass = 1
except AttributeError:
class _object : pass
_newclass = 0
del types
echo = _mytry.echo
Ссылки
Литература
- Hans Petter Langtangen. Python Scripting for Computational Science. — Springer, 2008. — 750 с. — ISBN 9783540739159.