Ruby 3.1.0 Publicado

Tenemos el gusto de anunciar la publicación de of Ruby 3.1.0. Ruby 3.1 mantiene la compatibilidad con Ruby 3.0 y añade muchas características nuevas.

YJIT: Nuevo compilador experimental JIT en-proceso

Ruby 3.1 incorpora YJIT, un nuevo compilador JIT en-proceso desarrollado por Shopify.

Desde que Ruby 2.6 introdujo MJIT en 2018, su desempeño ha mejorado significativamente, y finalmente alcanzamos Ruby3x3 el año pasado. Pero aún cuando Optcarrot ha demostrado un impresionante aumento de velocidad, el JIT no ha beneficiado aplicaciones de negocios del mundo real.

Recientemente Shopify contribuyó muchas mejoras a Ruby para aumentar la velocidad de su aplicación Rails. YJIT es una contribución importante y busca mejorar el desempeño de aplicaciones rails.

Mientras MJIT es un compilador JIT basado-en-métodos que usa un compilador de C externo, YJIT usa Versiones de Bloques Básicos e incluye un compilador JIT. Con Versiones de Bloques Básicos Perezosa (Lazy Basic Block Versioning - LBBV), se compila primero el comienzo de un método e incrementalmente se compila el resto a medida que el tipo de los argumentos y variables son determinadas dinámicamente. Ver una introducción detallada en YJIT: a basic block versioning JIT compiler for CRuby.

Con esta tecnología, YJIT alcanza tanto un tiempo de calentamiento rápido como mejoras en desempeño en la mayoría de software del mundo-real, hasta 22% en railsbench, 39% en liquid-render.

YJIT es aún una características experimental, y como tal, está deshabilitado de manera predeterminada. Si quiere usarlo, especifique la opción --yjit en la línea de ordenes para habilitar YJIT. Por ahora está limitado a plataformas tipo Unix sobre x86-64.

Gema debug: Un nuevo depurador

Se incluye un depurador completamente re-escrito debug.gem. debug.gem cuenta con las siguientes características:

  • Mejora el desempeño de la depuración (no relentiza la aplicación aún con el depurador activad)
  • Soporta depuración remota
  • Siporte interfaces de depuración ricas (por ahoras se soportan VSCode y el navegador Chrome)
  • Soporta depuración multi-proceso / multi-hilos
  • REPL con colres
  • Y otras características como grabación y reproducción, posibilidad de hacer seguimiento y más.

Ruby incluía lib/debug.rb, pero no estaba bien mantenido y tenía problemas de desempeño y funcionalidad. debug.gem remplazó por completo a lib/debug.rb.

error_highlight: Localización de errores afinada en las trazas

Se ha introducido una gema incorporada con Ruby, error_highlight. Proporciona localización afinada de errores en la traza:

$ ruby prueba.rb
prueba.rb:1:in `<main>': undefined method `time' for 1:Integer (NoMethodError)

1.time {}
 ^^^^^
Did you mean?  times

Por el momento sólo soporta NameError.

Esta gema está habilitada de manera predeterminada. Puede deshabilitarla desde la línea de ordenes con la opción --disable-error_highlight. Ver detalles en el repositorio.

Aucompletación en IRB y Presentación de Documentación

El IRB ahora tienen una característica de autocompletación, que le permite simplemente teclear algo de código y aparecerá un diálogo de candidatos de completación. Puede usar Tab y Shift+Tab para desplazar arriba y abajo.

Si se ha instalado la documentación, cuando elija un candidato de completación, aparecerá el diálogo de documentación junto al diálogo de candidatos de completación, mostrando parte del contenido. Puede leer la documentación completa presionando Alt+d.

Otras características nuevas y notables

Lenguaje

  • Pueden omitirse valores en literales de diccionarios y en argumentos de palabra reservada [Feature #14579]
    • {x:, y:} es azúcar sintáctica para {x: x, y: y}.
    • foo(x:, y:) es azúcar sintáctica para foo(x: x, y: y).
  • En reconocimiento de patrones el operador pin ahora toma una expresión [Feature #17411]
Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a
#=> [[3, 5], [5, 7], [11, 13]]
  • Se pueden omitir paréntesis en reconocimiento de patrones de un línea. [Feature #16182]
[0, 1] => _, x
{y: 2} => y:
x #=> 1
y #=> 2

RBS

RBS es un lenguaje para describir la estructura de programas Ruby. Ver detalles en el repositorio.

Actualizaciones desde Ruby 3.0.0:

  • Los tipos de parámetros genéricos pueden acotarse. (PR).
  • Se soportan aliases de tipos genéricos. (PR)
  • Se introduce rbs collection para administrar RBSs de gemas. doc
  • Se han añadido/actualizado muchas firmas para librerías incorporadas y de la librería estándar.
  • Incluye soluciones a muchas fallas, así como mejoras de desempeño.

Ver más informaciń en el archivo CHANGELOG.md.

TypeProf

TypeProf es un analizador de tipos estático para Ruby. Genera un prototipo en RBS a partir de código Ruby sin anotaciones de tipos. Ver detalles en la documentación.

La principla actualización desde Ruby 3.0.0 es un soporte experimental para IDE llamado “TypeProf para IDE”.

Demo de TypeProf para IDE

La extensión vscode presenta la signatura adivinada de un método (o escrita explicitamente en un archivo RBS), subraya en rojo el código que podría causar un error de nombre o de tipo, y completa los nombres de métodos (i.e, muestra métodos candidatos). Ver detalles en la documentación in detail.

También, esta versión incluye muchas correcciones a fallas y mejoras en desempeño.

Mejoras en desempeño

  • MJIT
    • Para cargas de trabajo como Rails, se cambia --jit-max-cache de 100 a 10000. El compilador JIT ya no se salta la compilación de métodos con más de 1000 instrucciones.
    • Para soportar Zeitwerk de Rails, el código compilado con JIT ya no se cancela cuando se encuentra habilitado un TracePoint para eventos de clase.

Otros cambios notables desde 3.0

  • Reconocimiento de patrones en una línea, e.g., ary => [x, y, z], ya no es experimental.
  • Se ha cambiado levemente el orden de evaluación de asignaciones múltiples. [Falla #4443]
    • foo[0], bar[0] = baz, qux era evaluado en el orden baz, qux, foo, y después bar en Ruby 3.0. En Ruby 3.1, se evalúa en el orden foo, bar, baz, y después qux.
  • Localización de Ancho Variable: Cadenas (experimental) [Falla #18239]

  • Psych 4.0 cambia Psych.load como safe_load al método por omisión. Puede necesitar usar Psych 3.3.2 para cambiar este comportamiento. [Falla #17866]

Actualizaciones a las bibliotecas estándar

  • Se actualizan las siguiente gemas predeterminadas
    • RubyGems 3.3.3
    • base64 0.1.1
    • benchmark 0.2.0
    • bigdecimal 3.1.1
    • bundler 2.3.3
    • cgi 0.3.1
    • csv 3.2.2
    • date 3.2.2
    • did_you_mean 1.6.1
    • digest 3.1.0
    • drb 2.1.0
    • erb 2.2.3
    • error_highlight 0.3.0
    • etc 1.3.0
    • fcntl 1.0.1
    • fiddle 1.1.0
    • fileutils 1.6.0
    • find 0.1.1
    • io-console 0.5.10
    • io-wait 0.2.1
    • ipaddr 1.2.3
    • irb 1.4.1
    • json 2.6.1
    • logger 1.5.0
    • net-http 0.2.0
    • net-protocol 0.1.2
    • nkf 0.1.1
    • open-uri 0.2.0
    • openssl 3.0.0
    • optparse 0.2.0
    • ostruct 0.5.2
    • pathname 0.2.0
    • pp 0.3.0
    • prettyprint 0.1.1
    • psych 4.0.3
    • racc 1.6.0
    • rdoc 6.4.0
    • readline 0.0.3
    • readline-ext 0.1.4
    • reline 0.3.0
    • resolv 0.2.1
    • rinda 0.1.1
    • ruby2_keywords 0.0.5
    • securerandom 0.1.1
    • set 1.0.2
    • stringio 3.0.1
    • strscan 3.0.1
    • tempfile 0.1.2
    • time 0.2.0
    • timeout 0.2.0
    • tmpdir 0.1.2
    • un 0.2.0
    • uri 0.11.0
    • yaml 0.2.0
    • zlib 2.1.1
  • Se actualizan las siguiente gemas incorporadas.
    • minitest 5.15.0
    • power_assert 2.0.1
    • rake 13.0.6
    • test-unit 3.5.3
    • rexml 3.2.5
    • rbs 2.0.0
    • typeprof 0.21.1
  • Las siguientes gemeas predeterminadas ahora son gemas incorporadas. Debe añadir las siguiente librerías en el Gemfile en entornos con bundler.
    • net-ftp 0.1.3
    • net-imap 0.2.2
    • net-pop 0.1.1
    • net-smtp 0.3.1
    • matrix 0.4.2
    • prime 0.1.2
    • debug 1.4.0

Ver más detalles en el archivo NEWS o en la bitácora de cambios.

Desde Ruby 3.0.0 hay 3124 archivos cambiados, 551760 inserciones(+), 99167 eliminacion(-)!

¡Feliz Navidad, Felices Fiestas y disfrute programando con Ruby 3.1!

Descargas

  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.gz

    SIZE: 20103517
    SHA1: e4e8c20dd2a1fdef4d3e5bd5a3461000dd17f226
    SHA256: 50a0504c6edcb4d61ce6b8cfdbddaa95707195fab0ecd7b5e92654b2a9412854
    SHA512: 76009d325e961e601d9a287e36490cbc1f3b5dbf4878fa6eab2c4daa5ff2fed78cbc7525cd87b09828f97cbe2beb30f528928bcc5647af745d03dffe7c5baaa9
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.xz

    SIZE: 14709096
    SHA1: 92b603c2a69fb25d66c337a63e94280984edea11
    SHA256: 1a0e0b69b9b062b6299ff1f6c6d77b66aff3995f63d1d8b8771e7a113ec472e2
    SHA512: a2bb6b5e62d5fa06dd9c30cf84ddcb2c27cb87fbaaffd2309a44391a6b110e1dde6b7b0d8c659b56387ee3c9b4264003f3532d5a374123a7c187ebba9293f320
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.zip

    SIZE: 24388179
    SHA1: e37435956d6f840a0e8758d7374bc7e0e346105f
    SHA256: a3bfcd486d09c065d46421da0ff3d430ce4423fefd80cea63c6595d83ae4af0e
    SHA512: 67db71144e06da2c1c25eaf413d1417c99a4b18738a573f9e3371c11ea242eee9dcbdc3de17336f25ab5060039fe034e57298943d344be9cd9eb33bb56e2e1c6
    

Qué es Ruby

Ruby fue desarrollado inicialmente por Matz (Yukihiro Matsumoto) en 1993, y ahora se desarrolla como código abierto. Corre sobre diversas plataformas y se usa en todo el mundo especialmente para desarrollo web.