Tuesday, June 30, 2009

La esencia de Groovy

La esencia de Groovy

Seguramente muchos de los lectores de estas notas tienen una percepción similar a la mía cuando leen los promocionales de los lenguajes de programación, o de los marcos de trabajo, o de los sistemas operativos, o de casi cualquier cosa en la computación. Todos ellos se acompañan de una enorme lista de bondades para resolver los problemas que no resuelven (según ellos) las herramientas que ya existen, conocemos y dominamos.

Edsger W. Dijkstra en EWD 709 My hopes of computing science escribió: “Write a paper promising salvation, make it a 'structured' something or a 'virtual' something, or 'abstract', 'distributed' or 'higher-order' or 'applicative' and you can almost be certain of having started a new cult”. Quizá hoy, Dijkstra habría añadido los términos orientado a objetos, dinámico, metaprogramación y el resto de bondades que acompañan las listas de los lenguajes, que como Groovy, ofrecen la salvación.

Leo, por ejemplo, en uno de los comentarios al libro Programming in Groovy de Venkat Subramaniam lo siguiente: “ … Venkat takes the reader beyond simple keystrokes and syntax into the deep depths of “why?” Groovy brings a subtle sophistication to the Java platform that you didn’t know was missing. Once you see those missing language features in action, you can’t imagine how you ever programmed without them. …” Muchos coincidirán conmigo que lo que he subrayado en el párrafo anterior es un exceso de pasión.

En mayor o menor medida todos reflejamos cierta pasión hacia algunas herramientas y técnicas de la computación aunque no seamos los creadores de ellas. Experimento eso con cierta frecuencia, y en mi rol de profesor universitario lo manifiesto en cambios a los temarios de las materias que imparto, creo que para bien. Con Java me pasó hace ya más de 10 años, cuando decidí cambiar de C++ a ese lenguaje en mis clases de Programación Orientada a Objetos. Hoy estoy experimentando algo similar con los lenguajes dinámicos de moda como es el caso de Groovy que, en su esencia se manifiestan los siguientes “olores”:

Groovy es un lenguaje orientado a objetos que genera código ejecutable (byte code) para la máquina virtual de Java. Toma “prestado” las ideas de otros lenguajes como Smalltalk, Ruby y Python y (una idea excelente) mantiene una sintaxis familiar a la de Java, cosa muy conveniente para los “Javeros”. Como discutiré en otras notas para este blog, Groovy no solamente se adhiere a la sintaxis (con muchos nuevos idioms) sino que también preserva la semántica de Java y extiende el JDK (nuevas clases y nuevos componentes a las clases existentes) para implementar, en un lenguaje muy similar a Java , capacidades propias de los lenguajes dinámicos.

En Groovy, todo es un objeto. Las “instancias” de los tipos primitivos de Java, int, float, double, etc., son objetos y son objetos de verdad hasta en tiempo de ejecución. La porción de código siguiente ilustra este fenómeno - inusual para los que se educaron con la programación orientada a objetos con lenguajes como C++ y Java, pero resulta muy lógico para los amantes de Smalltalk.

  1. import java.lang.reflect. Constructor
  2. int entero = 5
  3. println "Clase de entero ${entero.getClass()}"
  4. Constructor c =entero.getClass().getConstructor(int.class)
  5. double d = c.newInstance(123)
  6. println d
  7. println "Clase de d ${d.class}"

La ejecución de este código resulta en:

® Clase de entero class java.lang. Integer

® 123.0

® Clase de d class java.lang.Double

El lector debe notar la existencia en la sintaxis de las palabras claves int y double en las líneas 2 y 5, pero que en esencia declaran objetos de tipo java.lang.Integer y java.lang.Double respectivamente, como puede observarse en el resultado de la ejecución.

Groovy es un lenguaje de guión (del inglés scripting language). Puede notarse en la porción de código anterior que, comparado con Java, no tenemos necesidad de escribir todo “un programa” para ejecutar pedazos de código. Lo que estamos haciendo es usar las capacidades de Groovy como lenguaje de guión y ejecutar ese código con su intérprete. Es el intérprete el encargado de completar “lo que falta” para la ejecución. Si es de su interés ver lo “que falta” puede compilar ese bloque de código y decompilar el byte code generado. Seguramente le parecerá muy complicado pero sin entrar en detalles, se puede realizar una disección del código fuente obtenido para entender un poco las entrañas de Groovy. Por lo pronto es suficiente con decir que, a partir de ese código, el intérprete genera una clase con un método estático main a “la Java” e incluye las sentencias ejecutables en ese método. El trabajo del intérprete nos ayuda a entender “paso a paso” las cosas del lenguaje sin necesidad de tener que escribirun programa completo. Piense por un momento en las ventajas de ésto para los primeros cursos de programación. Vendrán otras cosas interesantes de Groovy para estos menesteres.

Groovy es un lenguaje dinámico, con capacidades que no están presentes en los lenguajes estáticos. Y aquí podría venir una discusión eterna acerca del dinamismo y estatismo de los lenguajes de programación. No me dejo tentar por esa discusión y por lo pronto, para entender la esencia de Groovy, basta con decir que el término lenguaje de programación dinámico se usa en la literatura de manera vaga para denotar aquellos lenguajes de programación que permiten hacer en tiempo de ejecución cosas que otros lenguajes pueden realizar exclusivamente en tiempo de diseño o compilación. Entre esas cosas están la de poder extender los programas añadiendo nuevo código, extendiendo objetos y definiciones, modificando el sistema de tipos, etc.

Sucede que esos lenguajes como Groovy, que se promueven como lenguajes dinámicos, también manejan los tipos dinámicos. En el caso de Groovy existe la opción de los tipos estáticos y los tipos dinámicos lo que representa una gran ventaja para quien, viniendo del mundo de Java, quiere comenzar con Groovy “poco a poco” y continúa especificando sus tipos para todos los “ciudadanos de primera clase” en sus programas. En la porción de código siguiente hemos eliminado los tipos, y el resultado de su ejecución es el mismo.

  1. import java.lang.reflect. Constructor
  2. entero = 5
  3. println "Clase de entero ${entero.getClass()}"
  4. c =entero.getClass().getConstructor(int.class)
  5. double d =(double) c.newInstance(123)
  6. println d
  7. println "Clase de d ${d.class}"

La ejecución de este código resulta en:

® Clase de entero class java.lang. Integer

® 123.0

® Clase de d class java.lang.Double

Groovy es un lenguaje ágil de poca “ceremonia” que maneja una sintaxis más simple (una vez que nos acostumbramos a ella) y que sigue la filosofía de “Convention over configuration” o “Coding by Convention” que no significa otra cosa que considerar en la codificación, la especificación explícita de las cosas no convencionales y dejar implícito lo convencional, lo que casi siempre usamos. Por ejemplo, para que escribir que una clase es pública si casi siempre (¿será?) lo es.

No sé si al decir que es un lenguaje de “poca” ceremonia” transmito la idea. Es una frase que utiliza el autor de “Programming in Groovy” para indicar la sencillez de la sintaxis o ausencia de lo barroco en el texto de un programa en Groovy.

Groovy es un lenguaje que le otorga ciudadanía de primera clase a otras cosas, entre ellas a las funciones aumentando así la población de literales en el lenguaje. Las funciones en un lenguaje de programación son funciones, objetos, o ciudadanos de primera clase si el lenguaje permite tratarlas como cualquier otro objeto de primera clase y eso implica que:

Puedan expresarse con literales anónimos

Puedan almacenarse en variables

Puedan ser utilizadas como partes de una colección

Tengan una identidad con independencia de su nombre (que los objetos tengan una identidad inherente es una condición del paradigma de objetos.

Puedan ser comparadas por identidad con otras funciones

Puedan ser pasadas como parámetros en la invocación de otra función

Puedan ser retornadas como el resultado de una función

Tengan una representación textual

Puedan participar en un ambiente de cómputo distribuido (pasadas a otras máquinas virtuales como objetos remotos)

Puedan ser persistentes

Creo que se necesita un ejemplo para ilustrar todas estas características de los objetos de primera clase. Si mi intención es que lo que escribo sea leído, entonces una buena manera de lograrlo es suspender el episodio en un momento interesante, y creo que éste instante se presta. Aun faltan cosas importantes de la esencia de Groovy, quizá una de las más relevantes. Lo dejamos para la próxima.

Thursday, June 25, 2009

Comienzo con Groovy

Hace unos días comencé a estudiar Groovy.
Me interesaron algunos "pedazos" de código en esa lengua, pero sobre todo me llamó la atención la forma tan enfática en que sus fans hablan de la implementación del protocolo de metaobjeto en Groovy.
Me acordé entonces del libro "The Art of the metaobject protocol" de Gregor Kyczales y otros (el mismo Gregor de AspectJ) y de la importancia para el paradigma orientado a objetos, que tiene la metaprogramación al estilo de MOP, quizá una de las cosas más relevantes de ese paradigma y de la importancia que (en los momentos actuales con todo el ruido de los sistemas que evolucionan en ejecución) tiene para el diseño y construcción de software.
Algo más vimos (varios colegas y yo) de interesante en este lenguaje, además de su posible incidencia en el terreno de la industria de software. Ese algo más tiene que ver con usarlo como un primer lenguaje en los cursos de programación de los primeros semestres de la carrera de ingeniería en computación (con diferentes nombres en diferentes institucuiones). Quizá y seamos de los primeros en hacerlo, y por supuesto corremos el riego de ser pioneros.
Esto me animó aun más a seguir leyendo y escribiendo código con Groovy.
Quiero escribir en este blog algunas cosas del lenguaje , que ya escribo en mi cuaderno con el objetivo de preacticar mi caligrafía.
Así empiezo y espero no terminar pronto, pues hay mucho que decir.

Monday, February 9, 2009

Olvidé el URL

Cuando me propuse empezar este Blog, tuve el temor de olvidar hasta el URL del mismo. Así sucedió. Basta con observar la fecha del último post.
Con toda intención he agregado el gadget de seguidores de este blog. Como puede observarse, aun no tengo seguidores. ¿Quién sigue lo que no existe?
Espero que esta vez pueda darle continuidad a este proyecto. He seleccionado un momento difícil por la cantidad de trabajo, pero a veces los momentos difíciles son los de mayores recompensas.
¿De qué voy a (re)comenzar a escribir?. Aun no lo sé pero seguramente tendrá que ver con lo que hago.
Para tener seguidores pronto tendré que ofrecer algo para que algunos de mis amigos y estudiantes lean lo que escribo. El ofrecimiento será temporal. Después quedarán encantados con la lectura.