Groovy – eine dynamische Ergängzung zu Java Johannes Hellrich 12. Juni 2013 Johannes Hellrich Groovy 1 / 30 Alternativen zu Java Groovy – Möglichkeiten der Sprache Groovy und Java im Vergleich Domain Speciffic Languages Weitere Features Groovy in der Praxis Status Verbreitung Im JULIE Lab Einstieg Johannes Hellrich Groovy 2 / 30 Alternativen zu Java Eine JVM – viele Sprachen “The legacy of Java will be the platform, not the language.” Martin Fowler (Mitbegründer der Agilen Softwareentwicklung) Johannes Hellrich Groovy 3 / 30 Alternativen zu Java Vor-und Nachteile Javas Stärken Javas: “Write once, run anywhere” Großes Ökosystem Schwächen Javas: Viel Code für wenig Effekt (sehr explizit) Veraltete Methoden in Standardbibliothek Zögerliche Weiterentwicklung Johannes Hellrich Groovy 4 / 30 Alternativen zu Java Vor-und Nachteile Javas Stärken der JVM: “Write once, run anywhere” Großes Ökosystem Schwächen Javas: Viel Code für wenig Effekt (sehr explizit) Veraltete Methoden in Standardbibliothek Zögerliche Weiterentwicklung Johannes Hellrich Groovy 4 / 30 Alternativen zu Java Vor-und Nachteile Javas Stärken der JVM: “Write once, run anywhere” Großes Ökosystem Schwächen Javas: Viel Code für wenig Effekt (sehr explizit) Veraltete Methoden in Standardbibliothek Zögerliche Weiterentwicklung → Trend zu alternativen Sprachen wie Clojure, Scala und Groovy Johannes Hellrich Groovy 4 / 30 Alternativen zu Java Alternativen zu Java Clojure Lisp, stark funktional, dynamisch Scala Eigenständige Syntax, Komplexes Typensystem, Support für funtkionales und objektorientiertes Programmieren Groovy Syntax baut auf Java auf, berücksichtigt viele Konventionen (JavaBeans), von populären Skriptsprachen beeinflusst, teilweiser Support für funtkionales Programmieren, Ziel Java zu ergänzen statt es zu ersetzen Johannes Hellrich Groovy 5 / 30 Groovy – Möglichkeiten der Sprache Groovy und Java im Vergleich Ein Java Programm Johannes Hellrich Groovy 6 / 30 Groovy – Möglichkeiten der Sprache Groovy und Java im Vergleich Ein Groovy Programm I Johannes Hellrich Groovy 7 / 30 Groovy – Möglichkeiten der Sprache Groovy und Java im Vergleich Ein Groovy Programm II Typische Abhängigkeiten automatisch importiert Semikola unötig Felder automatisch private und Methoden public Implizite Getter/Setter (überschreibbar) Johannes Hellrich Groovy 8 / 30 Groovy – Möglichkeiten der Sprache Groovy und Java im Vergleich Ein Groovy Programm III Slash-Syntax für reguläre Ausdrücke Direkte Erstellung von Listen und Maps Direkter Zugriff auf Listen und Maps Johannes Hellrich Groovy 9 / 30 Groovy – Möglichkeiten der Sprache Groovy und Java im Vergleich Ein Groovy Programm IV Typangaben unnötig (optionaler Check während Kompilierung) each und Varianten zur Iteration Closures (vgl. Funktionspointer/Annonyme Innere Klassen) Johannes Hellrich Groovy 10 / 30 Groovy – Möglichkeiten der Sprache Groovy und Java im Vergleich Performance Seit Version 2.0 bietet Groovy die @CompileStatic Annotation Statische Kompilierung für Klassen oder einzelne Methoden static ternary static if instance ternary instance if Groovy dynamisch 4352ms 4267ms 4577ms 4592ms Groovy statisch 926ms 911ms 1681ms 1604ms Java 924ms 917ms 917ms 969ms Fibonacci Benchmark von http://objectscape.blogspot.de/ 2012/08/groovy-20-performance-compared-to-java.html Johannes Hellrich Groovy 11 / 30 Groovy – Möglichkeiten der Sprache Groovy und Java im Vergleich Interoperabilität Grooy–Java Kompiliertes Groovy ist normaler Java Bytecode mit dem Groovy.jar als Abhängigkeit Java Klassen können Groovy Klassen erweitern Groovy Klassen können Java Klassen erweitern Das Gleiche gilt für die Implementierung von Interfaces Groovy selbst kann in ein JAR eingebunden werden, so dass am Ziel nur Java installiert sein muss Johannes Hellrich Groovy 12 / 30 Groovy – Möglichkeiten der Sprache Domain Speciffic Languages Domain Speciffic Languages (DSL) Möglichkeit Operationen/Zusammenhänge einer Domäne vereinfacht zu beschreiben Oft rein Deklarativ Auch für Personen mit wenig Programmierkenntnissen verwendbar Alternative zu XML o.ä. Johannes Hellrich Groovy 13 / 30 Groovy – Möglichkeiten der Sprache Domain Speciffic Languages Beispiel ohne DSL fragebogen = new Fragebogen(title:"Kfz-Umfrage") frage = new Frage(typ:Fragetyp.EINFACHAUSWAHL, frage: "Welche Marke?") frage.antwortHinzufügen("Opel") ... fragebogen.frageHinzufügen(frage) frage = new Frage(typ:Fragetyp.TEXTEINGABE, frage: "Modelbezeichnung?") fragebogen.frageHinzufügen(frage) frage = new Frage(typ:Fragetyp.MEHRFACHAUSWAHL, frage: "Welche Ausstattungsmerkmale?") frage.antwortHinzufügen("Klimaanlage") ... fragebogen.frageHinzufügen(frage) nach http://raik-bieniek.blogspot.de/2011/03/ interne-dsl-mit-groovy-teil-2.html Johannes Hellrich Groovy 14 / 30 Groovy – Möglichkeiten der Sprache Domain Speciffic Languages Beispiel mit DSL fragebogen "Kfz-Umfrage" frage einfachauswahl, "Welche Marke?" antwort "Opel" antwort "Renault" antwort "BMW" frage texteingabe, "Modelbezeichnung?" frage mehrfachauswahl, "Welche Ausstattungsmerkmale? antwort "Klimaanlage" antwort "Navigationssystem" antwort "ESP" nach http://raik-bieniek.blogspot.de/2011/03/ interne-dsl-mit-groovy-teil-2.html Johannes Hellrich Groovy 15 / 30 Groovy – Möglichkeiten der Sprache Domain Speciffic Languages Technische Hintergründe zu DSLs Klammern sind optional, außer sie dienen der Disambiguierung Groovy erlaubt es (da dynamisch) auch nicht implementierte Methoden/Felder aufzurufen Das Verhalten für diese kann durch Metaprogrammierung (oder bei Skripten die Bindingvariable) überschrieben werden (default: Exception) Johannes Hellrich Groovy 16 / 30 Groovy – Möglichkeiten der Sprache Weitere Features Groovy Parallel Systems (GPars) Bietet schon seit mehreren Jahren die für Java 8 (ursprünglich 7) versprochenen Parallelisierungsoptionen Unterstützt verschiedene Paradigmen: fork/join Prallel Arrays (parallelisiert automatisch Operationen) Aktoren (message passing) Agenten (serialisieren parallele Variablenzugriffe) Dataflow (reaktiv, vgl. Tabellenkalkulation) Kern des Systems in Java, Benutzung über API oder DSL Offizielle Seite: http://gpars.codehaus.org/ Kurze Übersicht mit Erklärung der Paradigmen: www.ibm.com/developerworks/library/j-gpars/ Johannes Hellrich Groovy 17 / 30 Groovy – Möglichkeiten der Sprache Weitere Features GPars Beispiel Johannes Hellrich Groovy 18 / 30 Groovy – Möglichkeiten der Sprache Weitere Features Annotationen Annotationen verändern den Parsebaum des Programmes und können z.B. Methoden in diesen einfügen Deklarative Möglichkeit Pattern zu benutzen ⇒ eindeutig und wartungsfreundlich Beispiele: @Singleton (für Klassen) @Immutable (für Klassen) @Lazy (für Felder) Johannes Hellrich Groovy 19 / 30 Groovy – Möglichkeiten der Sprache Weitere Features Diverse Features Viele Verbesserungen an der Standardbibliothek Begrenztes Überladen von Operatoren möglich 0, “”, leere Listen usw. sind false GroovyMarkup und GPath erlauben es XML wie normale Objekte zu behandeln xml.node.child.text() GStrings erlauben das einbinden von Variablen wie in der Shell: println(“variable hat den Wert $variable”) ?.-Operator zum automatischen Abfangen von NullPointerException bei aneinandergeketteten Methoden Johannes Hellrich Groovy 20 / 30 Groovy in der Praxis Status 2. offizielle Sprache der JVM Johannes Hellrich Groovy 21 / 30 Groovy in der Praxis Status Geschichte und Supporter Erfinder: James Strachan (2003) Aktueller Hauptentwickler: Guillaume Laforge Firma im Hintergrund: VMware (Cloud/Virtualisierung), davor SpringSource (Java Spring Framework) Johannes Hellrich Groovy 22 / 30 Groovy in der Praxis Verbreitung Verbreitung Grails Groovy-Webframework, verwendet z.B. für Sky.com, Wired.com und Teile von LinkedIn Gradle Alternative zu Ant/Maven, kompatibel mit Maven Repositories, versucht die “vernünftigen” Defaults von Maven mit der Konfigurierbarkeit von Ant zu verbinden EPO Das Europäische Pattentamt verwerdet Groovy für eine Data Flow Plattform, die den Austausch mit anderen Patentämtern erleichtert Stellen Laut LinkedIn gibt es für Groovy und Scala in Deutschland einige wenige Stellen (2-3), für Clojure keine, Java ist weit verbreiteter (350) Johannes Hellrich Groovy 23 / 30 Groovy in der Praxis Verbreitung Literatur Amazon listet 47 Bücher (Java 4k) Standardwerk: “Groovy in Action” Alt aber gezielt für Umsteiger “Groovy für Java Entwickler” Johannes Hellrich Groovy 24 / 30 Groovy in der Praxis Im JULIE Lab Bisher: Kleinere Skripts Genutzt für JenAge Direkter Import von Abhängigkeiten via Maven durch Grape Nur ca. 50% des Codes eines vergleichbaren Java Programms Johannes Hellrich Groovy 25 / 30 Groovy in der Praxis Im JULIE Lab Zukunft: Skripte / Tests ! Groovy ist ähnlich Ausdrucksstark wie Python oder Perl, dabei aber näher an der gewohnten Java Syntax und kann direkt mit bestehenden Java Bibliotheken interagieren ⇒ ideale Skriptsprache für uns Metaprogrammierung und DSLs erleichtern das Schreiben von Tests (Mock-Objekte, Deklarativer Ansatz) Johannes Hellrich Groovy 26 / 30 Groovy in der Praxis Im JULIE Lab Zukunft: Einbindung in größere Projekte? Groovy ist sehr geeignet um verschiedene Bibliotheken und z.B. Nutzeranfragen zu verbinden Entsprechendes Design ist in der C(++) Welt sehr verbreitet, wo viele große Projekte (u.a. die meisten Spiele) intern eine Skriptsprache wie Python oder Lua benutzen und nur rechenaufwändige Operationen direkt in C(++) stattfinden Ich möchte diesen Designansatz zu testen, er sollte gleichzeitig die Modularisierbarkeit fördern (man muss autarke Java Bibliotheken erstellen) und die Entwicklung beschleunigen Ein möglicher Einsatzzweck: Reader/Consumer, das Konvertieren von und nach XML ist mit Groovy sehr komfortabel und im Vergleich zu Parsern sowieso sehr schnell Johannes Hellrich Groovy 27 / 30 Groovy in der Praxis Einstieg Einstieg Offizielle Seite: http://groovy.codehaus.org/ Quickstart: http://groovy.codehaus.org/Quick+Start Johannes Hellrich Groovy 28 / 30 Groovy in der Praxis Einstieg Entwicklungsumgebungen groovysh – interaktive shell groovyConsole – rudimentäre IDE Eclipse Plugin Johannes Hellrich Groovy 29 / 30 Groovy in der Praxis Fazit Fazit Groovy ... ist abstrakter und hat sinnvollere Defaults als Java ... bietet viele (Syntax-)Features Jahre vor Java ... ist dabei voll Java-kompatibel und in der Syntax nah verwandt ... ist die ideale Skriptsprache in einer Java-lastigen Umgebung ... hat das Potential Java Entwicklung zu beschleunigen Johannes Hellrich Groovy 30 / 30