Publicado Ruby 3.2.0 versión previa 1

Nos complace anunciar la publicación de Ruby 3.2.0-preview1. Ruby 3.2 agrega muchas características y mejoras en desempeño.

Soporte para WebAssembly basado en WASI

Esta es un porte inicial del soporte para WebAssembly basado en WASI. Esto permite que un binario de CRuby esté disponible en navegadores Web, ambientes sin servidor Edge y otros empotrables WebAssembly/WASI. Actualmente este porte pasa los juegos de pruebas básicas de bootstrap que no usan el API de Threads.

Trasfondo

WebAssembly (Wasm) fue introducido inicialmente para ejecutar programas de manera segura y rápida en navegadores web. Pero buena parte de su objetivo –ejecutar programar eficientemente y con seguridad– es anhelado hace tiempo no sólo para el web sino para aplicaciones en general.

WASI (The WebAssembly System Interface) fue diseñado para ese caso de uso. Aunque una aplicación necesita comunicarse con el sistema operativo, WebAssembly corre en una máquina virtual que no tiene una interfaz del sistema. WASI lo estandariza.

El soporte para WebAssembly/WASI en ruby pretende aprovechar estos proyectos. Habilita a los desarrolladores de ruby para escribir aplicaciones que corran en esa plataforma prometida.

Caso de uso

Este soporte anima a los desarrolladores para que pueda utilizar CRuby en ambientes WebAssembly. Un ejemplo de un caso de uso es el soporte CRuby del espacio de juego TryRuby. Ahora usted puede probar CRuby original en su navegador web.

Puntos técnicos

Hoy en día WASI y WebAssembly carecen de algunas características para implementar Fibras, excepciones y el Recolector de Basura porque aún está evolucionado y también por razones de seguridad. Así que CRuby llena ese vació mediante Asyncify, que es una técnica de transformación binaria para controlar la ejecución en el espacio del usuario.

Además, construimos un Sistema Virtual de Archivos (VFS) sobre WASI que permite empaquetar con facilidad aplicación Ruby en un sólo archivo .wasm. Esto hace un poco más fácil la distribución de aplicaciones.

Enlaces relacionados

Temporizadore para Regexp

Se introduce una característica de temporizador durante concordancias de expresiones regulares.

Regexp.timeout = 1.0

/^a*b?a*$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in one second

Se sabe que la concordancia de expresiones regulares puede tardar un tiempo inesperadamente largo. Si su código intenta concordar una expresión regular posiblemente ineficiente con una cadena no confiable, un atacante podría explotarlo para lograr una Denegación de Servicio efectiva (también llamada Denegación de servicio por expresiones regulares o ReDoS).

El riesgo de Denegaciones de Servicio (DoS) puede prevenirse o mitigarse significativamente al configurar Regexp.timeout de acuerdo a los requerimientos de su aplicación Ruby. Por favor pruébelo en su aplicación, después le damos la bienvenida a su retroalimentación.

Observe que Regexp.timeout es una configuración global. Si quiere usar una configuración del temporizador diferente para una cierta expresión regular, puede usar la palabra reservada timeout junto con Regexp.new.

Regexp.timeout = 1.0

# This regexp has no timeout
long_time_re = Regexp.new("^a*b?a*$", timeout: nil)

long_time_re =~ "a" * 50000 + "x" # never interrupted

La propuesta original está en https://bugs.ruby-lang.org/issues/17837

Otras características nuevas y notables

Ya no se incluyen fuentes de terceros

  • Ya no incluimos las fuentes de terceros como libyaml y libffi.

    • la fuente de libyaml fue eliminada de psych. Puede instalar libyaml-dev en plataformas Ubuntu/Debian. El nombre del paquete difiere en cada plataforma.

    • libffi será eliminado de fiddle durante la segunda versión previa.

Lenguaje

  • El patrón Find ya no es experimental.

Mejoras en desempeño

Otros cambios notables desde 3.1

  • Hash
    • Hash#shift ahora siempre retorna nil si el hash está vacío, en lugar de retornar el valor predeterminado o llamar el proc predeterminado. [[Bug #16908]]
  • MatchData
    • Se ha añadido MatchData#byteoffset. [[Feature #13110]]
  • Modulos
    • Se ha añadido Module.used_refinements. [[Feature #14332]]
    • Se ha añadido Module#refinements. [[Feature #12737]]
    • Se ha añadido Module#const_added. [[Feature #17881]]
  • Proc
    • Proc#dup retorna una instancia de subclase. [[Bug #17545]]
    • Proc#parameters ahora acepta la palabra reservada lambda. [[Feature #15357]]
  • Refinamiento
    • Se ha añadido Refinement#refined_class. [[Feature #12737]]
  • Conjuntos
    • Set ahora está disponible como una clase incorporada que no necesita require "set". [[Feature #16989]] Ahora se llama de manera automática al usar la constante Set o con una llamada a Enumerable#to_set.
  • Cadenas
    • Se han añadido String#byteindex y String#byterindex. [[Feature #13110]]
    • Se actualizó Unicode a la versión 14.0.0 y Emoji a la version 14.0. [[Feature #18037]] (también aplica para Regexp)
    • Se ha añadido String#bytesplice. [[Feature #18598]]
  • Struct
    • Una clase Struct también puede inicializarse con argumentos de palabra reservada sin keyword_init: true en Struct.new [[Feature #16806]]

Actualizaciones a la librería estándar

  • Se actualizaron las siguientes gemas predeterminadas.

    • TBD
  • Se actualizaron las siguientes gemas incluidas.

    • TBD
  • Las siguientes gemas predeterminadas ahora son gemas incluidas (bundled). Debe agregar las siguientes librerías al Gemfile en entornos que usan bundler.

    • TBD

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

Con esos cambios, 1058 archivos cambiados, 34946 inserciones(+), 29962 eliminaciones(-) desde Ruby 3.1.0!

Descargas

  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.tar.gz

    SIZE: 20728782
    SHA1: 7c4197e67f230b0c5d011f4efb9b9158743a61c8
    SHA256: 6946b966c561d5dfc2a662b88e8211be30bfffc7bb2f37ce3cc62d6c46a0b818
    SHA512: d24e77161996c2085f613a86d1ed5ef5c5bf0e18eb459f6a93a0014a5d2ce41079283b4283d24cb96448a0986c8c6c52a04584abd4e73911ea59cefeb786836e
    
  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.tar.xz

    SIZE: 15011400
    SHA1: 6bcc30ac670ab391997e0d68ba97b451db078934
    SHA256: 6d28477f7fa626b63bf139afd37bcfeb28fce6847b203fa10f37cb3615d0c35d
    SHA512: 0eca2c346b995d265df2659b4215ff96e515c29926c2a6256caad99db9c4c51fec1a2d899ca63a00010d4111060dc0fdd4f591be84c0a2c43b6303879de3c5de
    
  • https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.zip

    SIZE: 25370458
    SHA1: 3c93c2e775366eec6e93cf670fc8677934cb4e48
    SHA256: 24f8ae73d56366453defb0654de624bd1c063921a1d7ac780e4da56bb8fbf7e4
    SHA512: 9754f11aa167df167d1b336e5c660aab1bd9e12421c093e0fe96e9a2da4ffb9859b7ea5263473bbc7b57ac8b5568cf7ac3116c0abdc647e1ff97a8d060ff7eae
    

Lo que es Ruby

Ruby fue desarrollado inicialmente por 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.