dijous, 21 de juliol del 2011

Groovy, un altre llenguatge per a la JVM

Al darrer post on parlava de BeanShell vaig esmentar Groovy. Però esmentar-lo no és suficient. Groovy es mereix un post. Vostès perdonaran, però fent el joc de paraules, Groovy és meravellós.

Groovy és un llenguatge per a la Java Virtual Machine (JVM). Si la seva sintaxi fos molt diferent a la de Java no tindríem cap dubte en veure'l com quelcom de diferent a la família Java. El cas, però, és que tot programa en Java és també un programa en Groovy.  La inversa no és certa perquè Groovy incorpora canvis i extensions diverses. Groovy pot importar i utilitzar els packages de Java.

Igual com ho fa BeanShell importa un grup de packages java per defecte (els d'ús més habitual).

Moltes de les característiques del llenguatge que vaig comentar per a BeanShell segueixen sent vàlides per a Groovy. Però BeanShell, a diferència de Groovy, està pensat i dissenyat per a ser un llenguatge d'scripting per a Java. Mentre que Groovy, tot i que també pot actuar com llenguatge d'scripting per a Java, és un llenguatge de construcció d'aplicacions.

Ara bé, el mode de funcionament habitual de Groovy és interpretat (realment es fa un compilat JIT a bytecode de Java, però es descarta el bytecode un cop s'ha utilitzat), a diferència del Java que és compilat. Això situa Groovy en el grup de llenguatges com Python, o Perl, o Ruby que es compilen al moment. Tanmateix, amb el JDK de Groovy s'entrega el compilador groovyc que permet compilar a bytecode de Java. És dir que podrem generar fitxers .class i executar-los a una JVM.

Per començar amb Groovy n'hi ha prou amb crear un script amb l'extensió .groovy i executar-lo amb l'aplicació groovy. De cara a depurar-ne el funcionament, però, pot ser útil fer servir l'intèrpret interactiu groovysh. Una versió  gràfica de groovysh és la groovyConsole. El JDK inclou els quatre programes esmentats: groovy, groovyc, groovysh i groovyConsole.



Al cas de Linux Ubuntu, la instal·lació de Groovy es pot realitzar des del Centre de Programari de l'Ubuntu. Convé instal·lar també la documentació, que queda ubicada a /usr/share/doc/groovy-doc. La documentació inclou els javadoc. Per a una introducció al llenguatge, o guies d'usuari cal anar a la web de Groovy, a la secció de documentació.

La forma fàcil d'accedir al llenguatge és partint de Java, si més no per a tots aquells que coneixem aquest llenguatge.

Una classe Java o un programa Java són executables per Groovy sense fer res més. Ara bé, si es vol treure profit de Groovy cal utilitzar-ne les seves característiques, aleshores el que es pot fer és anar despullant el Java de tot allò que és redundant o no necessari en Groovy:

- Els següents packages estan importats per defecte:
  • java.io.*
  • java.lang.*
  • java.math.BigDecimal
  • java.math.BigInteger
  • java.net.*
  • java.util.*
  • groovy.lang.*
  • groovy.util.*
- '==' funciona sempre com em mètode  equals().

- 'in' és paraula clau.

- A Java un array es pot declarar com int[] a= {1,2,3}; a Groovy cal fer-ho int[] a= [1,2,3]; és dir amb [].

- Els llaços 'for' admeten construccions alternatives.
Per exemple, en Java es pot fer   for (int i=0; i < len; i++) {...}
A Groovy també i,  a més, són possibles les construccions alternatives amb 'in'
for (i in 0..len-1) {...}
for (i in 0..<len) {...}


i aquesta última que aprofita que a Groovy tot són objectes
len.times {...}
Aquesta última és una diferència important. A Java hi han uns tipus primitius, per exemple int, que en ocasions cal envoltar amb uns wrapper, per exemple, Integer per a poder utilitzar-los com objectes. Igualment, en ocasionsm cal passar de Integer a int. Això és el boxing/unboxing. A Groovy no cal. Tot són objectes. Un número té mètodes, com el mètode times, per exemple.

- El ';' al final de línia és opcional (però recomanable si es vol claredat).

- El 'return' de les funcions és opcional (però, també, recomanable per claredat).

- 'this' es pot fer servir dins de mètodes estàtics.

- Per defecte, les classes i mètodes són públics.

- Groovy, com BeanShell, o com es fa JavaScript, permet definir objectes a partir de funcions. En realitat, pot fer-ho a partir de blocs. Això és el que s'anomenen closures (o clausures).

- A Java cal posar blocs try-catch, o throws. A Groovy no cal (evidentment, si es produeix una excepció, no serà capturada).

- Groovy només detectara errors com l'ús de mètodes no declarats, o el pas d'arguments de tipus equivocat en temps d'execució. A Java aquesta mena d'errors es detecten en temps de compilació.

Una bona referència per veure  diferències entre Java i Groovy (i també amb Ruby) són aquestes pàgines de A. Sundararajan's Weblog. No és un llistat exhaustiu de les diferències.

http://blogs.oracle.com/sundararajan/entry/java_groovy_and_j_ruby

http://blogs.oracle.com/sundararajan/entry/java_groovy_and_j_ruby1

Finalment, un altre bon lloc on trobar snippets de Groovy és http://www.groovyexamples.org/

I fins aquí la presentació de Groovy. El següent pas és, doncs, posar a treballar Groovy. El llenguatge és potent. Prou potent com per ser la base de Grails. Grails ve a ser l'equivalent amb Groovy al framework web Ruby on Rails, basat en Ruby. De Grails, com no, caldrà parlar-ne en un proper post.

Cap comentari:

Publica un comentari a l'entrada