Groovy – Die in Vergessenheit geratene Suche nach der eleganten Lösung – Autorin: Christina Brüning Betreuer: Frank Huch Seminarausarbeitung Wintersemester 2012/2013 Christian Albrechts Universität zu Kiel Institut für Informatik Abgabe am: 22.02.2013 Zugehöriger Vortrag am: 04.03.2013 1 Inhaltsverzeichnis 2 Einleitung ...................................................................................................... 3 3 Einordnung .................................................................................................... 4 4 Anwendungsgebiet ...................................................................................... 5 4.1 Warum wurde Groovy entwickelt? .............................................................................................. 5 4.2 Aktuelle Entwicklungen ..................................................................................................................... 6 5 Konzepte und Struktur ................................................................................ 7 5.1 „Hello World!“ - Ein kurzes Beispiel ............................................................................................ 7 5.2 Features .................................................................................................................................................... 8 5.3 SystemProperties - Ein komplexeres Beispiel ...................................................................... 9 6 Technische Unterstützung ........................................................................ 13 6.1 Entwicklungsumgebung & Portabilität .................................................................................... 13 6.2 Werkzeuge und Bibliotheken ...................................................................................................... 13 7 Diskussion und Zusammenfassung ....................................................... 14 8 Literaturliste ................................................................................................ 15 2 Seite 2 Einleitung Wenn man heutzutage etwas über die Programmiersprache Groovy erfahren möchte, so ist man leider auf lediglich einige wenige Werke angewiesen. Es ist verwunderlich, dass diese Sprache heute aus dem Blickfeld der Programmierung verschwunden ist. Dabei sind die Artikel, die man über Groovy finden kann, voll mit dem größten Lob für diese Neuerung in der Welt der Programmiersprachen. Das Buch „Groovy in Action“, oder in deutschen Ausgabe „Groovy im Einsatz“, vom deutschen Dierk König, ist als die heilige Schrift der Groovy-Community zu verstehen und ist auch in dieser Ausarbeitung stützender Pfeiler. Die Entstehung von Groovy fundiert auf der Suche nach einer einfachen und komplexen Sprache, welche Unabhängigkeit bietet und vergleichsweise wenig spezifisches Wissen erwartet. Daher sollte sich Groovy auf den (Programm-) Inhalt konzentrieren und nicht maßgeblich mit der (Entwicklungs-) Umgebung. James Strachan und Bob McWriter begannen 2003 mit der Entwicklung ihrer Idee zu einer dynamischen Skriptsprache die auf Java beruhen sollte, bis schließlich im Januar 2007 das finale Release 1.0 vorstellt werden konnte. Schwerpunkte bei der Verwirklichung dieses Projektes waren Adaption und Kooperation mit Java. Bereits im Mai 2007 war Groovy preisgekrönt!1 Es bleibt zu vermuten, dass sämtliche Wünsche, Ziele und Hoffnungen für und in Groovy auch das Ende dieser so freudig erwarteten Programmiersprache bildeten. Groovy hat das vereinfacht was zuvor in Java und anderen Sprachen noch verhältnismäßig unstrukturiert war und ist elegant sowie in hohem Maße lesbar. Mann kann Groovy in fast jeder Umgebung nutzen und einbeziehen. Aber leider muss man auch sagen, dass die Entwicklung von Groovy andere Sprachen so weit vorangebracht hat, dass diese verständlicher, benutzerfreundlicher, komplexer und universeller wurden. Groovy hat mit seinem eigenen Erfolg die Konkurrenz angespornt und ist durch die dortigen Entwicklungen zu den gleichen Idealen, selbst (in gewisser Weise) auf der Strecke geblieben und heute kaum noch bekannt. 1 http://de.wikipedia.org/wiki/Groovy 3 Seite 3 Einordnung Groovy wird als dynamische, objektorientierte Skriptsprache geführt. Irreführend ist jedoch, dass Groovy formal gesehen nicht den Anforderungen einer Skriptsprache entspricht. Eine konforme Sprache hätte keinen separaten Kompilierungsschritt 2 . Die Kompilierung in Bytecode kann in Groovy aber entweder bewusst veranlasst werden oder wird bei einer Ausführung des Quellcodes verdeckt und automatisch im Hintergrund durchgeführt. In jedem Fall besteht die Möglichkeit, den Code erst in (Java-) Bytecode zu kompilieren, bevor er ausgeführt werden kann. Dies bringt den Vorteil, dass auch jedes andere Java-Programm Zugriff auf z.B. die mit Groovy formulierten Methoden hat und umgekehrt Groovy auch Bytecode anderer Java-Programme ausführen kann. Bei einer „reinen“ Skriptsprache dürfte es also nach der obigen Definition diesen Kompilierungsschritt nicht geben, aber da die Funktionsweise trotzdem analog einer Skriptsprache genutzt werden kann, wird Groovy als eben solche geführt. Groovy grenzt sich bei der Ausführung von weiteren Programmiersprache ab, denn ein Groovy Programm kann sowohl als Skript, als auch in kompilierter Form gestartet werden3. Die Dynamik in Groovy entsteht dadurch, dass Groovy nur mit Objekten arbeitet, statt mit bestimmten festgelegten Ausgabetypen. Hier entspricht das Verfahren genau den Richtlinien, was bei vielen anderen „dynamischen“ Sprachen oft nicht der Fall ist. Dort wird dann vielmals nur das dynamische Typisieren unterstützt. 2 http://www.oio.de/public/java/groovy/groovy-­‐einfuehrung.htm 3 http://de.wikibooks.org/wiki/Groovy:_Programme_kompilieren_und_starten 4 Seite 4 Anwendungsgebiet 4.1 Warum wurde Groovy entwickelt? James Strachan und Bob McWriter wollten eine Programmiersprache erschaffen, welche die Vorteile der JavaVirtual-Maschine nutzen kann, dabei aber eleganter arbeitet als die bereits existierenden ca. 200 dynamischen Sprachen. 4 Das diese Idee so weit vorangebracht wurde ist auch als ein Mitverdienst von Java zu deuten. Denn obwohl Groovy eine Alternative zu Java schaffen wollte, haben diese Sprachen und ihre Anhänger und Vorantreiber nie miteinander in Konkurrenz gestanden. Im Gegenteil: Groovy wurde sogar zur zweiten „Sprache“ für die virtuelle Maschine von Java. Der Antrag darauf selbst wurde von Richard Monson-Haefel eingereicht und vorangetrieben. Selbst Sun Microsystems unterstützte diesen Antrag5 und er stieß auf keine nennenswerte Gegenwehr. Er wurde bereits 2004 bewilligt, also somit nur ein Jahr nach dem Start der Idee und noch deutlich bevor die erste Version veröffentlicht werden sollte. In der Dokumentation arbeitete Dierk König, als einer der ersten Verfolger der neuesten Entwicklungen an dieser Sprache, an einer Art Betriebsanleitung. Mit Hilfe von weiteren Entwicklern und Förderern von Groovy, konnte er auch diese Anleitung veröffentlichten. „Groovy im Einsatz“ ist bis heute das Standardwerk dieser objektorientierten Skriptsprache und Tutorium, Beispiel und Geschichtsbuch in einem. Doch auch dieses Werk konnte Groovy auf Dauer nicht bei den etablierten Programmiersprachen, seien es Compiler- oder Skriptsprachen, festigen. Gibt es eine Vielzahl an Werken zu den verschiedensten Sprachen, zum Beispiel zu C oder Java, so ist Groovy in kaum einer Bibliothek noch vertreten. Nur diejenigen, die sich in der kurzen aber intensiven Phase von Groovy mit dieser Sprache befasst haben und in Groovy die Möglichkeiten zur Vereinfachung von Programmcode und somit auch die Einsparung von Ressourcen sahen, werden dieses Buch noch immer wohl gehütet in ihren Bücherregalen verwahren. An der rasanten Entwicklung der großen Programmiersprachen und den regelmäßig erscheinenden Releases lässt sich erkennen, dass es zeitnah kein Groovy Comeback geben wird. Jedoch wird der erfahrene Groovy Anhänger auch aktuell immer wieder feststellen, dass Teile von Groovy nun in den Java-Releases auftauchen. 4 http://www.oio.de/public/java/groovy/groovy-­‐einfuehrung.htm 5 JSR 241 5 Seite Beispiel: Zur Vereinfachung von Patterns konnte man in Groovy mit Closures arbeiten. Diese Vereinfachung wurde nun von den Java-Entwicklern neu entdeckt und wird höchstwahrscheinlich in Java 8 adaptiert werden.6 4.2 Aktuelle Entwicklungen Groovy wird und wurde immer schon kostenlos zur Verfügung gestellt, wenn auch das Team seit der damaligen Euphorie deutlich schrumpfte und konsequenterweise weniger Ressourcen zur Verfügung stehen. Jedoch sollte man nicht außer Acht lassen, dass es nicht nur das „neue“ Groovy gab, sondern auch die Konkurrenz hatte gute Ideen zur Verbesserung und Vereinfachung bekannter Entwicklungsmethoden. So verließ James Strachan noch vor der ersten öffentlichen Freigabe von Groovy bereits das Team. Er wechselte zu ActiveMQ und erachtete fortan Scala als sinnvolle Alternative, um die Ideen von Groovy fortzuführen7. Im Allgemeinem war dies jedoch nur ein kleiner Rückschritt auf dem für die kurze Zeit sehr steilen Erfolgsweg von Groovy. Die erste Veröffentlichung war ein großer Erfolg und die Verleihung des JAX Innovation Award8 2007 brachte auch noch einmal einen Schritt zur größeren Beachtung. „Groovy beweist auf hervorragende Weise, zu welch substanzieller Innovation die Java-Community auch im Jahre 12 nach ihrer Gründung fähig ist.[...]Es stellt eine überzeugende Antwort auf den aktuellen Trend hin zu agilen, dynamischen Programmiersprachen dar und hilft den Anwendern, ihre getätigten Investitionen in die Java-Plattform zu sichern“9 Leider hat sich dieser steile Weg nach oben nicht dauerhaft fortsetzen können und die Entwicklungssprünge von Groovy waren bis Ende 2012, im Vergleich zum Projektstart, deutlich verhaltener. Es konnten allerdings Groovy 2.1.0 -beta-1 und Groovy 2.0.6 10 zum Ende des Jahres 2012 6 http://de.wikibooks.org/wiki/Groovy:_Closures#Einfache_Closures 7 http://macstrac.blogspot.de/2009/04/scala-­‐as-­‐long-­‐term-­‐replacement-­‐ for.html 8 Den Jax Innovation Award erhält man für den besten europäischen Beitrag zu Java, Eclipse und SOA 9 http://jax-­‐award.de/jax_award07/gewinner_de.php 10 Release war jeweils der 21.12.2012 6 Seite veröffentlicht werden. Es gibt einen kleinen Kern um Guillaume Laforge, der noch immer an der Weiterentwicklung von Groovy für The Codehaus arbeitet und einen Evolutionssprung bis 2014 zu Groovy 4.0 anstrebt. Inhalte realisierter und geplanter Neuerungen werden der Öffentlichkeit auf einer Roadmap präsentiert11. Auch für weitere Releases stehen hier eine Vielzahl von potenziell interessanten Neuerungen bereit, sodass auch ein MajorRelease 5 wahrscheinlich erscheint. 5 Konzepte und Struktur 5.1 „Hello World!“ - Ein kurzes Beispiel Betrachtet man das einfachste und gängigste Beispiel „Hello World!“, so werden bereits signifikante Eigenschaften von Groovy in der Praxis deutlich: 1 println ‚HelloWorld!’ Es fällt sofort ins Auge, dass diese eine Codezeile im Vergleich zu bekannten Varianten von „Hello World!“ in anderen Programmiersprachen sehr kurz ist. Positiv ist, dass die Aussage des Programmes für alle Nutzer, auch für diejenigen mit geringen Programmierkenntnissen, ersichtlich und verständlich ist. Da Groovy projektorientiert aufgebaut ist, mag es zuerst verwundern, dass keine „main“-Methode erforderlich ist. Dies ergibt sich daraus, dass Groovy-Skripte nicht vom Entwickler, sondern vom Compiler verpackt und mit eben dieser „main“-Methode versehen werden. Dadurch verringert sich der Programmieraufwand und die Lesbarkeit wird erhöht, beides sind elementare Ziele dieser Programmiersprache! Die Definition eines Ausgabetyps entfällt, da Groovy (im Gegensatz zu Java) nur mit Objekten arbeitet. Dazu gehört auch, dass Befehle wie zum Beispiel „System.out.println(„Hello World!“);“ aus Java abgekürzt zu „println 'Hello World!' werden. Auch die Klammern und das Setzen eines Semikolons am Ende einer Zeile fallen weg. Dies reduziert natürlich auch die Fehleranfälligkeit in diesem Bereich und macht den Gesamteindruck der Programmiersprache eleganter. Abschließend bleibt zu zu diesem Beispiel zu sagen, dass man ein Java-Programm von ca. 5 Zeilen mit nur einer einzigen, kurzen und deutlichen Groovy-Codezeile implementieren kann. Dies ist natürlich nicht ausreichend für Vermutungen zur Darstellung von komplexeren Programmen, aber ein guter Einblick in die Ziele und Schwerpunkte von Groovy. 11 http://groovy.codehaus.org/Roadmap 7 Seite 5.2 Features Von Java kennt man die Vorschrift, dass Klassenname und Dateiname für die fehlerfreie Ausführung identisch sein müssen. Dies ist in Groovy nicht er Fall. Dadurch können auch mehrere Klassen in einer Datei enthalten sein. Ausnahme sind hier allerdings Dateien, in denen sich nicht nur Klassen sondern auch ungebundener Code befindet. Diese Dateien dürfen dann nicht den gleichen Namen wie die Klassen innerhalb der Datei haben, da sonst die Namensvergabe durch Groovy Probleme mit sich bringt. Da Groovy-Klassen standardmäßig als public definiert sind, kann diese Definition in der Implementierung weggelassen werden. Lediglich bei einer anderen Sichtbarkeit, wie zum Beispiel protected, muss dies als Attribut vor der Klasse eingefügt werden. 12 Die Klasse „class erstesBeispiel{}“ ist also public und somit für alle anderen Packages verwendbar. Die Klasse „protected class zweitesBeispiel{}“ kann nicht anderweitig verwendet werden. Um Klassen auch ausführen zu können sind nach unserem bisherigen Kenntnisstand „main“-Methoden nötig. Da Groovy auf Java aufbaut sind Klassen mit „main“Methode dort also ebenfalls ausführbar. Allerdings ist diese Methode in Groovy nicht zwingend! Sie kann auch durch die Implementierung eines Interfaces für Runnable ausführbar gemacht werden. Hat das Groovy-Skript nur ungebundene Ausdrücke kann das Programm ebenfalls ausgeführt werden. Als Beispiel für die komplexen Möglichkeiten in Groovy nennt Falk Slippach in seinem Artikel „Einführung in Groovy“ die package private Attribute aus Java-Programmen, welche in Groovy zu Properties werden13. Also entsteht bei der Übersetzung von Java zu Groovy aus den JavaAttributen Groovy-Getter und Setter. Weitere Unterschiede von Groovy zu Java sind, dass im Vorfeld keine Informationen darüber benötigt werden, ob einem Objekt in Zukunft numerische Werte oder beispielsweise lange Zeichenketten zugewiesen werden (Typisierung). Außerdem kann auf viele Importanweisungen, welche die Lesbarkeit des Quellcodes stören, bevor die ersten „richtigen“ Programmzeilen zu erkennen sind, in Groovy verzichtet werden (Einfache Einbindung von Codezeilen). Wegen der einfachen Syntax von Groovy werden keine Separatoren benötigt und eine „return“-Anweisung kann bei der Rückgabe von Statements entfallen. Groovy liefert beim Fehlen des „return“-Ausdruckes automatisch die letzte Anweisung zurück14 (Einfache Lesbarkeit). 12 http://www.oio.de/public/java/groovy/groovy-­‐einfuehrung.htm 13 http://www.oio.de/public/java/groovy/groovy-­‐einfuehrung.htm 14 http://www.oio.de/public/java/groovy-­‐closures-­‐artikel.htm 8 Seite 5.3 SystemProperties - Ein komplexeres Beispiel Betrachten wir nun ein komplexeres Beispiel für ein Groovy-Programm. Die Aufgabe des Programms sollte dabei sein, dass aus einer mitgegebenen Quelle bestimmte Einträge gefiltert werden, welche alle mit einem gegebenem Schlüssel beginnen. Es müssen also alle Einträge auf einen bestimmten Prefix hin untersucht, beziehungsweise sortieren werden. Eine mögliche Implementierung in Java könnte dabei mit Array-Listen arbeiten und wie folgt aussehen: 1 import java.util.*; 2 public class SystemProperties { 3 public static void main (Sring[] args) { 4 String prefix = args.length > 0 ? args[0] : ““ ; 5 ArrayList entries = new ArrayList (); 6 for (Map.Entry e : System.getProperties().entrySet()) { 7 if (e.getKey().toString().startsWith(prefix)) { 8 entries.add(e); 9 } 10 } 11 Collections.sort(entries,new MeinComperator()); 12 for (Object e : entries) { 13 System.out.println(e); 14 } 15 } 16 } 17 class MeinComperator implements Comperator { 18 public int compare(Object o1, Object o2) { 19 return ((Map.Entry)o1).getKey().toString() .compareTo((Map.Entry)o2) .getKey().toString()); 20 } 21 } Auffällig ist hierbei, dass wir ein solches Programm für gewöhnlich ausschließlich als Java-Programm identifizieren würden. Tatsächlich ist dieses Beispiel aber gleichzeitig auch ein Groovy-Programm. Daraus erkennen wir, worin eine der größten Stärken von Groovy besteht: Jedes Java-Programm ist auch als Groovy-Programm mit den gleichen Ergebnissen und Ausgaben lauffähig! 9 Seite Die Besonderheit von Groovy ist allerdings nicht, dass dort auch gewöhnlicher Java-Code läuft. Vielmehr gilt es zu beachten, dass der Code auch noch stark verkürzt und somit einfacher dargestellt werden kann. Groovy kann also die gleiche Funktionalität eines Programms sehr viel kompakter ausdrücken. Im normalem Implementierungsalltag ist es nicht üblich, erst einen Java-Code zu haben und diesen dann in einen GroovyCode umzuwandeln, doch zum besseren Verständnis möchte ich nun so mit unserem Beispiel verfahren. Dabei verzichte ich zunächst auf eine Erklärung der Funktionsweise für den gesamten Code, sondern erkläre die Funktionen und Möglichkeiten schrittweise. Wir wissen bereits, dass alle Bibliotheken von Java in Groovy genutzt werden können, ohne dass diese explizit aufgeführt werden müssen. Dies hat den Vorteil, dass beim nachträglichem Einfügen von Befehlen aus anderen Bibliotheken diese nicht neu am Anfang eingebunden werden müssen und beim versehentlichen Vergessen oder einfachem Weglassen bei Groovy kein Fehler entsteht. Daher können wir Zeile 1 unseres Beispiel-Codes ersatzlos streichen. Diese Eigenschaft von Groovy vereinfacht den Programmieraufwand und erleichtert außerdem die Lesbarkeit. Die Zeilen 2 und 3 beginnen mit der Definition der Sichtbarkeit des Codes, die in diesem Fall auf „public“ gesetzt sein soll. Groovy geht automatisch von dieser Einstellung aus und erwartet eine explizite Angabe nur, falls die Sichtbarkeit nicht auf „public“ gesetzt werden soll. In unserem Beispiel müssen wir also überhaupt keine Angaben zur Sichtbarkeit vornehmen. Im weiteren Verlauf definiert Zeile 2 den Code als Klasse. Da wir in Groovy aber keine Kapselung in Klassen vornehmen müssen, sondern direkt mit unserem Skript beginnen können kann diese Zeile komplett gestrichen werden (und infolge dessen auch Zeile 16, wo die Klasse abgeschlossen werden würde). Mit Zeile 3 können wir ähnlich verfahren, da wir in Groovy keine „main“-Methoden benötigen. In Zeile 4 erfolgt die Deklaration der Variable als String. Auch dies kann in Groovy entfallen, da es keine Typisierung für Variablen, sondern nur für Objekte gibt. Durch diese dynamische Typisierung können in einem bestehenden Programm leicht Änderungen an Zuweisungen durchgeführt werden, ohne dass man sich auch noch die Deklarierung vornehmen muss. Als Beispiel kann man anführen, dass die Zuweisungen: variable = „abc“ variable = 42 ohne weitere Zuweisungen genauso hintereinander lauffähig sind. Die erste Zuweisung der Variablen variable mit dem String abc wird von Groovy mit der Zuweisung mit dem Integerwert 42 einfach überschrieben. Die Reihenfolge ist 10 Seite dabei irrelevant und beliebig zu wählen. Zurück in unserem aktuellen Beispiel-Code kann die Abfrage, ob die Argumentenlänge größer Null ist („>0“) weggelassen werden, da wir hier alle Werte als boolsche Ausdrücke erkennen können. Daher haben wir für alle Werte der Länge außer Null ein true in dieser Abfrage. Diese Kürzung wäre auch in Java zulässig und erfolgt für uns nur um den Code weiter zu komprimieren. Abschließend können wir für diese Zeilen das Semikolon am Ende der Zeile entfernen, da Groovy auf starr vorgegebene Separatoren verzichtet und den Zeilenumbruch als Trennung von Befehlen erkennt. Die Zeile könnte also in Groovy wie folgt aussehen: 4 prefix = args.length ? args[0] : ““ In Zeile 5 des Programms werden die Einträge einer ArrayList definiert und dafür eine ebensolche mit dem Namen „entries“ neu angelegt. Analog zum „String“ von oben kann hier das erste „ArrayList“ gestrichen werden und auch die Definition erfolgt durch einfachere Syntax mit „[]“, statt mit dem Anlegen einer neuen „ArrayList“: 5 entries = [] Mit dem Ziel der Vereinfachung können wir uns nun auch die Bedingung der for-Schleife ab Zeile 6 ansehen. Die Definition, dass e ein Map.Entry sein soll können wir weglassen und der Ausdruck „System.getProperties().entrySet()“ kann zu einem verständlicheren „in System.properties“ verkürzt werden. In der folgenden if-Abfrage in Ziele 7 kann ebenso das get gestrichen werden, wie auch das toString(), da Groovy diese Zuweisungen eigenständig deklariert. Außerdem ist die Syntax von Groovy in soweit gekürzt funktionsfähig, dass gerade leere Klammerausdrücke, also „()“ komplett entfallen können. Wir erhalten also die deutlich lesbarere Version: 6 for ( e in System.properties) { 7 if (e.Key. startsWith(prefix)) { 8 entries.add(e); 9 } 10 } In dem gegebenen Java-Beispiel verwenden wir in Zeile 11 eine andere Klasse um die Einträge vergleichen zu können („MeinComperator“). Ziel der Verwendung des Comperators ist es, die Entries nach einem gegebenen Prefix-Schlüssel zu filtern. In unserem Beispiel-Code verwenden wir Collections.sort dafür. Der Klasse MeinComperator können wir entnehmen, dass wir je die zwei Einträge o1 und o2 dafür nutzen wollen. Dazu setzen wir jeden der Einträge mit „(...)getKey().toString()“ zusammen, bevor wir die beiden Ausdrücke vergleichen. Unser Groovy-Code hingegen kann direkt im 11 Seite eigentlichen Programm mit „entries.sort“ starten, ohne den Aufwand einer zusätzlichen Klasse. Wir können uns auch die zusätzlich definierten Objekte sparen und verwenden daher sofort e1 und e2. Die Funktion aus dem Comperator können wir als anonyme Funktion „e1.key.compareTo(e2.key)“ angewendet auf e1 und e2 direkt der Sortierung selbst mitgeben. Dieses Feature ist vergleichbar mit den Lambda-Funktionen die uns bereits aus Scheme bekannt sind. Für diese Zeile (und die Zeilen 17 bis 21) erhalten wir also insgesamt folgende verkürzte Version: 11 entries.sort { e1,e2 -> e1.key.compareTo(e2.key) } Hier ist auffällig, dass unser Code, wie bereits vorangegangen beschrieben, nun keine „return“-Anweisung mehr enthält. Zeile 12 des gegebenen BeispielCodes sagt nun aus, dass dieser Vergleich über alle Einträge erfolgen soll. Hier ist die Änderung zum Groovy-Code minimal, denn es wird nur das „Objekt e“ mit „entry“ bezeichnet und der Doppelpunkt wird zu einem lesbaren „in“ im Groovy-Programm. Es bleibt noch die Ausgabe. Diese erfolgt in Java mit dem „System.out.println“-Befehl aus Zeile 13 und wird in Groovy wie folgt angegeben: 19 println entry Dabei ist zu beachten, dass wir kein System.out.println“ verwenden müssen (vergl. Beispiel „Hello World!“), und die Aussage der Zeile daher noch offensichtlicher wird. Diese ganzen Kürzungen und Änderungen können wir nun wie folgt zusammensetzen: 1 2 3 4 prefix = args.length ? args[0] : ““ 5 entries = [] 6 for ( e in System.properties) { 7 if (e.Key.startsWith(prefix)) { 8 entries.add(e) 9 } 10 } 11 entries.sort { e1,e2 -> e1.key.compareTo(e2.key) } 12 for (entry in entries) { 13 println entry 14 } Zusammengefasst kann man also sagen, dass hier ein Groovy Code von 11 Zeilen ausreichen würde, um den Java-Code von 21 Zeilen auszudrücken. Dabei ist die kürzere Version aber auch noch deutlich lesbarer und als ein einziges Skript (ohne Zusatzklasse) ausführbar. Ein geübter GroovyEntwickler könnte den Code natürlich sofort in Groovy implementieren, dies wurde hier nur zum Vergleich mit Java und dem besserem Verständnis für die Ziele und Möglichkeiten von Groovy angewendet. 12 Seite 6 Technische Unterstützung 6.1 Entwicklungsumgebung & Portabilität Nachdem Groovy als Standardsprache für die virtuelle Maschine von Java anerkannt wurde, könnte man sie überall dort finden, wo auch Java lauffähig ist. Groovy ist also in hohem Maße plattformunabhängig und kann als Release 2.0 als Zusatz zu Java (für JDK 7) über „The Codehaus“ frei bezogen werden15. Alternativ kann Groovy auch als Plugin für Eclipse oder ähnliche Entwicklungsumgebungen installiert werden.16 So ist eine sehr hohe Portabilität gegeben. Außerdem ist Groovy-Code sehr schnell zu erschließen und so auch von fremden Entwicklern in seiner Funktionalität leicht zu erfassen. Das Auslesen des Codes ist also nicht einmal an einzelne Entwicklerteams gebunden, sondern ist auch dort in hohem Maße flexibel. Die Verbreitung von verschiedenen, komplexeren Groovy-Projekten ist in der Java-Welt ebenfalls kein Hindernis, da „[...] auf der Bytecode-Ebene, [...] Groovy gleich Java ist, sodass sich beide Sprachen nahtlos integrieren lassen.“17 6.2 Werkzeuge und Bibliotheken Nach Dierk König ist Groovy eine Weiterentwicklung von Java, mit nützlichen Zusätzen und ohne überflüssige Formalitäten. Da Groovy als Sprache für die JVM anerkannt wurde, ist es wohl nicht verwunderlich, dass alle Bibliotheken aus Java auch für Groovy verwendet werden können. Die nötige Umwandlung ist dabei nicht einmal vom Anwender selbst vorzunehmen sondern erfolgt automatisch vom Compiler. Java hatte bereits 2007 Zugriff auf ausführliche Klassenbibliotheken und auch heute noch sind die Bibliotheken von Java das Grundgerüst von Groovys Bibliotheken. Es werden also alle Möglichkeiten von Java übernommen und sogar noch erweitert. Dies gilt auch für sämtliche Werkzeuge aus Java, wie zum Beispiel Profiler und Debugger. Sie können sofort in Groovy übersetzt und analog zu Java verwendet werden. Da Java in vielen Bereichen Einsatz findet, kann man zumindest ansatzweise erfassen, in welchen Umfang Groovy samt Werkzeugen und Bibliotheken zur Verfügung stehen könnte. 15 http://groovy.codehaus.org 16 http://groovy.codehaus.org/Eclipse+Plugin 17 Dierk König in „Groovy im Einsatz“ 13 Seite 7 Diskussion und Zusammenfassung Möchte man abschließend über Groovy allgemein und den Einsatz von Groovy im Speziellen diskutieren, so ist der wohl wichtigste Punkt die Zeit. Es hat wohl nie die richtige Zeit für Groovy gegeben und es ist sehr unwahrscheinlich, dass sie noch kommen wird. Zum Start von Groovy waren die Ideen und Visionen zu dieser Programmiersprache ihrer Zeit noch voraus. Es wurden Möglichkeiten angestrebt, die sich manche kaum vorstellen konnten und die so fantastisch klangen, dass man an ihre Verwirklichung noch gar nicht glauben wollte oder konnte. Zur heutigen Zeit ist Groovy jedoch nicht mehr präsent. Sicherlich haben einige Wenige schon einmal von dieser Sprache gehört und verfolgen ihre Entwicklung noch heute. Aber Groovy hat in seiner vergleichsweise kurzen Existenz von 2003 bis heute seine einflussreichste Zeit bereits hinter sich gebracht und das noch bevor sie überhaupt richtig begonnen hatte. Sicherlich klingen auch nach der Einarbeitung in diese Sprache die Vorteile und Ideale verlockend, aber es fehlt die ausreichende Förderung durch Dritte. Als jemand, der nicht von Groovys Anfang an dabei gewesen ist, ist der Einstieg in diese Materie, meiner Meinung nach, nur im Selbststudium empfehlenswert, denn so wird einem die Komplexität der Möglichkeiten durch die virtuelle Maschine von Java noch deutlicher. Sicherlich gibt Groovy auch einen guten Einblick in die Möglichkeiten von Java, sozusagen als Java-Pseudocode-Mash-Up. Aber betrachtet man beispielsweise das heutige Studium der Informatik, so könnte ich keinen ausreichend großen Platz nennen, der für Groovy geeignet ist. Sicherlich sollte die Existenz von Groovy nicht verschwiegen werden, wenn man Java betrachtet, aber es wäre wohl nicht sinnvoll damit ganze Module zu belegen und anderen aktuelleren Sprachen ihren Platz streitig zu machen. Abschließend bleibt für mich festzuhalten: Die Zeit von Groovy ist nicht heute und wohl auch nicht morgen, vielleicht wird die Idee des programmierbaren Pseudocodes nochmal aufgegriffen, aber diesen Termin kann und muss sich heute noch niemand im Kalender anstreichen. 14 Seite 8 Literaturliste Groovy Homepage http://groovy.codehaus.org/ Dierk König u. a.: „Groovy im Einsatz“ 2007 Carl Hanser Verlag GmbH & CO.KG ISBN 978-3-446-41238-5 Falk Sippach: „Einführung in Groovy“ http://www.oio.de/public/java/groovy/groovyeinfuehrung.htm „Groovy Closures“ http://www.oio.de/public/java/ groovy-closures-artikel.htm Artikel zu Groovy: http://de.wikipedia.org/wiki/Groovy http://de.wikibooks.org/wiki/Groovy:_ Quellprogramme_direkt_ausführen http://de.wikibooks.org/wiki/Groovy:_ Closures#Einfache_Closures http://jax-award.de/jax_award07/gewinner_de.php James Strachans Blog: http://macstrac.blogspot.de/2009/04/scala-aslong-term-replacement-for.html 15 Seite