Publicado por naruse el 2018-12-06
Traducción de vtamara
Nos complace anunciar la publicación de Ruby 2.6.0-rc1.
Ruby 2.6.0-rc1 es el primer candidato a publicación de Ruby 2.6.0. Introduce algunas características nuevas y mejoras en desempeño, por ejemplo:
JIT
Ruby 2.6 introduce una implementación inicial de un compilador JIT (Just-in-time).
Un compilador JIT busca mejorar el desempeño de cualquier ejecución de un programa en Ruby. A diferencia de los compiladores JIT ordinarios para otros lenguajes, el compilador JIT de Ruby hace la compilación JIT de manera única, emitiendo código C en un disco y lanzando el proceso ordinario de compilación en C para generar código nativo. Ver también: Organización MJIT por Vladimir Makarov.
Forma de uso: Sólo especifique --jit
en la línea de comandos o en la
variable de entorno $RUBYOPT
.
Al especificar --jit-verbose=1
se presentará información básica de la
compilación JIT. Vea más opciones con ruby --help
.
El propósito principal de esta versión JIT es darle oportunidad de comprobar que funciona en su plataforma y encontrar riesgos de seguridad antes de la versión 2.6. El compilador JIT es soportado cuando Ruby se construye con GCC, Clang o Microsoft VC++, que debe estar disponible en tiempo de ejecución. De lo contrario no podrá usarlo por el momento.
Con Ruby 2.6.0 preview3, hemos alcanzado una mejora en velocidad de 1.7 veces sobre Ruby 2.5 con una carga de trabajo intensiva en el uso de la CPU, denominada Optcarrot https://gist.github.com/k0kubun/d7f54d96f8e501bbbc78b927640f4208. También vamos a mejorar el desempeño de cargas de trabajo intensivas en el uso de memoria tales como las aplicaciones Rails.
Este pendiente de la nueva era en el desempeño de Ruby.
RubyVM::AbstractSyntaxTree [Experimental]
Ruby 2.6 introduce el módulo RubyVM::AbstractSyntaxTree
.
Este módulo tiene un método parse
que puede reconocer código ruby en una cadena y retornar nodos del AST (Abstract Syntax Tree - Árbol de sintaxis abstracta), y el método parse_file
que reconoce código ruby en un archivo y retorna los nodos del AST.
También se introduce la clase RubyVM::AbstractSyntaxTree::Node
. Puede obtener información de la localización y los nodos hijos de objetos Node
. Esta característica es experimental. No se garantiza compatibilidad de la estructura de los nodos AST.
Nuevas características
-
Se agregó el alias
then
aKernel#yield_self
. [Característica #14594] -
else
sinrescue
ahora causa un error de sintaxis. [EXPERIMENTAL] -
Los nombres de constantes pueden comenzar con una letra mayúscula fuera de la tabla ASCII. [Característica #13770]
-
Rangos no acotados [Característica #12912]
Se introduce un rango no acotado
(1..)
. Funciona como si no terminara. A continuación se presenta un uso típico:ary[1..] # igual a ary[1..-1] sin el mágico -1 (1..).each {|index| ... } # ciclo infinito desde el índice 1 ary.zip(1..) {|elem, index| ... } # ary.each.with_index(1) { ... }
-
Añadido
Binding#source_location
. [Característica #14230]Este método retorna la localización en la fuente de una unión, un arreglo de 2 elementos
__FILE__
y__LINE__
. Tradicionalmente, la misma información podría recuperarse coneval("[__FILE__, __LINE__]", binding)
, pero planeamos cambiar este comportamiento para queKernel#eval
ignore la localización de uniones en las fuentes [Falla #4352]. Así que los usuarios deberían emplear este método recién introducido en lugar deKernel#eval
. -
Añadida la opción
:exception
para queKernel.#system
lance un error en lugar de retornarfalse
. [Característica #14386] - Agregado el modo oneshot [Característica #15022]
- Este modo revisa “si cada línea fue ejecutada al menos una vez o no”, en lugar de “cuantas veces fue ejecutada cada línea”. Un gancho para cada línea es disparado al menos una vez, y después de que es disparado se elimina la bandera del gancho, i.e., corre sin gastos adicionales.
- Agregada el argumento de palabra clave
:oneshot_lines
aCoverage.start
. - Agregadas el argumento de palabra clave
:stop
y:clear
aCoverage.result
. Siclear
es verdadero, deja el contador en cero. Sistop
es verdadero, deshabilita las mediciones de cobertura. - Coverage.line_stub, que es una función auixiliar que crea la “colilla” para cobertura de líneas de una código fuente dado.
FileUtils#cp_lr
. [Característica #4189]
Mejoras en desempeño
-
Mejorada la velocidad de
Proc#call
porque ya no necesitamos preocuparnos por$SAFE
. [Característica #14318]Con la prueba de referencia
lc_fizzbuzz
que usaProc#call
repetidas veces podemos medir mejoras de 1.4 veces [Falla #10212]. -
Mejorada velocidad de
block.call
cuandoblock
es un parámetro de bloque pasado a una función. [Característica #14330]Ruby 2.5 mejora el desempeño al pasar bloques. [Característica #14045] Además, Ruby 2.6 mejora el desempeño al llamar bloques pasados. Con micro-pruebas de referencia podemos observar una mejora de 2.6 veces.
-
Se introduce la estructura de datos Montón transitorio (Transient Heap - theap). [Falla #14858] [Característica #14989] theap es un montón usado para objetos en memoria de corta duración que son apuntados por clases específicas (
Array
,Hash
,Object
, andStruct
). Por ejemplo, hacer objetos Hash pequeños y de corta duración es 2 veces más rápido. Con la prueba de referencia rdoc, observamos una mejora en desempeño de entre 6 y 7%.
Otros cambios notables desde 2.5
-
$SAFE
es el estado global del proceso y podemos ponerlo nuevamente en0
. [Característica #14250] -
Es obsoleto pasar
safe_level
aERB.new
. Los argumentostrim_mode
yeoutvar
se cambian a argumentos de palabra clave (keyword arguments). [Característica #14256] -
La versión de Unicode soportada se ha actualizado a la 11. Se planea actualizar a 12 y 12.1 en las futuras versiones menores (TEENY) de Ruby 2.6.
-
Mezclado RubyGems 3.0.0.beta3. Se eliminaron las opciones
--ri
y--rdoc
. Por favor use las opciones--document
y--no-document
en lugar de esas. -
Mezclado Bundler como una gema por omisión.
Vea detalles en NOTICIAS o en la bitácora de commits.
Con esos cambios, cambiaron 6376 archivos, 227364 inserciones(+), 51599 eliminaciones (-) desde Ruby 2.5.0!
Disfrute programar con Ruby 2.6.0-rc1!
Descargas
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-rc1.tar.gz
SIZE: 16823448 bytes SHA1: 889db7731fd43f6dbf7f31ffdb0a29bba1a8d356 SHA256: 6d6183639ed9c02320d7132e97c65489a39e24d8b55fc4ed35ac53d1189cb61d SHA512: ad101adee5c43f3645561e73970f15d4e9141f707da69a92e224575c665949e18ca53389e5315fca2ea3934d77967a59e304353cde4a915537e7c4e4ee20be73
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-rc1.zip
SIZE: 20737499 bytes SHA1: 457e39aee1978da5e42af42a6ad230421544aa07 SHA256: 2bcdf468de499e4d6983d60d63dcc883f4c54fdc05a08a54eb93d315477bc4cc SHA512: 0842fae8a199f6c1e76f5d775edbf468e18a54f0419324eb73595e0268c728c71733371d71dc2fa342105dbc487987ca5556948a9ef067276a7b5f552462802a
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-rc1.tar.bz2
SIZE: 14607078 bytes SHA1: 269fe9d414d7731e4a63959fadffe5c50c08ce0e SHA256: b4e9c0e8801946e9f0baba30948955f4341e9e04f363c206b7bd774208053eb5 SHA512: cbd6281b2aab6fbce3f699c1ab57e5423304dca7a547a0b3cd4e8e980326dc7b85b2ca2bfaf3f3a648d40f4222fdf1740d81d422790ee7ae1ba1ed33eb11e3e8
-
https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-rc1.tar.xz
SIZE: 11851908 bytes SHA1: 3b93fdf1c5bd969ab4fe0a8176a6cf64e4597e6e SHA256: 21d9d54c20e45ccacecf8bea4dfccd05edc52479c776381ae98ef6a7b4afa739 SHA512: 3d93d8d80e4900e8b3a27f904ed60581cebc6c55f4ab7acafc81e95001f92f3ea4ddec2da6169b1ed5e0146f7b7c35c1c13b3243955d5825c72170834fe933f3