Este documento describe lenguajes dinámicos que se ejecutan en la máquina virtual de Java. Explica brevemente las características de lenguajes dinámicos y la máquina virtual de Java. Luego proporciona ejemplos de lenguajes como Jython, JRuby, Scala y Clojure que se ejecutan en la JVM, junto con breves descripciones de sus características y usos. Finalmente incluye una bibliografía de recursos adicionales.
1. Lenguajes Dinámicos
en la
Java Virtual Machine
Por: Óscar López, M.Sc.
Twitter: @oscar_lopez
2. Lenguajes Dinámicos
• Permiten realizar en ejecución labores que
en otros lenguajes se hacen en compilación
• Sistema de tipos dinámicos (*)
• Programación funcional
• Meta-programación y reflexión
• Scripting, “pegamento”, prototipos
• Edit-compile-test vs. read-eval-print
• ¡Es una definición subjetiva!
OALP-2010 All Rights Reserved 2
3. Java Virtual Machine
• Implementación en software de una máquina
física
• Portabilidad entre múltiples plataformas, no
depende específicamente de Java
• Ejecuta un lenguaje intermedio – bytecode
• Es una máquina de pila
• Manejo de memoria, verificador de clases,
excepciones, seguridad, hilos, GC, JIT
• ¡Puede implementar otros lenguajes!
• JSR 223 (Scripting, Java 1.6), JSR 292
(invokedynamic, Java 1.7), Da Vinci Machine
OALP-2010 All Rights Reserved 3
4. Lenguajes en la JVM
• Ada • Lisp (Clojure)
• AspectJ • Lua
• AWK • OCaml
• C • Oberon
• Cobol • Pascal
• ColdFusion • PHP
• Forth • Python (Jython)
• Groovy • Rexx
• Java • Ruby (JRuby)
• JavaFX Script • Scala
• JavaScript (Rhino) • Scheme
• LOGO • Tcl
OALP-2010 All Rights Reserved 4
7. Jython: Características
• Implementación 100% Java del lenguaje Python,
versión 2.5 (con algunas diferencias)
• Uso transparente de cualquier clase en Java
• Compilación a bytecode estática o dinámica
• Propiedades tipo bean
• Multi-hilos, resuelve el problema del GIL
• Usa el GC de Java, no conteo de referencias
• Desempeño depende de la JVM, pero en general
es más lento que CPython ó Java
• Atrasado respecto a CPython (2.7.0 RC, 3.1.2), no
puede usar módulos escritos en C
OALP-2010 All Rights Reserved 7
8. Jython: Casos de Uso
• Permite correr frameworks populares en
Python, como Django, Pylons, SQLAlchemy
• Lenguaje de scripting del WebSphere
Application Server
• Parte de las herramientas de desarrollo de
IBM Rational
• Lenguaje de programación de JHepWork,
un framework para análisis de datos
• Generación de pruebas de carga en The
Grinder
OALP-2010 All Rights Reserved 8
11. JRuby: Características
• Implementación 100% Java del lenguaje
Ruby, versión 1.8.7 (con algunas diferencias)
• Puede correr en modo interpretado o
compilado (AOT, JIT)
• Multi-hilos, no GIL, usa el GC de Java
• Mejor desempeño que la implementación
de referencia de Ruby 1.8 (pero no mejor
que Ruby 1.9)
• Permite usar librerías escritas en C, siempre
y cuando estén empacadas como gems.
OALP-2010 All Rights Reserved 11
12. JRuby: Casos de Uso
• Permite correr frameworks populares en
Ruby, como Rake (make), RubyGems
(paquetes)
• Desde sus inicios tuvo como objetivo
soportar por completo Ruby on Rails
• Las aplicaciones web de RoR pueden ser
desplegadas en Tomcat, Glassfish, etc.
• Igualmente, se pueden desplegar
aplicaciones JRuby en Google App Engine
OALP-2010 All Rights Reserved 12
15. Scala: Características
• Multiparadigma, diseñado para ser escalable; ¡lo
mejor de dos mundos!
• Modelo de compilación similar a Java, bytecode
casi idéntico al de Java
• OO puro: todos los valores son objetos, clases,
traits (con herencia dinámica, múltiple)
• Funcional: continuaciones, funciones anónimas y
anidadas, laziness, pattern matching, tail call (*)
• Sistema de tipos estáticos, genericidad, inferencia
de tipos (*)
• Modelos de concurrencia: Actores, CSP
OALP-2010 All Rights Reserved 15
16. Scala: Casos de Uso
• Twitter ha migrado buena parte de su
backend de Ruby a Scala
• Lift, un framework de aplicaciones web
similar a RoR. Puede desplegarse sobre
cualquier contenedor web
• Foursquare (red social + localización) usa
Lift
• Wattzon (energía, medio ambiente) está
hecho completamente en Scala
OALP-2010 All Rights Reserved 16
19. Clojure: Características
• Un dialecto moderno de Lisp
• Multiparadigma, aunque favorece el estilo
funcional de programación
• Lenguaje compilado, produce bytecode
• El código se puede tratar como datos
• Tipos dinámicos, inferencia de tipos
• Tail call limitada, por medio del operador recur
• Multimétodos, secuencias lazy
• Cuenta con un poderoso sistema de macros
• Concurrencia: agentes reactivos, STM
OALP-2010 All Rights Reserved 19
20. Clojure: Casos de Uso
• Compojure ó Conjure como frameworks
para aplicaciones web
• Clojure Contrib: extenso conjunto de
librerías y utilidades
• FlightCaster (predicción de demoras en
vuelos)
• Usado en Europa en aplicaciones del sector
salud, finanzas y energía
OALP-2010 All Rights Reserved 20