Publicado por naruse el 2021-11-09
Traducción de vtamara
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.
- 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 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 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]]
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:
- Se ha implementado soporte experimental para IDE.
- Muchas correcciones a fallas y mejoras de desempeño.
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.
- 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.
[[Bug #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]
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.