Publicado Ruby 3.1.0 versión previa 1

Nos complace anunciar la publicación de Ruby .

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 y 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), que primero compilan el comienzo de un método e incrementalmente compila el resto a medida que el tipo de los argumentos y variables se determina 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 que habilita YJIT. Por ahora está limitado a macOS & Linux sobre plataformas x86-64.

Gema debug: Un nuevo depurador

Se incluye un nuevo depurador debug.gem. debug.gem es una implementación de un depurador rápido que provee muchas características tales como depuración remota, REPL con colores, integración con IDE (VSCode) entre otras. Remplaza la librería estándar lib/debug.rb.

error_highlight: Localización de errores afinada en las trazas

Se ha incluido un gema 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

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.

Mejoras a Irb

Se describirán en la siguiente versión previa.

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]]

RBS

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

Actualizaciones desde Ruby 3.0.0:

  • se introduce rbs collection para administrar RBSs de gemas. doc
  • Se han añadido/actualizado muchas características 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 el documento.

Actualizaciones desde Ruby 3.0.0:

Mejoras de 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 menos de 1000 instrucciones.
    • Para soportar Zeitwerk de Rails, el código compilado con JIT ya no se cancela cuando se habilita 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. [[Bug #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]

Actualizaciones a la librería estándar

  • Se actualizaron algunas librerías estándar
    • RubyGems
    • Bundler
    • RDoc 6.4.0
    • ReLine
    • JSON 2.6.0
    • Psych 4.0.2
    • FileUtils 1.6.0
    • Fiddle
    • StringIO 3.0.1
    • IO::Console 0.5.9
    • IO::Wait 0.2.0
    • CSV
    • Etc 1.3.0
    • Date 3.2.0
    • Zlib 2.1.1
    • StringScanner
    • IpAddr
    • Logger 1.4.4
    • OStruct 0.5.0
    • Irb
    • Racc 1.6.0
    • Delegate 0.2.0
    • Benchmark 0.2.0
    • CGI 0.3.0
    • Readline(C-ext) 0.1.3
    • Timeout 0.2.0
    • YAML 0.2.0
    • URI 0.11.0
    • OpenSSL
    • DidYouMean
    • Weakref 0.1.1
    • Tempfile 0.1.2
    • TmpDir 0.1.2
    • English 0.7.1
    • Net::Protocol 0.1.2
    • Net::Http 0.2.0
    • BigDecimal
    • OptionParser 0.2.0
    • Set
    • Find 0.1.1
    • Rinda 0.1.1
    • Erb
    • NKF 0.1.1
    • Base64 0.1.1
    • OpenUri 0.2.0
    • SecureRandom 0.1.1
    • Resolv 0.2.1
    • Resolv::Replace 0.1.0
    • Time 0.2.0
    • PP 0.2.1
    • Prettyprint 0.1.1
    • Drb 2.1.0
    • Pathname 0.2.0
    • Digest 3.1.0.pre2
    • Un 0.2.0
  • Se actualizaron las siguientes gemas incluidas en Ruby
    • minitest 5.14.4
    • power_assert 2.0.1
    • rake 13.0.6
    • test-unit 3.5.0
    • rbs 1.6.2
    • typeprof 0.20.0
  • Las siguientes gemas por omisión ahora son ahora gemas incluidas en Ruby.
    • net-ftp
    • net-imap
    • net-pop
    • net-smtp
    • matrix
    • prime

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

Con esos cambios, 2963 archivos cambiados, 529321 inserciones(+), 92305 eliminaciones (-) desde Ruby 3.0.0!

Descargas

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

    SIZE: 20821221
    SHA1: 40dfd3db076a49fab9a0eee51e89d9b3d16a4e23
    SHA256: 540f49f4c3aceb1a5d7fb0b8522a04dd96bc4a22f9660a6b59629886c8e010d4
    SHA512: 63f528f20905827d03649ed9804e4a4e5c15078f9c6c8efcfb306baa7baafa17a406eb09a2c08b42e151e14af33b1aadbd9fb1cc84f9353d070b54bbf1ff950d
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0-preview1.tar.xz

    SIZE: 15742844
    SHA1: 22aa861b17031cd1b163b7443f5f2f5897c5895e
    SHA256: 86a836ad42f6a7a469fce71ffec48fd3184af55bf79e488b568a4f64adee551d
    SHA512: bdbd7c624197ca478658280d84123a8c12ae72425bc566dcc75989c5b5ef114dd57e64efc09e2413ed615d9b47621a70ace0f3612e8ca7ba853822ad9e88c0b0
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0-preview1.zip

    SIZE: 25019629
    SHA1: ef5fa22890e55935db4b96b3089a8aea1335bd85
    SHA256: 4e8d118b2365164873148ac545a8fa36c098b846a9b19ebb9037f8ee9adb4414
    SHA512: 917803aac0848e00871614a09740b5c9cca26f200d68580dde61666633f1b7fee506e25ea4ed0c38eb20149417bf9f1ed449a4d2aec5b726de670e7177e5c07a
    

Qué es Ruby

Ruby fue desarrollado inicialmente pof Matz (Yukihiro Matsumoto) en 1993, y ahora es desarrollado como Código Abierto. Corre en múltiples plataformas y se usa en todo el mundo especialmente para desarrollo web.