Publicado por naruse el 2021-12-25
Traducción de vtamara
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.
- https://bugs.ruby-lang.org/issues/18229
- https://shopify.engineering/yjit-just-in-time-compiler-cruby
- https://www.youtube.com/watch?v=PBVLf3yfMs8
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 parafoo(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”.
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.
- Para cargas de trabajo como Rails, se cambia
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 ordenbaz
,qux
,foo
, y despuésbar
en Ruby 3.0. En Ruby 3.1, se evalúa en el ordenfoo
,bar
,baz
, y despuésqux
.
-
Localización de Ancho Variable: Cadenas (experimental) [Falla #18239]
- Psych 4.0 cambia
Psych.load
comosafe_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.