JRuby es una implementación del lenguaje de programación Ruby sobre la máquina virtual Java , escrito en gran parte en Java . Es un software gratuito publicado bajo una licencia EPL / GPL / LGPL de tres vías . JRuby está estrechamente integrado con Java para permitir la incrustación del intérprete en cualquier aplicación Java con acceso bidireccional completo entre el código Java y Ruby (similar a Jython para el lenguaje Python).
Desarrollador (es) | Charles Oliver Nutter, Thomas Enebo, Ola Bini y Nick Sieger |
---|---|
Versión inicial | 2001 |
Lanzamiento estable | 9.2.17.0 / 29 de marzo de 2021 [1] |
Repositorio | |
Escrito en | Ruby y Java |
Sistema operativo | Multiplataforma |
Plataforma | máquina virtual de Java |
Tipo | Intérprete del lenguaje de programación Ruby |
Licencia | EPL / GPL / LGPL |
Sitio web | www |
Los desarrolladores principales de JRuby son Charles Oliver Nutter y Thomas Enebo , con muchos colaboradores actuales y pasados, incluidos Ola Bini y Nick Sieger . En septiembre de 2006, Sun Microsystems contrató a Enebo y Nutter para trabajar en JRuby a tiempo completo. [2] En junio de 2007, ThoughtWorks contrató a Ola Bini para trabajar en Ruby y JRuby. [3]
En julio de 2009, los desarrolladores de JRuby dejaron Sun para continuar con el desarrollo de JRuby en Engine Yard . [4] En mayo de 2012, Nutter y Enebo dejaron Engine Yard para trabajar en JRuby en Red Hat . [5]
Historia
JRuby fue creado originalmente por Jan Arne Petersen, en 2001. En ese momento y durante varios años después, el código era un puerto directo del código Ruby 1.6 C. Con el lanzamiento de Ruby 1.8.6, se inició un esfuerzo para actualizar JRuby a las características y la semántica 1.8.6. Desde 2001, varios contribuyentes han ayudado al proyecto, lo que ha llevado al actual (2012[actualizar]) equipo central de alrededor de seis miembros.
JRuby 1.1 agregó los modos de compilación Just-in-time y Ahead-of-time a JRuby y ya era más rápido en la mayoría de los casos que la implementación de referencia Ruby 1.8.7 vigente en ese momento. [6]
Los paquetes JRuby están disponibles para la mayoría de las plataformas; Fedora 9 fue uno de los primeros en incluirlo como paquete estándar en JRuby 1.1.1. [7] [8]
En julio de 2009, los principales desarrolladores de JRuby en Sun Microsystems, Charles Oliver Nutter , Thomas Enebo y Nick Sieger , se unieron a Engine Yard para continuar con el desarrollo de JRuby. [4] [9] En mayo de 2012, Nutter y Enebo dejaron Engine Yard para trabajar en JRuby en Red Hat . [5]
JRuby es compatible con Ruby MRI versiones 1.6 a 1.9.3. JRuby 1.0 es compatible con Ruby 1.8.6, y JRuby 1.4.0 actualiza esa compatibilidad a Ruby 1.8.7. JRuby 1.6.0 agregó soporte simultáneo para Ruby 1.9.2, con JRuby 1.7.0 haciendo que Ruby 1.9.3 sea el modo de ejecución predeterminado (la compatibilidad con Ruby 1.8.7 está disponible a través de una marca de línea de comandos). JRuby 9.0.0.0 agregó soporte para Ruby 2.2.
La versión actual de JRuby (9.2.11.0) es compatible con Ruby 2.5.7. La próxima versión 9.3 será compatible con Ruby 2.6. [10]
Ruby on Rails
JRuby ha podido ejecutar el marco web Ruby on Rails desde la versión 0.9 (mayo de 2006), [11] [12] con la capacidad de ejecutar RubyGems y WEBrick . Desde que Sun contrató a los dos desarrolladores principales, la compatibilidad y la velocidad de Rails han mejorado enormemente. La versión 1.0 de JRuby superó con éxito casi todos los casos de prueba de Rails. [13] Desde entonces, los desarrolladores han comenzado a utilizar aplicaciones JRuby for Rails en entornos de producción. [14]
Colaboración de varias máquinas virtuales
El 27 de febrero de 2008, Sun Microsystems y la Universidad de Tokio anunciaron un proyecto de investigación conjunta para implementar una máquina virtual capaz de ejecutar más de una aplicación Ruby o JRuby en un intérprete. [15]
Invocación dinámica en máquinas virtuales Java
JSR 292 ( Soporte de lenguajes escritos dinámicamente en la plataforma JavaTM ) [16] propone:
- agregar una nueva
invokedynamic
instrucción en el nivel de JVM, lo que permite la invocación del método mediante la verificación dinámica de tipos , - clases y métodos que cambian dinámicamente en tiempo de ejecución.
El proyecto Sun Open source Multi Language Virtual Machine tiene como objetivo crear un prototipo de este JSR. [17] El primer prototipo funcional, desarrollado como parche en OpenJDK , se anunció y estuvo disponible a finales de agosto de 2008. [18] [19]
El equipo de JRuby ha implementado la invocación dinámica en su código base. La invocación dinámica se envió inicialmente con la versión 1.1.5 en una forma primitiva. [20] La versión 1.7.0 lo habilitó de forma predeterminada en las compilaciones de Java 8. [21]
Historial de versiones
Esta tabla presenta solo las versiones que presentan pasos significativos en la historia de JRuby, además de las versiones que principalmente corrigieron errores y mejoraron el rendimiento. Las mejoras de rendimiento tampoco se muestran en la tabla a continuación, ya que cada versión generalmente ha traído tales mejoras.
Lanzamiento | Fecha de lanzamiento | Reflejos |
---|---|---|
0,9 | 2006-08-01 | Soporte de rieles [11] |
1.1 | 2008-03-28 | Funciona mejor que Ruby MRI 1.8.7 [6] Modo AOT y modo JIT [22] |
1.1.4 | 2008-08-28 | Capa de integración de Java refactorizada El comienzo de Ruby 1.9 admite el subsistema FFI para llamar a bibliotecas C [23] |
1.2.0 [24] | 2009-03-16 | Compilador JIT para Ruby 1.9 Soporte preliminar de Android por parte del proyecto Ruboto . |
1.3.0 [25] | 2009-06-03 | JRuby se ejecuta en entornos restringidos mejor como GAE / J |
1.4.0 [26] [27] | 2009-11-02 | Compatibilidad con Windows Native Launcher y Windows installer Ruby 1.8.7 |
1.5.0 [28] | 2010-05-12 | Native Launcher para plataformas basadas en UNIX Compatibilidad con Ant e integración Rake-Ant Actualizaciones de la biblioteca estándar, RubyGems y RSpec |
1.6.0 [29] | 2011-03-15 | Compatibilidad con API y lenguaje Ruby 1.9.2 Perfilador integrado Soporte experimental para extensiones C basadas en la API C de Ruby |
1.7.0 [21] | 2012-10-22 | El idioma Ruby 1.9.3 es el modo predeterminado Soporte para invocadoinámico |
1.7.4 [30] | 2013-05-16 | Soporte experimental de Ruby 2.0 (la mayoría de las funciones y stdlib incluidas) |
9.0.0.0 [31] | 2015-07-22 | Compatibilidad con Ruby 2.x Nuevo tiempo de ejecución optimizado Nuevo proceso y E / S compatible con POSIX Lógica de codificación / transcodificación totalmente adaptada desde MRI |
9.1.7.0 [32] | 2017-01-11 | Se corrigió LinkageError grave al usar múltiples hilos Se corrigieron varios problemas de argumentos de palabras clave Se corrigieron varios problemas del analizador. Uso reducido de memoria del JIT Actualizar Psych a 2.2.2 Actualice jruby-openssl a 0.9.18 72 problemas solucionados |
9.2.0.0 [33] | 2018-05-24 | Compatibilidad con idiomas Ruby 2.5 |
9.2.9.0 [34] | 2019-10-30 | Compatibilidad con idiomas Ruby 2.5.7 |
Diseño
Desde principios de 2006, el equipo central actual de JRuby se ha esforzado por mover JRuby más allá de ser un simple puerto C, para soportar un mejor rendimiento y ayudar a la eventual compilación al código de bytes de Java . Para apoyar este fin, el equipo estableció un objetivo ambicioso: poder ejecutar Ruby on Rails sin modificaciones usando JRuby. En el proceso de lograr este objetivo, el conjunto de pruebas de JRuby se expandió hasta tal punto que el equipo ganó confianza en la "corrección" de JRuby. Como resultado, hacia fines de 2006 y principios de 2007, comenzaron a realizar rediseños y refactorizaciones mucho más complicados de los subsistemas centrales de JRuby.
JRuby está diseñado para funcionar como una máquina virtual de modo mixto para Ruby, donde el código puede interpretarse directamente, compilarse justo a tiempo en tiempo de ejecución en código de bytes de Java o compilarse antes de tiempo en código de bytes de Java antes de la ejecución. Hasta octubre de 2007, solo el modo interpretado admitía todas las construcciones de Ruby, pero un compilador AOT / JIT completo está disponible desde la versión 1.1. [22] El diseño del compilador permite que el código compilado e interpretado se ejecute en paralelo, así como la descompilación para volver a optimizar y generar el código de bytes generado como archivos de clase Java.
Soporte de marcos
JRuby tiene soporte integrado para Rails, RSpec, Rake y RubyGems. Incorpora un subsistema FFI para permitir el uso de bibliotecas C empaquetadas como gemas. También permite lanzar Interactive Ruby Shell (irb) como lo hace Ruby MRI.
El Netbeans Ruby Pack , disponible en NetBeans 6, permite el desarrollo de IDE con Ruby y JRuby, así como Ruby on Rails para las dos implementaciones de Ruby. [35] [36] Ya no está incluido en NetBeans 7.0 y posteriores.
Programación
Ruby se encuentra con Java
JRuby es similar al intérprete estándar de Ruby, excepto que está escrito en Java . JRuby presenta algunos de los mismos conceptos, incluida la programación orientada a objetos y la escritura dinámica que Ruby. La diferencia clave es que JRuby está estrechamente integrado con Java y se puede llamar directamente desde programas Java. [37] Java tiene una base importante en el desarrollo de aplicaciones web.
JRuby llamando a Java
Una característica poderosa de JRuby es su capacidad para invocar las clases de la Plataforma Java . Para hacer esto, primero se debe cargar el soporte de Java de JRuby, llamando a "require 'java'". El siguiente ejemplo crea un JFrame de Java con un JLabel:
requiere 'java'marco = javax . swing . JFrame . nuevo marco . getContentPane . agregue javax . swing . JLabel . nuevo marco ( '¡Hola, mundo!' ) . setDefaultCloseOperation javax . swing . JFrame :: EXIT_ON_CLOSE marco . paquete de marco . set_visible verdadero
JRuby también permite al usuario llamar al código Java usando el método de subrayado más parecido a Ruby y referirse a las propiedades de JavaBean como atributos: [ dudoso ]
marco . content_pane . agregar marco de etiqueta . visible = verdadero
Llamar a JRuby desde Java
JRuby se puede llamar fácilmente desde Java, utilizando JSR 223 [38] Scripting para Java 6 o el marco de trabajo Apache Bean Scripting .
// Ejemplo usando JSR 233 Scripting para Java 6 ScriptEngineManager mgr = new ScriptEngineManager (); ScriptEngine rbEngine = mgr . getEngineByExtension ( "rb" ); prueba { rbEngine . eval ( "pone '¡Hola mundo!'" ); } captura ( ScriptException ex ) { ex . printStackTrace (); }
Actuación
Según algunos puntos de referencia, JRuby es más rápido que las alternativas. Dado que las implementaciones varían en la cantidad de código que se carga antes de la ejecución, los diferentes métodos de medición de la velocidad pueden dar lugar a interpretaciones sesgadas de las ventajas de rendimiento. El tiempo que tarda una máquina virtual Java en cargarse a menudo se excluye de los tiempos de ejecución cuando se calculan los puntos de referencia.
JRuby tiene la ventaja arquitectónica significativa de poder aprovechar los subprocesos de JVM sin estar limitado por un bloqueo de intérprete global (similar a Rubinius ), por lo tanto, logra un paralelismo completo dentro de un proceso, que Ruby MRI no puede lograr a pesar de aprovechar los subprocesos del sistema operativo.
En una aplicación de servidor web Mongrel real probada en 2007, el rendimiento de JRuby es mejor que el de Ruby MRI 1.8, después de que se haya creado una instancia de la máquina virtual Java. [39]
En un punto de referencia de 2007 de implementaciones de Ruby, JRuby fue más rápido que Ruby MRI 1.8 en algunas pruebas, pero YARV superó a ambos. [40]
En abril de 2014, en The Computer Language Benchmarks Game , JRuby 1.7.4 generalmente tiene el mismo rendimiento que Ruby MRI 2.1.0, pero usa más memoria. [41] [42]
Ver también
- GraalVM
- Lista de lenguajes de secuencias de comandos de Java
- ZK (marco) : un marco Ajax compatible con JRuby
Referencias
- ^ "Lanzamientos · jruby / jruby" . github.com . Consultado el 5 de abril de 2021 .
- ^ Jacki (7 de septiembre de 2006). "Sun da la bienvenida a los desarrolladores de JRuby" . En el registro. Archivado desde el original el 29 de agosto de 2012 . Consultado el 7 de noviembre de 2013 .
- ^ Ola Bini. "ThoughtWorks" . En el registro.
- ^ a b "El equipo JRuby de Sun salta el barco al patio de motores" . PCWorld . 2009-07-28 . Consultado el 2 de junio de 2012 .
- ^ a b "Red Hat señuelos en JRuby power pair" . El registro . 2012-05-23 . Consultado el 2 de junio de 2012 .
- ^ a b Cangiano, Antonio (12 de marzo de 2007). "El gran tiroteo de Ruby" . Consultado el 1 de febrero de 2008 .
- ^ Nutter, Charles (25 de abril de 2008). "JRuby 1.1.1 en RedHat Fedora" . Consultado el 26 de abril de 2008 .
- ^ "jruby" . fedoraproject.org . Consultado el 26 de abril de 2008 .[ enlace muerto permanente ]
- ^ Nutter, Charles (28 de julio de 2009). "El futuro de JRuby en Engine Yard" . Archivado desde el original el 31 de julio de 2009 . Consultado el 28 de julio de 2009 .
- ^ "Soporte Ruby 2.6" . Equipo JRuby . Consultado el 9 de abril de 2020 .
- ^ a b "Soporte de rieles" . Equipo JRuby . Consultado el 17 de febrero de 2008 .
- ^ Nutter, Charles (24 de agosto de 2008). "Cero a producción en 15 minutos" . Consultado el 27 de agosto de 2008 .
- ^ El 98,6% de los 2.807 casos de prueba específicos de Rails se ejecutan correctamente; ver JRuby 0.9.8 Lanzado Archivado el 22 de mayo de 2015 en Wayback Machine
- ^ "Historias de éxito" . Wiki de JRuby en GitHub. 2011-01-05 . Consultado el 16 de marzo de 2011 .
- ^ "La Universidad de Tokio y Sun Microsystems comienzan proyectos de investigación conjunta sobre informática de alto rendimiento y lenguajes de programación basados en la web" . Sun Microsystems . 2008-02-27 . Consultado el 28 de febrero de 2008 .
- ^ ver JSR 292
- ^ "Subproyectos e Investigaciones" . Sun Microsystems . 2007 . Consultado el 6 de febrero de 2008 .
- ^ Rose, John (26 de agosto de 2008). "¡Feliz Día Internacional de Invocación Dinámica!" . Consultado el 3 de septiembre de 2008 .
- ^ Lorimer, RJ (1 de septiembre de 2008). "La invocación dinámica se ejecuta en OpenJDK" . infoq.com . Consultado el 3 de septiembre de 2008 .
- ^ Nutter, Charles (11 de septiembre de 2008). "Una primera prueba de InvokeDynamic" . Consultado el 13 de septiembre de 2008 .
¡Logré conectar correctamente InvokeDynamic directamente en el proceso de envío de JRuby! ¡Qué emoción! El código ya está en el tronco de JRuby y se enviará con JRuby 1.1.5 (aunque obviamente estará deshabilitado en las JVM sin InvokeDynamic).
- ^ a b "JRuby 1.7.0 lanzado" . Equipo JRuby. 2012-10-22 . Consultado el 23 de octubre de 2011 .
- ^ a b Nutter, Charles (27 de septiembre de 2007). "El compilador está completo" . Consultado el 12 de octubre de 2007 .
- ^ Enebo, Tom (28 de agosto de 2008). "JRuby 1.1.4 lanzado" . Consultado el 25 de febrero de 2009 .[ enlace muerto permanente ]
- ^ Enebo, Tom (16 de marzo de 2009). "JRuby 1.2.0 lanzado" . Equipo JRuby. Archivado desde el original el 19 de marzo de 2009 . Consultado el 17 de marzo de 2009 .
- ^ Enebo, Tom (3 de junio de 2009). "JRuby 1.3.0 lanzado" . Equipo JRuby. Archivado desde el original el 12 de junio de 2009 . Consultado el 3 de junio de 2009 .
- ^ "JRuby 1.4.0 lanzado" . Equipo JRuby. 2009-11-02 . Consultado el 3 de noviembre de 2009 .
- ^ "JRuby 1.4.0 lanzado" . adtmag.com. 2009-11-10 . Consultado el 21 de noviembre de 2009 .
- ^ "JRuby 1.5.0 lanzado" . Equipo JRuby. 2010-05-12 . Consultado el 12 de mayo de 2010 .
- ^ "JRuby 1.6.0 lanzado" . Equipo JRuby. 2011-03-15 . Consultado el 15 de marzo de 2011 .
- ^ "JRuby 1.7.4 lanzado" . Equipo JRuby. 2013-05-16 . Consultado el 19 de mayo de 2013 .
- ^ "Lanzamiento de JRuby 9.0.0.0" . Equipo JRuby. 2015-07-22 . Consultado el 25 de julio de 2015 .
- ^ "Lanzamiento de JRuby 9.1.7.0 - JRuby.org" . jruby.org . Consultado el 13 de enero de 2017 .
- ^ "Lanzamiento de JRuby 9.2.0.0" . Consultado el 27 de mayo de 2018 .
- ^ "Lanzamiento de JRuby 9.2.9.0" . Consultado el 5 de noviembre de 2019 .
- ^ "Compatibilidad con Ruby y JRuby disponible en NetBeans IDE" . netbeans.org. 2007-03-06 . Consultado el 4 de julio de 2009 .
- ^ "Ruby ilumina la plataforma NetBeans" . infoworld.com. 2007-03-01 . Consultado el 4 de julio de 2008 .
- ^ Fox, Joshua (17 de julio de 2006). "Ruby para el mundo Java" . JavaWorld . Consultado el 26 de julio de 2020 .
- ^ JSR 223: Secuencias de comandos para la solicitud de especificación de la plataforma Java
- ^ Sieger, Nick (25 de octubre de 2007). "JRuby on Rails: suficientemente rápido" . Consultado el 28 de octubre de 2007 .
- ^ Cangiano, Antonio (3 de diciembre de 2007). "El gran tiroteo de Ruby" . Consultado el 2 de febrero de 2014 .
- ^ "JRuby en comparación con Ruby 1.9, Computer Language Benchmarks Game (1)" . Archivado desde el original el 23 de enero de 2015 . Consultado el 2 de febrero de 2014 .
- ^ "JRuby en comparación con Ruby 1.9, Computer Language Benchmarks Game (2)" . Archivado desde el original el 23 de julio de 2014 . Consultado el 2 de febrero de 2014 .
Otras lecturas
- Kutner, Joe (August 22, 2012). Deploying with JRuby: Deliver Scalable Web Apps using the JVM (First ed.). Pragmatic Bookshelf. p. 200. ISBN 978-1934356975.
- O Nutter, Charles; Enebo, Thomas; Sieger, Nick; Bini, Ola; Dees, Ian (February 4, 2011). Using JRuby: Bringing Ruby to Java (First ed.). Pragmatic Bookshelf. pp. 300. ISBN 978-1934356654.
- Edelson, Justin; Liu, Henry (November 18, 2008). JRuby Cookbook (First ed.). O'Reilly Media. pp. 222. ISBN 978-0-596-51980-3.
- Bini, Ola (September 24, 2007). Practical JRuby on Rails Web 2.0 Projects: Bringing Ruby on Rails to Java (First ed.). Apress. pp. 330. ISBN 978-1-59059-881-8.
- Kutler, Chris; Leonard, Brian (May 4, 2009). NetBeans Ruby and Rails IDE with JRuby (First ed.). Apress. p. 160. ISBN 978-1-4302-1636-0. Archived from the original on August 27, 2012. Retrieved July 12, 2009.
enlaces externos
- Official website