Lanzamiento del lenguaje de programación Ruby 3.2

Se lanzó Ruby 3.2.0, un lenguaje de programación dinámico orientado a objetos que es altamente eficiente en el desarrollo de programas e incorpora las mejores características de Perl, Java, Python, Smalltalk, Eiffel, Ada y Lisp. El código del proyecto se distribuye bajo las licencias BSD (“BSDL de 2 cláusulas”) y “Ruby”, que hace referencia a la última versión de la licencia GPL y es totalmente compatible con GPLv3.

Principales mejoras:

  • Se agregó un puerto inicial del intérprete CRuby, que se compila en código intermedio WebAssembly para ejecutarlo en un navegador web o en tiempos de ejecución independientes como wasmtime. Para la interacción directa con el sistema operativo cuando se ejecuta por separado, se utiliza la API WASI (WebAssembly System Interface). Entre otras cosas, se proporciona un contenedor VFS además de WASI, que le permite empaquetar toda la aplicación Ruby en una presentación en forma de un único archivo wasm. La ejecución en un navegador se puede utilizar para crear servicios web de demostración y capacitación como TryRuby. En la etapa actual de desarrollo, el puerto pasa con éxito los conjuntos de pruebas básicas y de arranque, que no utilizan la API Thread. El puerto tampoco admite fibras, excepciones ni recolección de basura.
  • El compilador JIT en proceso YJIT, creado por los desarrolladores de la plataforma de comercio electrónico Shopify como parte de una iniciativa para aumentar el rendimiento de los programas Ruby que utilizan el marco Rails y llaman a muchos métodos, ha sido declarado estable y listo para uso de producción. La diferencia clave con el compilador MJIT JIT utilizado anteriormente, que se basa en el procesamiento de métodos completos y utiliza un compilador externo en lenguaje C, es que YJIT utiliza Lazy Basic Block Versioning (LBBV) y contiene un compilador JIT integrado. Con LBBV, JIT primero compila solo el comienzo del método y compila el resto algún tiempo después, después de que se determinan los tipos de variables y argumentos utilizados durante la ejecución. YJIT está disponible para arquitecturas x86-64 y arm64/aarch64 en Linux, MacOS, BSD y otras plataformas UNIX.

    A diferencia de Ruby, el código YJIT está escrito en el lenguaje Rust y requiere el compilador Rustc 1.58.0+ para la compilación, por lo que la compilación YJIT está deshabilitada de forma predeterminada y es opcional. Al utilizar YJIT, se registró un aumento del 41 % en el rendimiento al ejecutar la prueba yjit-bench en comparación con el uso de interpretación.

    Lanzamiento del lenguaje de programación Ruby 3.2

  • Se agregó protección adicional contra ataques de denegación de servicio al procesar datos externos en expresiones regulares (ReDoS) ineficientes y que consumen mucho tiempo. Se ha mejorado significativamente el algoritmo de coincidencia, que utiliza la técnica de memorización. Por ejemplo, el tiempo de ejecución de la expresión '/^a*b?a*$/ =~ "a" * 50000 + "x"' se redujo de 10 a 0.003 segundos. El costo de la optimización es un aumento en el consumo de memoria, cuyo consumo es aproximadamente 10 veces mayor que el tamaño de los datos de entrada. La segunda medida de seguridad es la capacidad de definir un tiempo de espera (por ejemplo, “Regexp.timeout = 1.0”) durante el cual se debe procesar la expresión regular.
  • Se incluye el modo syntax_suggest, que ayuda a diagnosticar las causas de los errores asociados con una expresión de cierre extra o faltante. ¿'Fin' no coincidente, falta palabra clave (`do', `def`, `if`, etc.)? 1 clase Perro > 2 defbark > 3 final 4 final
  • La capacidad de marcar argumentos para errores relacionados con tipos y argumentos se ha agregado al modo de visualización de ubicación de errores, por ejemplo: test.rb:2:in `+': nil no se puede convertir en entero (TypeError) sum = ary [0] + aria [1] ^^^^^^
  • Se agregó una nueva sintaxis para redirigir conjuntos de argumentos a otros métodos: def foo(*) bar(*) end def baz(**) quux(**) end
  • Se propone Ruby_vm/mjit/compiler, una variante del antiguo compilador MJIT JIT, reescrito en lenguaje Ruby. Se aseguró de que MJIT se ejecute en un proceso separado en lugar de ejecutarse en un subproceso de trabajo de MJIT.
  • En Bundler 2.4, el procesamiento de dependencias utiliza el detector de versión PubGrub, que también se utiliza en el administrador de paquetes pub para el lenguaje Dart. El algoritmo Molinillo utilizado anteriormente se sigue utilizando en RubyGems, pero también será reemplazado por PubGrub en el futuro.
  • Versiones actualizadas de los módulos de gemas integrados y los incluidos en la biblioteca estándar.

Fuente: opennet.ru

Añadir un comentario