Open Source im professionellen Einsatz
Linux-Magazin 07/2004

Tcl-Erweiterungen selbst entwickeln

Weltenwanderer

Tcl-Erweiterungen in C oder C++ sind leichter zu entwickeln, als viele Programmierer denken. Mit wenigen Zeilen C-Code sind zeitkritische Funktionen oder Hardware-nahe Routinen implementiert. Tcl-Skripte nutzen diese Ergänzungen ebenso bequem wie vorhandene Routinen oder eigene Prozeduren.

677

Programmierer trennen ihre Sprachen grob in zwei Welten auf: Skriptsprachen und Compilersprachen. Diese Teilung setzt sich bei den Entwicklern selbst fort, die meisten fühlen sich nur in einer der beiden Sprachwelten heimisch und scheuen die andere.

Dank der enormen Menge an Tcl-Erweiterungen ist die Skriptwelt ziemlich groß, fast alle Aufgaben lassen sich mit reinem Tcl oder einer fertigen Erweiterung erledigen. Hin und wieder gibt es aber ein Problem, das sich nicht so leicht lösen lässt. Doch jeder Tcl-Entwickler darf den Sprung in die kompilierende Parallelwelt wagen. Schon ein paar Funktionen aus der C-API von Tcl genügen, um eine Erweiterung (in Form einer Shared Library) zu entwickeln.

Zudem sind viele Probleme, mit denen sich die C-Programmierer herumschlagen müssen, in der Tcl-API schon gelöst - sogar plattformübergreifend. Das betrifft den kompletten Bereich der Stringbearbeitung, die Speicherverwaltung sowie das Dateisystem.

Die Dokumentation der API liegt als Sammlung von Manualseiten vor: »man Tcl_SetVar« zeigt beispielsweise die Funktion, mit der C-Code eine Tcl-Variable setzt. Ein kompletter Überblick über die API findet sich auf[1]. Für den Einstieg genügen aber wenige, gängige Routinen.

Objekte statt Strings

Vor der Tcl-Version 8.0 galt der Grundsatz "Alles ist ein String", der Interpreter verarbeitete ausschließlich Zeichenketten. Der Performance war dies allerdings sehr abträglich, beim Übergang von Tcl zu C und zurück zu Tcl wurde eine Zahl jedes Mal zwischen String und Integer konvertiert. Um diese ständigen Umwandlungen zu vermeiden, führte Tcl 8.0 das »Tcl_Obj« als zentralen Datentyp ein. Nach außen hin verhält sich das Objekt wie ein String, es enthält jedoch auch einen Long, Double oder Pointer auf andere Datenstrukturen.

Bei Berechnungen mit »Tcl_Obj« reicht die einmalige Umwandlung von String in den jeweiligen Typ, danach kann der C-Code ohne Umschweife auf den gewünschten Typ zugreifen. Das Objekt speichert auch, welche der Darstellungen auf dem aktuellen Stand ist, und erzeugt beispielsweise die String-Form erst wieder, wenn das Programm sie auch benötigt. Die Tcl-Entwickler haben die alten String-basierten Funktionen aber nicht abgeschafft, sondern jeweils eine neue Version mit »Obj« im Namen hinzugefügt. Aus Performancegründen sind die neuen Funktionen zu bevorzugen.

Grundstruktur einer Erweiterung

Der Aufbau einer Tcl-Erweiterung ist reicht einfach. Sie muss sich initialisieren, die Tcl-Kommandos definieren und Code enthalten, der die neuen Kommandos in die Tat umsetzt. Ein einfaches Hallo-Welt-Beispiel findet sich in Listing 1. Es stellt das neue Tcl-Kommando »hallo« zur Verfügung, das den String »Hallo Welt!« zurückgibt.

Listing 1: Einfache
Tcl-Erweiterung

01 /* Hello World als Tcl-Erweiterung */
02 
03 #include <tcl.h>
04 
05 /* Vorwärtsdeklaration des Kommandos */
06 int Hallo_Kommando (ClientData cdata,
07   Tcl_Interp *interp, int objc,
08   Tcl_Obj * CONST objv[]);
09 
10 /* Erweiterung initialisieren; diese
11  * Funktion wird beim Laden vom Interpreter
12  * aufgerufen.
13  * @param interp, Pointer auf den Interpreter
14  * @return Status, TCL_OK oder TCL_ERROR
15  */
16 int Hallo_Init (Tcl_Interp *interp)
17 {
18 #ifdef USE_TCL_STUBS
19   if (Tcl_InitStubs(interp, "8.1", 0) == 0L) {
20     return TCL_ERROR;
21   }
22 #endif
23 
24   /* Das hallo-Kommando erzeugen */
25   Tcl_CreateObjCommand (interp, "hallo",
26     Hallo_Kommando, NULL, NULL);
27   return TCL_OK;
28 }
29 
30 /* Das hallo-Kommando ausführen
31  * @param interp, der Interpreter
32  * @param objc, Anzahl der Eingabeobjekte
33  * @param objv[], Array mit Eingabeobjekten
34  * @return Status, TCL_OK oder TCL_ERROR
35  */
36 int Hallo_Kommando (ClientData cdata,
37   Tcl_Interp *interp, int objc,
38   Tcl_Obj * CONST objv[])
39 {
40   Tcl_Obj* retval = Tcl_NewStringObj(
41     "Hallo Welt!", -1);
42   Tcl_SetObjResult (interp, retval);
43   return TCL_OK;
44 }

Einstiegspunkt der Erweiterung ist die »Hallo_Init()«-Funktion, hier hinein gehört der gesamte Code zur Initialisierung von Datenstrukturen und Kommandos. Die Init-Funktion wird beim Laden der Erweiterung automatisch aufgerufen. Ihr Name setzt sich aus dem Namen der Bibliothek (mit großem Anfangsbuchstaben) plus »_Init«-Anhängsel zusammen. Für das Beispiel muss die Bibliothek also »libhallo.so« heißen.

Früher funktionierten Erweiterungen nur zusammen mit jener Tcl-Version, für die sie kompiliert wurden. Obwohl Erweiterungen als Shared Library ausgeführt sind, benötigen sie auch Funktionen aus der Tcl-API; diese Bibliothek hat der Tcl-Interpreter aber bereits gelinkt. Damit entsteht eine gegenseitige Abhängigkeit, die sich nur auflösen lässt, wenn Interpreter und Erweiterung identische API-Versionen verwenden.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Fremde Federn

    Java und Tcl ergänzen sich bestens und profitieren voneinander: Ein Testskript für eine Java-Applikation ist in Tcl schneller geschrieben als in Java. Andererseits wollen Tcl-Entwickler gelegentlich Java-Pakete nutzen. Jacl und Tclblend geben ihnen diese Freiheiten.

  • Grüße vom Trabanten

    Klein, schlank und schnell - mit diesen Attributen eroberte Lua die Herzen der Spielehersteller. Aber auch in ernsteren Anwendungsbereichen beweist die Skriptsprache, deren Name auf Portugiesisch Mond bedeutet, ihre Leistungsfähigkeit - und dies nicht nur durch den Einsatz einiger ungewöhnlicher Konzepte.

  • Aus dem Labor

    An der Uni Melbourne entstand eine Sprache, die unentbehrliche Programmierparadigmen vereint und bei Geschwindigkeit, Zuverlässigkeit und Skalierbarkeit überzeugt. Das Hightech -Produkt bewährt sich nicht nur in der Forschung, sondern auch in der Praxis.

  • Stets zu Diensten

    Ob Wörterbuch oder Wetterbericht, immer mehr Dienste stehen im Internet als Webservice bereit. Per Tcl-SOAP binden auch Tcl-Entwickler diese Dienste bequem in ihre Software ein.

  • PHP Unit

    Unit-Tests sorgen für funktionierende und wartbare Software. Dieser Artikel zeigt PHP-Entwicklern, wie sie mit dem Tool PHP Unit den Einstieg in die testgetriebene Entwicklung finden.

comments powered by Disqus

Ausgabe 07/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.