Seznámení
Jython, JRuby, BeanShell, Jacl… co vám to říká? Pokud zareagujete, že jsou to skriptovací jazyky běžící pod JVM, máte naprostou pravdu. Groovy je také jeden z nich. Vznikl teprve v roce 2003 a je tedy dost mladý na to, aby se mohl inspirovat z jazyků jako Ruby, Python a Perl, čerpá však také z funkcionálních jazyků, jako jsou například Haskell, Lisp nebo Scheme.
Groovy je silně objektově orientovaný jazyk disponující dynamickým typováním a kompatibilitou s Javou na úrovní bytecode. Do něj je samozřejmě kompilovatelný, zároveň však umožňuje použití jako běžný skriptovací jazyk. Interně podporuje spoustu vestavěných tříd včetně polí, regulárních výrazů, hashů, ale také XML nebo HTML.
V současné době je Groovy ve standardizačním procesu Java Community Process, v němž vystupuje jako JSR 241.
Instalujeme
Zpravidla návod na instalaci vynechávám, protože použití balíčkovacích systémů na sto způsobů dvacetkrát jinak (a osmdesátkrát okopírované z předchozích dílů) asi číst nikoho nebaví, dnes však udělám výjimku. Udělám ji jednak proto, že ne všechny balíčkovací systémy si s Groovy tykají, ale také proto, že Groovy očekává nastavení některých proměnných prostředí. Tedy pojďme na to.
Groovy bydlí na Groovy.codehaus.org, odkud se také dá stáhnout jako binární balíček. Narozdíl od Jythonu autoři Groovy zaplaťPánBůh neměli nutkavou potřebu udělat si svůj, ještě obskurnější instalátor, než se to povedlo ostatním před nimi a rozumně jednoduše dali k dispozici binárky, za což jim patří můj dík. Stáhnutý archiv rozbalíme do /opt/
a přidáme jej do $PATH
:
export PATH="$PATH:/opt/groovy-1.0/bin"
Zároveň bychom měli nastavit proměnnou GROOVY_HOME
a – pokud ji ještě nastavenou nemáme – JAVA_HOME
. GROOVY_HOME
má ukazovat do složky s právě nainstalovaným Groovy (tedy pravděpodobně /opt/groovy-1.0/
) a JAVA_HOME
do složky s nainstalovaným JDK.
Co v instalaci nalezneme?
Autoři byli štědří a kromě vlastního interpretu nás obdarovali spoustou užitečných utilitek. V první řadě bych se zastavil u Groovy shellu, do kterého se dostanete příkazem groovysh
. Je to sice jednoduchá, ale zato velmi účelná utilitka vyhodnocující výrazy jazyka Groovy stejně jako IRB v Ruby a interaktivní konsole Pythonu v Pythonu. GroovySH je bohužel zatím poněkud primitivnější, knihovnu doplňování příkazů pomocí knihovny readline
nepodporuje a kód se musí spouštět příkazem go
. Nu což, jedná se o mladý projekt, odpusťme mu to.
Pokud na nějaké obskurní bastlení v příkazové řádce moc nejste, můžete použít GroovyConsole, která obsahuje funkcionalitu GroovySH, ale v grafickém kabátku a v provedení, které má blíže spíše editoru než konsoli. Umožňuje nahlížet do proměnných pomocí „Inspect Variables“ a vůbec se jedná o dosti milou a užitečnou pomůcku.
Mnohdy se hodí zkompilovat zdrojový kód v Groovy do javovského bytecode, k čemuž slouží příkaz groovyc
. Když už jsme u té konverze, Groovy přináší také utilitku java2groovy
sloužící k převodu zdrojového kódu Javy do zdrojového kódu Groovy.
Nabíráme otáčky
Tak, to bychom měli základní seznámení. Fajn, hezký, ale to mám v (sem doplňte svůj oblíbený jazyk) taky. Co už ale zdaleka tak samozřejmé není jsou například closures, česky se tomu zpravidla říká uzávěry. Báječná věc, nemyslíte? Osobně mám dojem, že například pro psaní opravdu hezkých interních DSL jsou skoro nutností, ale přesto je zdaleka ne každý jazyk má. Groovy ano.
Píšeme v Groovy
Ale dost už planých řečí – pojďme si Groovy vyzkoušet na vlastní kůži!
#!/usr/bin/env groovy /* basic output */ time = new java.util.Date(); println "It's ${time.hours}:${time.minutes}." /* arrays */ jlanguages = ["Groovy", "JRuby", "Jython"] items_start_with_J = jlanguages.findAll { it.contains("J") } items_start_with_J.each { println "* $it" } def list = ["Rod", "Carlos", "Chris"] list.findAll { it.size() <= 4 }.each { println "The name shorter than three characters: $it" } /* OOP */ class Greet { def name Greet(who) { name = who[0].toUpperCase() + who[1..-1] } def salute() { println "Hello $name!" } } g = new Greet('Dolly') g.salute() /* XML 4ever */ println "\n===== It's time for some XML stuff now! ====" import groovy.xml.MarkupBuilder def myXMLDoc = new MarkupBuilder() myXMLDoc.workbook { worksheet(caption:"Employees") { row(fname:"John", lname:"McDoe") row(fname:"Nancy", lname:"Davolio") } worksheet(caption:"Products") { row(name:"Veeblefeetzer", id:"sku34510") row(name:"Prune Unit Zappa", id:"sku3a550") } } println myXMLDoc
Máte? Výborně. Nyní obsah uložte do souboru s příponou groovy
a udělte mu právo na spuštění. Nyní máte úplně normální skript, který prostě spustíte. Nemáte-li Groovy při ruce, napovím výstup:
It's 10:13. * JRuby * Jython The name shorter than three characters: Rod Hello Dolly! ===== It's time for some XML stuff now! ==== <workbook> <worksheet caption='Employees'> <row lname='McDoe' fname='John' /> <row lname='Davolio' fname='Nancy' /> </worksheet> <worksheet caption='Products'> <row name='Veeblefeetzer' id='sku34510' /> <row name='Prune Unit Zappa' id='sku3a550' /> </worksheet> </workbook>groovy.xml.MarkupBuilder@de7dad
Hezké, nemyslíte? Osobně je mi sice milejší do–end syntaxe než závorkování, ale jinak nemám Groovy co vytknout, naopak oceňuji intuitivnost Groovy. Ačkoliv se nemohu označit za odborníka na programování v Javě a Groovy má hodně javovskou syntaxi a vůbec chování, kódu v Groovy nejen poměrně rozumím, ale dokonce jsem schopen i některé jednoduché příklady napsat sám. To považuji za jednu z nejdůležitějších vlastností jazyka.
Projekty psané v Groovy
Zaujala mě odkazy na různé projekty v Groovy, které naleznete na Groovy homepage. Gant je rozhraní Antu nikoliv přes XML, nýbrž přes DSL v Groovy. Velmi nápadně se podobá systému Rake známého z Ruby. Ještě víc mě zaujaly Grails, což je webový framework silně inspirovaný populárním Ruby on Rails.
Závěr
Abych řekl pravdu, Groovy mě opravdu velmi zaujalo. Má dosti příjemnou syntaxi, velké možnosti a díky jeho vazbě na javovskou platformu má také úžasné možnosti využití jejich výhod, již existujícího kódu a podobně. Věřím, že od všeobecného přijetí Groovy dělí pouze několik let na větší rozšíření komunity a povědomosti o něm.
Groovy odkazy
- Groovy homepage
- Instalace Groovy
- Groovy na WikiPedii
- Groovy Getting Started Guide
- Groovy User Guide
- Cookbook Examples
- Developer Guide
- Testing Guide
- Groovy Advanced Usage Guide
- Gant
- Grails
- Getting to Know Groovy
- Groovy, Java's New Scripting Language