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 betriebssystemunabhängig (plattformübergreifend) einsetzbar.

Als Ausgangssprachen werden C und C++, als Zielsprachen die Skriptsprachen Tcl, Perl, Python, Ruby, PHP, Lua und des Weiteren auch Java, C#, Scheme, Ocaml, R und Go unterstützt.

Funktionsweise

Bearbeiten

Die Vielzahl moderner Programmiersprachen ist nur deshalb sinnvoll nutzbar, weil alle diese Sprachen auf einen breiten Bestand bereits existierender, in Programmbibliotheken gebündelter Software zugreifen können. Betriebssystemnahe Bibliotheken sind überwiegend in C geschrieben. Eine Möglichkeit, C-Bibliotheken einzubinden, gehört deshalb zum Grundumfang jeder universell einsetzbaren Skriptsprache; eine Sprache muss einen solchen Mechanismus besitzen, um als Zielsprache in SWIG aufgenommen werden zu können.

Das Einbinden erfolgt in der Regel so, dass der Quellcode der Ausgangsbibliothek unverändert bleibt, und zusätzliche C-Funktionen, sogenannte Wrapper, erstellt werden. Diese Wrapper dienen als Schnittstelle zwischen der Bibliothek und der Zielsprache und können aus der Zielsprache aufgerufen werden, Parameter aus der Zielsprache übernehmen und Ergebnisse an diese zurückgeben. Da die Wrapper-Funktionen nur eine Schnittstellenanpassung vornehmen, rufen diese ihrerseits die entsprechende Funktion der Ausgangsbibliothek auf. Um eine einfache Nutzung in der Zielsprache zu erreichen, ist es meist auch nötig, in dieser Sprache die Aufrufe über Konstantendefinitionen und/oder Wrapper zu kapseln.

Diesen Prozess automatisiert SWIG weitgehend. Man muss lediglich die Header-Datei der Ausgangsbibliothek um einige spezifische Instruktionen erweitern oder ihn in einen SWIG-spezifischen Super-Header einbinden. Dann erzeugt SWIG C-Quelltext, der die Wrapper für sämtliche Funktionen der Ausgangsbibliothek enthält. Daneben wird auch der benötigte Wrapper-Code für die Zielsprache erzeugt. Bei Java z. B. die Aufrufe über das JNI.

Für die Erzeugung der Wrapper ist kein Zugriff auf den Quellcode der Ausgangsbibliothek erforderlich. Die Wrapper werden mit einem plattformspezifischen Compiler übersetzt und entweder mit in die Ausgangsbibliothek gelinkt oder in eine eigene Bibliothek geschrieben.

Da Swig lediglich ein Codegenerator ist und der Code durch den Compiler/Linker in die Bibliothek hineingeschrieben wird, ist bei der Nutzung aus der Zielsprache keine weitere Laufzeitumgebung notwendig.

Die Grenzen von SWIG werden im Wesentlichen durch die Zielsprache bestimmt. Es handelt sich dabei um alle Sprachelemente von C++ oder C, die dort nicht sinnvoll abgebildet werden können. Ein Beispiel ist die Mehrfachvererbung von C++, die es in anderen Sprachen kaum gibt. In diesen Fällen kann eine Anpassung des Quellcodes der Ausgangsbibliothek oder ein nochmaliges Kapseln notwendig werden.

Bearbeiten