Jython ist eine 100% pure Java Implementierung von Python. Jython wurde zuerst unter dem Namen JPython im Jahre 1997 veröffentlicht. Der Author der Sprache ist Jim Hugunin, der JPython bis 1999 weiterentwickelte. Barry Warsaw übernahm 1999 die Entwicklung. JPython wurde im Jahre 2000 in Jython umbenannt und wird seitdem als Source Forge Projekt entwickelt. Lange Zeit hatte hauptsächlich Samuele Pedroni an der Erhaltung und Weiterentwicklung der Sprache gearbeitet. Doch Pedroni trat zum Ende des Jahres 2004 zurück und widmete sich der Entwicklung von PyPy. Barry Warsaw machte Finn Bock zum Maintainer (Instandhalter). Die Entwicklung von Jython schreitet voran, jedoch wird der Prozess verlangsamt, da es einen Mangel an Entwicklern mit entsprechenden Kenntnissen und ausreichend Zeit gibt.
Die aktuelle Version von Jython (2.2.1) kam am 14.10.2007 raus und beinhaltet alle Features von CPython 2.2. Diese Version ist die erste stabile Veröffentlichung seit 6 Jahren. Sie erweiterte Jython um einen Compiler (Jythonc), der Python Quelltext in eine Java Datei konvertiert.
In unserem ersten Jython Beispiel benutzen wir die Python Klasse "math", um PI und E auszugeben. Außerdem ziehen wir noch die Wurzel mit Hilfe der Funktion sqrt von "math" um die Interaktion beider Programmierwelten zu zeigen. Wie man sieht, arbeitet der Python-Interpreter ähnlich wie der Tcl-Interpreter. Jedoch nutzen wir hier, statt der eval Methode, die exec Methode mit dem auszuführenden String. Ein PyObject könnte man auch in der exec Methode ausführen. Bei Fehlern würde man wieder eine Exception werfen, in diesem Fall eine PyException.
Anmerkung: Dieses Beispiel soll die Interaktionsmöglichkeiten zeigen.
Man kann, wie auch in Jacl, den Skript Code in einer Datei auslagern.
Mit der Methode execfile führt man die Datei aus. Falls die Datei nicht existiert, wird eine PyException geworfen.
Diese beiden Beispiele gehöhren zu den Grundlagen, um mit Jython zu arbeiten.
Bis auf die Syntax und die Methodenbezeichnungen ist der Aufbau zu Jacl sehr ähnlich.
Nun kommen wir zu einem sinnvolleren Beispiel. Hier arbeiten wir mit regulären Ausdrücken, um das erste Wort aus dem inputStr, dem man vorher einen Wert zuweisen sollte, zu filtern. Das Ergebnis wird im outputStr gespeichert.
Zuerst weisen wir der "Parameter-Variablen" inputStr einen Wert zu, welcher dann im Skript verarbeitet wird und anschließend geben wir das Ergebnis aus.
Jetzt gehe ich auf Jythonc ein. Um erst einmal einen Einblick zu bekommen, was Jythonc erzeugt, habe ich eine leere Datei (empty.py) mit dem Befehl...
Bisher bin ich nur auf die einseitige Interaktion zwischen Python und Java eingegangen. Nun gehe ich auf Java Elemente im Python Code ein. In diesem Beispiel wollen wir mit folgendem Code ein einfaches Applet erzeugen:
Bei der Eingabe in der Konsole von...
Man kann mit Python sowohl imperativ als auch - nicht wie in Tcl - objektorientiert programmieren. So bietet sich die Möglichkeit für Python von Java Klassen zu erben und zu erweitern. Zum Beispiel so:
Anmerkung: Python arbeitet mit Zeilenvorschub um einen Block zu definieren, anstatt mit geschweiften Klammern, wie Java.
Wie man im Beispiel sieht, ist man nicht gezwungen den Typ des Rückgabewertes einer Methode beim Vererben beizubehalten, da in Python kein Typ für den Rückgabewert angegeben wird.
Damit können beliebige Objekte aus einer Methode zurückgegeben werden.
Für dieses Beispiel wird zunächst eine Python Klasse erstellt.
Um die Klasse benutzen zu können, läft die Klasse erstmal in Java durch den Interpretierer.
Der Vorteil einer Skriptsprache ist Variablen nicht an einen Typ zu binden. In der 2. Möglichkeit kann Java nun davon Gebrauch machen.
Das letzte Beispiel beschränkt sich auf die Implementierung eines Interfaces. In diesem Fall wird das Comparable Interface aus Java implementiert, welche die abstrakte Methode compareTo(Object) enthält. Dabei verzichten wird absichtlich auf die Implementierung der abstrakten Methode.
Da der Code nur interpretiert wird, wird nicht überprüft, ob man die compareTo(Object) Methode implementiert hat.
Erst beim Aufruf der Methode erhält man folgende Fehlermeldung:
AttributeError: abstract method "compareTo" not implemented