Hlavní navigace

Groovy: Java má vzdáleného bratrance

15. 10. 2007
Doba čtení: 5 minut

Sdílet

Když se řekne „skriptovací jazyk“, většina lidí si téměř povinně vybaví jazyky jako jsou Perl, PHP, Python nebo Ruby. Skriptovacích jazyků je však celá řada a jedním z nich je právě i Groovy. Byť je Groovy kvantitativně jen jedním z mnoha jazyků, kvalitativně mezi nimi rozhodně vyniká.

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.codehau­s.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.

GroovyShell

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.

GroovyConsole

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.

UX DAy - tip 2

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

Měli byste zájem o miniseriálek o základech Groovy?

Byl pro vás článek přínosný?

Autor článku

Jakub Šťastný byl v letech 2007 až 2008 redaktorem serveru Root.cz. Mezi jeho zájmy patří Linux, programování a typografický systém TeX.