Die Programmiersprache Eiffel – erst mal eine Enttäuschung

15 10 2010

Ich habe eine Open-Source Bibliothek in Ruby (dort Gem) genannt zum Auslesen von Spreadsheet-Dateien (Excel, Openoffice und Google-Spreadsheets) geschrieben.

Als Einstieg in die Programmiersprache Eiffel, wollte ich nun hergehen und diese Bibliothek auch nach Eiffel portieren.

Die Sprache Eiffel selbst, ist, wenn man sich erstmal an die etwas andere Syntax im Gegensatz zu anderen Sprachen gewöhnt hat, eigentlich recht hübsch und flexibel. Ich wollte mich also etwas näher mit Eiffel beschäftigen.

Die Installation auf einem kleinen Netbook mit Windows 7 Starter war unproblematisch. Eigene kleine Beispielprogramme ließen sich übersetzen und funktionierten auch.

Da ich gerne testgetrieben entwickle, habe ich mir das Tool Etest von Jim Weirich (richtig geschrieben?) geholt, welches automatisierte Tests, wie ich sie von Ruby her kenne, durchführen kann. Dazu geht man ähnlich wie bei Ruby vor. Man erstellt eine Klasse namens ‚TEST_‘ + Name der eigenen zu testenden Klasse. Dann ruft man das Kommando etest auf, welches temporäre Klassen erstellt, die dann kompiliert und ausgeführt werden (alles innerhalb des etest-Aufrufs). Als Ergebnis von etest erhält man die Anzahl der korrekten Testfälle und die fehlgeschlagenen Tests ausgegeben (wie auch bei Ruby Unittests).

Eine kleine Überraschung war, daß zum Erzeugen der temporären Testklassen tatsächlich Perl verwendet wurde (mußte ich dann auch noch installieren, machte aber auch keine Probleme). Warum um Himmels Willen Perl? Na ja – Hauptsache es funktioniert.

Funktionieren tat es dann doch nicht so ganz. Ich weiß nicht, auf welcher Basis bzw. welcher Version dieses Tool geschrieben wurde, mit meiner jetzigen SmartEiffel-Version (2.3) lief es nicht so ganz rund. Die assert_equal Methode kann man leider nicht verwenden, weil da in der etest-Methode der Parameter vom Typ ANY angegeben ist, ich dafür in meinem Test aber keine Integer-Zahl übergeben kann. Ich muß zugeben, ich verstehe noch zu wenig von Eiffel, um mit der Fehlermeldung etwas anfangen zu können. Nach meinem bisherigen naiven Verständnis sollte bei ANY dann doch beliebige Parameter angegeben werden können, oder nicht?

Was aber funktonierte war die Methode assert (die nur einen booleschen Wert verlangt). Ich mußte also meine Tests nur etwas umformulieren und konnte damit auf assert_equal verzichten und nur assert verwenden. Das sieht zwar nicht ganz so elegant aus, funktioniert aber.

So baute ich meine Klassen – testgetrieben – noch weiter aus.

Dann kam ich an den Punkt, wo ich XML-Files parsen mußte.

Halt – vorher noch etwas anderes. In Ruby gibt es fertige Libraries, um ZIP-gepackte Dateien zu entpacken bzw. auf die gepackten Daten wie auf ein Filesystem zugreifen zu können. In Eiffel: Fehlanzeige. Keine Library dazu gefunden, in de.comp.lang.misc nachgefragt – niemand wußte etwas darüber (genauer gesagt, habe ich noch nicht mal eine Antwort bekommen). Gut. Ich habe mir dann erst mal damit beholfen, daß ich ein unpack-Kommando extern aufrufe und dann innerhalb der entpackten Files auf meine benötigten Files zugreife.

Zurück zu XML. Es gibt in SmartEiffel ein tutorial-Verzeichnis, in dem zu vielen mitgelieferten Libraries Beispielprogramme enthalten sind, was natürlich eine gute Idee ist. Hier habe ich dann auch Beispiele für die Bearbeitung von XML-Dateien gefunden, sowohl für DOM als auch für SAX. Prima, dachte ich, ist ja alles da, was du brauchst. Ich habe also dieses Beispiel genommen und in mein eigenes Programm eingebaut. Versucht zu übersetzen – Peng. Der Compiler schmiert damit komplett ab. Nicht etwa, daß mir das Frontend einen Fehler in meinem Programm melden würde (was vielleicht noch erklärbar wäre), nein, der Compiler generiert C-Code, der nicht übersetzt werden kann. Daraufhin habe ich das originale Tutorial-Beispielprogramm übersetzt – wieder das gleiche Ergebnis. Es sind also noch nicht mal die eigenen Tutorial-Beispiele alle kompilierbar. Den gleichen Effekt habe ich auch bei dem curses (oder ncurses?) Tutorial-Programm bemerkt (obwohl es hier vielleicht auch an fehlenden externen curses-Libraries hätte liegen können, was ich aber nicht weiter untersucht habe.

Meine Vermutung ist, daß es vielleicht mit dem von mir verwendeten Betriebssystem Windows 7 Starter zu tun hat, worauf der SmartEiffel Compiler (bei mir Version 2.3) noch nicht angepaßt wurde, da SmartEiffel wohl seit einiger Zeit nicht mehr gewartet werden zu scheint (Mitte 2007). Anfragen an die Mailingliste wurden (man ahnt es schon fast) ignoriert. Beim Bugtracker zu SmartEiffel kann man überhaupt keine neuen Bugs eintragen (oder ich bin zu blöd dazu, eine diesbezügliche Anfrage an die Mailing-List wurden auch nicht beantwortet).

Ich finde das ein ziemlich schwaches Bild dafür, daß SmartEiffel das „offizielle“ Eiffel von GNU ist.

Mein vorläufiges Fazit: Eiffel ist in der Theorie eine schöne Sprache, aber wenn man damit praktische Aufgaben erledigen will, leider kaum zu gebrauchen. Ich spreche hier natürlich nur über SmartEiffel. Es gibt andere Compiler, aber die schienen mir persönlich nicht so passend:

Eiffelstudio: zu fette und komplexe IDE, die ich erstmal nicht haben wollte, in der freien Version von EiffelStudio darf man nur Open-Source Projekte entwickeln

tecomp: Ist so weit ich weiß nur ein Interpreter, und ich weiß nicht, wie ausgereift der mittlerweile ist.

Da ist leider noch so ein Punkt, der mit bei den existierenden Eiffel-Compilern extrem stört: Jeder scheint irgendwie sein eigenes Eiffel zu machen, Quelltexte des einen Compilers müssen zum Kompilieren mit einem anderen Compiler an einigen Stellen angepaßt werden – fast so wie bei den unterschiedlichen COBOL-Compilern früher in den Achtzigern.

Sollte mich doch noch jemand davon überzeugen können, daß Eiffel nicht nur in der Theorie toll ist, sondern man damit auch praktische Aufgaben lösen kann, bin ich gerne bereit mich wieder damit zu beschäftigen, aber ansonsten werde ich in der Kategorie der kompilierten Programme wieder eher auf Ada setzen (Halt! Da muß ich aber auch erst testen, ob das mit mit meinem Betrübssystem zusammen funktioniert – aber ich würde bei Ada eher ein Ja vermuten).