en Post

Lenguajes JVM

Cuándo apareció Java hace ya 22 años, también apareció el JVM (Java Virtual Machine), la máquina virtual capaz de correr en cualquier sistema operativo y que le otorga a Java su capacidad de ser escrito sólo una vez y poder ejecutar el bytecode en casi cualquier sistema operativo moderno. Pero Java no es el único lenguaje de programación que puede generar bytecodes para el JVM, es más hay todo un gran número de lenguajes de programación que permiten hacer exactamente lo mismo, dentro de ellos el actualmente muy popular Kotlin. Este post es sobre estos lenguajes de programación que generan bytecodes para JVM.

Scala, es un lenguaje de programación de uso general que proporciona soporte para la programación funcional y fue uno de los primeros lenguajes JVM y su objetivo fue resolver muchas de las críticas de Java.

El código fuente de Scala está destinado a ser compilado al bytecode de Java, de modo que el código ejecutable resultante se ejecute en una máquina virtual Java. Scala proporciona interoperabilidad del lenguaje con Java, de modo que las bibliotecas escritas en ambos idiomas pueden ser referenciadas directamente en código Scala o Java. Al igual que Java, Scala es orientada a objetos, y utiliza una sintaxis que usa llaves que recuerda mucho al lenguaje de programación C. A diferencia de Java, Scala tiene muchas características de lenguajes de programación funcionales como Scheme, Standard ML y Haskell, incluyendo currying, inferencia de tipos, inmutabilidad y concordancia de patrones. También tiene un sistema de tipo avanzado que soporta tipos de datos algebraicos, covarianza y contravariancia, tipos de orden superior (pero no tipos de rango superior) y tipos anónimos. Otras características de Scala no presentes en Java incluyen la sobrecarga del operador, los parámetros opcionales, los parámetros con nombre, las cadenas sin formato y las excepciones no verificadas.

El nombre Scala es una mezcla de las palabras escalabilidad (scale) y lenguaje (language) en inglés. Lo que significa que está diseñado para crecer con las exigencias de sus usuarios.

Groovy, es otro lenguaje JVM y está creado en base al paradigma de la programación orientado a objetos para la plataforma Java. Es un lenguaje dinámico con características similares a las de Python, Ruby, Perl y Smalltalk. Se puede utilizar como lenguaje de scripting para la plataforma Java, se compila dinámicamente al bytecode de la máquina virtual Java (JVM) y se interopera con otras bibliotecas y código Java. Groovy utiliza una sintaxis similar a Java. La mayoría del código Java también es válido sintácticamente en Groovy, aunque la semántica puede ser diferente.

Groovy 1.0 fue lanzado el 2 de enero de 2007 y Groovy 2.0 en julio de 2012. Desde la versión 2, Groovy también se puede compilar de forma estática, ofreciendo inferencia de tipo y mejoras de rendimiento con respecto de Java.

Fantom, es un lenguaje de programación orientado a objetos de uso general creado por Brian y Andy Frank que se ejecuta en una JVM, pero también en JavaScript y .NET Common Language Runtime, sin embargo el soporte de .NET se considera estatus de “prototipo”. Su principal objetivo de diseño es proporcionar una API de biblioteca estándar que abstrae la cuestión de si el código se ejecutará en última instancia en el JRE o CLR. Al igual que C # y Java, Fantom utiliza una sintaxis de llaves. El lenguaje apoya la programación funcional a través de cierres y concurrencia a través del modelo actor.

Fantom está a la mitad de camino entre un lenguaje dinámicamente tipado y estáticamente tipado. El sistema de tipos de Fantom es simple por diseño. Todas las variables se escriben estáticamente, ya que están en C # y Java. Fantom rechaza los tipos genéricos debido a su complejidad, pero tiene un conjunto de tipos genéricos integrados: Listas, Mapas y Func. Fantom también puede tener la sensación de un lenguaje de tipo dinámico a través de llamadas dinámicas y downcasting automático. Fantom tiene un API fácil de usar que permite reflexión y capacidades de metaprogramación.

Clojure, es otro JVM creado por Rich Hickey e inspirado en el paradigma de la programación funcional. Antes de crear Clojure, Hickey había desarrollado un proyecto llamado dotLisp, un similar a Clojure, pero basado en el Framework .NET, además de tres otros intentos anteriores de proporcionar interoperabilidad entre Lisp y Java: una interfaz Java de lenguaje extranjero para Common Lisp (jfli), una interfaz de objetos extraños para Lisp (FOIL)  y una interfaz amigable con Lisp para Java Servlets (Lisplets).

Hickey pasó cerca de 2 años y medio trabajando en Clojure antes de publicarlo públicamente, gran parte de ese tiempo trabajando exclusivamente en Clojure sin financiamiento externo. Al final de este tiempo, Hickey envió un correo electrónico anunciando el idioma a algunos amigos de la comunidad Common Lisp.

El proceso de desarrollo es impulsado por la comunidad y es administrado en el sitio web de Clojure Community. El sitio web contiene documentos de planificación y un seguimiento de problemas donde se pueden presentar errores. La discusión de desarrollo general ocurre en el Clojure Dev Google Group. Mientras que cualquiera puede enviar reportes de bugs e ideas, para contribuir con parches uno debe firmar el acuerdo de Clojure Contributor.

Los desarrolladores Clojure están dentro de los mejor pagados del mercado con sueldos en los seis dígitos.

Ceylon, es otro de los lenguajes JVM que siguen el paradigma de la programación orientada a objetos, fuerte y estáticamente tipado, con énfasis en la inmutabilidad, creado por Red Hat. Los programas de Ceylon se ejecutan en la máquina virtual Java (JVM) y se pueden compilar a JavaScript también. El diseño del lenguaje se centra en la legibilidad del código fuente, previsibilidad, facilidad de uso, modularidad y metaprogramación.

Las características importantes de Ceylon incluyen:

Un sistema de tipo que impone seguridad nula y existencia de elementos de lista en tiempo de compilación
Sintaxis regular y semántica, evitando casos especiales y construcciones primitivamente definidas a favor del azúcar sintáctico
Apoyo a la programación genérica y metaprogramación, con genéricos reificados
Modularidad incorporada al lenguaje, basada en módulos JBoss, interoperable con OSGi y Maven
Herramientas potentes, incluyendo un IDE basado en Eclipse

El nombre “Ceylon” (Ceilán en español), es una referencia oblicua a Java, ya que Java y Sri Lanka, antes eran conocidos como Ceylon (Ceilán), que son islas conocidas por el cultivo y la exportación de café y té.

Kotlin, el recientmente popular lenguaje de programación, también forma parte de la familia de lenguajes JVM. Kotlin es un lenguaje de programación estáticamente tipado que funciona en una máquina virtual de Java y que también puede ser compilado a Javascript o utilizar la infraestructura del compilador de LLVM. Su desarrollo principal esta a cargo de un equipo de programadores de JetBrains con sede en San Petersburgo, Rusia. Aunque la sintaxis no es compatible con Java, Kotlin está diseñado para interactuar con el código Java y depende del código Java de la Java Class Library. Es por eso que fue elegido por Google como uno de los lenguajes para el desarrollo de aplicaciones Android.

El nombre viene de la isla de Kotlin, cerca de San Petersburgo. Andrey Breslav mencionó que el equipo decidió nombrarlo igual que isla ya que el nombre Java, también hace referencia a una isla.

Y finalmente, para no hacer esta lista infinita, tenemos a:

Xtend, que es un lenguaje de programación de alto nivel de uso general para la máquina virtual Java, como todos los listados aquí. Sintácticamente y semánticamente Xtend tiene sus raíces en el lenguaje de programación Java, pero se centra en una sintaxis más concisa y agrega algunas funcionalidades adicionales tales como inferencia de tipos, métodos de extensión y sobrecarga de operadores. Al ser principalmente un lenguaje orientado a objetos, también integra características conocidas de la programación funcional. Xtend se escribe de forma estática y utiliza el sistema de tipos de Java sin modificaciones. Se compila a código Java y por lo tanto se integra perfectamente con todas las bibliotecas Java existentes.

El lenguaje Xtend y su IDE se desarrolla como un proyecto en Eclipse.org y participa en el tren de lanzamiento anual de Eclipse. Es un proyecto de código abierto bajo la licencia pública Eclipse. Sin embargo, el lenguaje puede ser compilado y ejecutado independientemente de la plataforma Eclipse.

Xtend se originó de Xtext, que es la tecnología utilizada para definir el lenguaje y el editor. Xtend fue lanzado por primera vez como parte de Xtext en el lanzamiento de Eclipse Indigo en junio de 2011. Desde el lanzamiento de Eclipse Juno (junio 2012, Xtend versión 2.3) Xtend se ha convertido en un proyecto independiente.

Finalmente aquí les dejo una infografía con la cronología de estos lenguajes (funte):

Espero que esta información les haya sido de utilidad a todos Uds.