Jacl steht für "Java Command Language" und ist ein in Java geschriebener Tcl Interpretierer ohne eine Toolkit (Tk) Implementierung. Der Entwickler, der den Tcl-Interpretierer 1997 in Java als Student geschrieben und veröffentlicht hat, war Ioi Lam. Doch inzwischen arbeitet vor allem Mo DeJong von RedHat an Jacl, welches zum Tcl/Java-Projekt gehört. Die aktuelle Version ist 1.4.0, die am 21.08.2006 erschienen ist. Die bedeutendste Erweiterung der aktuellen Version ist der "Tcl to Java Compiler" (TJC), welcher ein Tcl Skript in Java-Byte-Code konvertiert, der dann direkt in der JVM ausführbar ist. Dadurch kann ein von TJC kompiliertes Programm 10 bis 20 mal schneller ausgeführt werden, als beim Interpretieren. Der TJC kann in zwei Arten benutzt werden, entweder in Laufzeit oder im Stapelbetrieb.
In unserem ersten Beispiel geben wir die aktuelle Zeit mit der Nutzung von Tcl wieder. Dafür nutzen wir den Tcl Interpretierer. In diesem Fall werden Befehle in Form von Strings in der Methode eval interpretiert. Bei einem Fehler würde eval eine TclException werfen. Ein Syntaxfehler wäre ein möglicher Fehler. Zum Schluß löschen wir den Interpretierer.
Diese Art der Implementierung von Tcl ist nicht gerade benutzerfreundlich und sehr unelegant. Wie man es besser machen kann, sehen wir nun im nächsten Beispiel.
Wir lagern nun den Tcl Code in einer Tcl-Datei aus.
Nun führen wir die Skriptdatei mit dem Tcl Interpretierer in Java aus. Falls die Datei nicht existiert, wird eine TclException geworfen. So kommen wir auch gleich zur Interaktion zwischen Java und Tcl. In diesem Beispiel holen wir uns nach der Ausführung der Datei die Variable "x", welche in der Datei benutzt wurde, in die Java Welt mit Hilfe der Methode getVar. Nachdem ändern wir die Variable "x" im Tcl Interpretierer.
So könnte man vor der Ausführung eines Skriptes, die im Sktipt benötigten Variablen als Parameter und Rückgabewert nutzen.
In den beiden vorigen Beispielen ging ich auf die Interaktion der Tcl Variablen in der Java Welt ein. Nun werde ich Ihnen zeigen, wie hingegen Tcl mit Java Elementen arbeitet. Dazu gibt man erst einmal package require java ein. Nun stehen in Tcl eine Reihe neuer Befehle im namensraum "java" zur Verfügung.
In diesem Beispiel wird in Tcl ein String-Objekt aus Java erzeugt. Dieses Objekt kann auf die Methoden der String Klasse zugreifen, wie z.B. toString(), length(),...
Legende zur Verdeutlichung:
Hier eine kleine Auflistung wichtiger Kommandos des Java-Pakets:
Kommando | Aufgabe |
---|---|
java::new Klassenname Argumente | erzeugt neue Java-Objekte |
java::call Klassenname Methodenname Argumente | ruft statische Methoden auf |
java::field Klasse/Objekt Feldname [Wert] | fragt oder setzt Objektattribute |
java::instanceof Java-Objekt Klassenname | wie "instanceof" in Java |
java::null | gibt das Java-Objekt "null" zurück |
java::isnull Objekt | testet Java-Objekt gegen "null" |
java::throw Throwable | wirft eine Java-Exception |
java::try Skript catch {Klassenname Variable} Skript finally Skript | Das Äquivalent zu Javas Try/Catch/Finally-Konstrukt |
java::import Klassen/Paketname | Das Äquivalent zu Java "import" |
Eine Liste aller Befehle des Paketes finden Sie
Eine weitere Tcl-Java-Kopplung ist Tcl Blend. Es verbindet den in C implementierten Tcl-Interpreter und die JVM über ihre Java Native Interface (JNI). Tcl Blend besitzt den vollen Umfang von Tcl und Tk, jedoch vor dem Einsatz von Tcl Blend steht ein größerer Kompilierungsaufwand als in Jacl bevor. Daher ist Jacl die einfachere Alternative. Die Java-spezifischen Tcl-Funktionen sind bei Jacl und Tcl Blend identisch, beide verwenden das "java"-Paket.