SWIG

SWIG
SWIG
Тип

Инструмент для разработки

Разработчики

Сообщество

Написана на

C, C++

Операционная система

POSIX, MS Windows

Последняя версия

2.0.4 (21 мая 2011)

Лицензия

Лицензия в стиле 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++ программа может дорабатываться намного быстрее. Скриптовый движок можно даже сделать доступным пользователям, чтобы они могли автоматизировать свою работу через скрипты. Такой приём повсеместно используется в играх для написания сюжета и уровней.
  • Даже если конечный продукт не будет включать скриптовый движок, тем не менее практика написания тестовых скриптов может оказаться полезной.

Есть несколько причин для создания динамических библиотек, которые могут загружаться существующими интерпретаторами:

Сам 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



Wikimedia Foundation. 2010.

Игры ⚽ Поможем решить контрольную работу

Полезное


Смотреть что такое "SWIG" в других словарях:

  • Swig — Тип Инструмент для разработки Разработчики Сообщество ОС MS Windows Версия 1.3.33 23 ноября 2007 Лицензия Лицензия в стиле BSD Сайт …   Википедия

  • SWIG — (Simplified Wrapper and Interface Generator) ist ein Programmierwerkzeug, das in C oder C++ geschriebene Module für andere Programmiersprachen, insbesondere Skriptsprachen, verfügbar macht. SWIG ist ein Open Source Projekt und… …   Deutsch Wikipedia

  • Swig — Swig, v. t. [Cf. D. zwelgen to swallow, E. swallow, v.t.] 1. To drink in long draughts; to gulp; as, to swig cider. [Colloq.] [1913 Webster] 2. To suck. [Obs. or Archaic] [1913 Webster] The lambkins swig the teat. Creech. [1913 Webster] …   The Collaborative International Dictionary of English

  • swig — [swıg] v past tense and past participle swigged present participle swigging [T] informal to drink something in large mouthfuls, especially from a bottle = ↑gulp ▪ He sat swigging beer and smoking. >swig n ▪ She took a long swig of coke …   Dictionary of contemporary English

  • Swig — Swig, v. t. [Cf. Prov. E. swig to leak out, AS. sw[=i]jian to be silent, sw[=i]can to evade, escape.] 1. To castrate, as a ram, by binding the testicles tightly with a string, so that they mortify and slough off. [Prov. Eng.] [1913 Webster] 2.… …   The Collaborative International Dictionary of English

  • swig — [ swıg ] verb intransitive or transitive INFORMAL to drink something from a bottle, can, glass, etc. carelessly and in large amounts ╾ swig noun count …   Usage of the words and phrases in modern English

  • swig — swig·gle; swig; swig·ger; …   English syllables

  • Swig — Swig, n. 1. A long draught. [Colloq.] Marryat. [1913 Webster] 2. (Naut.) A tackle with ropes which are not parallel. [1913 Webster] 3. A beverage consisting of warm beer flavored with spices, lemon, etc. [Prov. Eng.] [1913 Webster] …   The Collaborative International Dictionary of English

  • SWIG — (de l anglais Simplified Wrapper and Interface Generator) est un outil dont le code source est libre. Il permet de connecter des logiciels ou bibliothèques logicielles écrites en C/C++ avec des langages de scripts tels que : Tcl, Perl,… …   Wikipédia en Français

  • swig — [swig] Informal vt., vi. swigged, swigging [< ?] to drink, esp. in great gulps or quantities n. an instance of swigging; deep draft, esp. of liquor swigger n …   English World dictionary


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»