Publicado Ruby 3.0.0 versión previa 1

14/10/2020Artículo original

Nos complace anunciar la publicación de Ruby 3.0.0-preview1.

Introduce una serie de características nuevas y mejoras endesempeño.

RBS

RBS es un lenguaje para describir los tipos de los programas Ruby.Los verificadores de tipos, incluyendo perfiladores de tipos, y otrasherramientas que soporten RBS entenderán mejor los programasRuby con definiciones RBS.

Usted puede escribir la definición de clases y módulos: métodos que sedefinen en la clase, variables de instancia y sus tipos, y relacionesherencia/mix-in.El objetivo de RBS es soportar los patrones que comúnmente se venen programas en Ruby y permitir escribir tipos avanzados incluyendotipos unión, sobrecarga de métodos y genéricos.También soporta tipado pato (duck typing) con tipos de interfaz.

Ruby 3.0 se distribuye con la gema rbs, que permite analizary procesar definiciones de tipos escritas en RBS.

El siguiente es un pequeño ejemplo de RBS.

module AplicacionMensajeria VERSION: String class Channel attr_reader nombre: String attr_reader mensajes: Array[Mensaje] attr_reader usaurios: Array[Usuario | Robot] # `|` significa tipos unión, `Usuario` or `Robot`. def initialize: (String) -> void def publicar: (String, de: Usuario | Robot) -> Mensaje # Se soporta sobrecarga de métodos. | (File, de: Usuaurio | Robot) -> Mensaje endend

Ver más detalles en elarchivo README de la gema rbs.

Ractor (experimental)

Un Ractor es una abstracción de concurrencia al estilo Actor-modelo,diseñada para brindar una forma de ejecución en paralelo sinpreocuparse por la seguridad de los hilos de ejecución.

Puede crear múltiples ractors y puede ejecutarlos en paralelo.Un Ractor permite hacer programas paralelos con seguridad en los hilosde ejecución porque los ractors no comparten objetos normales.La comunicación entre ractors se soporta mediante envío demensajes.

  Funciones reguladoras en JavaScript: cómo limitar el número de veces que se puede llamar a una función cada segundo (debouncing)

Para limitar los objetos que se comparten, Ractor introduce diversasrestricciones a la sintaxis de Ruby (no hay cambio cuando no hay múltiplesRactors).

La especificación e implementación no es madura y podría cambiar afuturo, por eso esta característica se señala como experimentaly cuando se crea un Ractor se presenta una advertencia de característicaexperimental.

El siguiente pequeño programa calcula prime? en paralelo con dosractores y es casi 2 veces más rápido con dos o más núcleosque el programa secuencial.

require'prime'# n.prime? con enteros enviados en r1, r2 que corren en paralelor1,r2=*(1..2).mapdoRactor.newdon=Ractor.recvn.prime?endend# send parametersr1.send2**61-1r2.send2**61+15# wait for the results of expr1, expr2pr1.take#=> truepr2.take#=> true

Ver más detalles endoc/ractor.md.

Planificador (Scheduler Experimental)

Se introduce Thread#scheduler para interceptar operacionesque bloquean. Esto permite una concurrencia liviana sin cambiar elcódigo existente.

Los métodos y clases que se soportan en el momento son:

  • Mutex#lock, Mutex#unlock, Mutex#sleep
  • ConditionVariable#wait
  • Queue#pop, SizedQueue#push
  • Thread#join
  • Kernel#sleep
  • IO#wait, IO#read, IO#write y métodos relacionados (e.g.#wait_readable, #gets, #puts y así sucesivamente).
  • IO#selectno es soportado.

El actual punto de entrada para la concurrencia esFiber.schedule{…} sin embargo está sujeto a cambios paracuando se publique Ruby 3.

En el momento, hay disponible un planificador de prueba enAsync::Scheduler.Ver más detalles endoc/scheduler.md.[Feature #16786]

ADVERTENCIA: Esta característica es altamente experimental.Tanto el nombre como sus características cambiarán en la siguienteversión prevía.

Otras características notables

  • Se agrega una asignación al lado derecho.
fib(10)=>xpx#=> 55
  • Se agrega una definición de métodos que no requiere end.
defcuadrado(x)=x*x
  • Se agrega un patrón Encontrar (Find).
case["a",1,"b","c",2,"d","e","f",3]in[*pre,String=>x,String=>y,*post]ppre#=> ["a", 1]px#=> "b"py#=> "c"ppost#=> [2, "d", "e", "f", 3]end
  • Hash#except ahora es un método incorporado.
h={a: 1,b: 2,c: 3}ph.except(:a)#=> {:b=>2, :c=>3}
  • Se agrega como característica experimental Memory viewEste es un nuevo conjunto de llamados en la API de C para intercambiar áreas de memoria puras entre las librerías que son extensiones, por ejemplo para intercambiar un arreglo numérico con un mapa de bits. Las librerías que son extensiones pueden compartir también los metadatos del área de memoria que constan de la forma, el formato del elemento y así sucesivamente. Usando esta clase de metadatos, las librerías que son extensiones pueden compartir apropiadamente incluso un rreglo multidimensional. Esta nueva característica se diseñó empleando como referencia el protocolo de colchón (buffer ) de Python.
  5 errores que suponen el despido inmediato de un programador

Mejoras en desempeño

  • Se implemetaron muchas mejoras en MJIT. Ver detalles en el archivoNEWS.

Otros cambios notables desde 2.7

  • Los argumentos de palabra clave se separan de otros argumentos. En principio, el código que presente una advertencia en Ruby 2.7 nofuncionará. Ver detalles en ladocumentación.Por cierto, el re-envío de argumentos ahora soporta argumentos principales.
defmethod_missing(meth,...)send(:"do_#{meth}",...)end
  • La característica $SAFE se eliminó por completo; ahora es una variableglobal normal.
  • El orden de la traza de llamados (backtrace) se había revertido para sercomo en Ruby 2.5, pero esto se ha cancelado. Ahora se comporta comoRuby 2.4; se imprime primero un mensaje de error y el número de línea dondeocurrió la excepción; las funciones que había hecho la llamada se imprimendespués.
  • Se actualizaron algunas librerías estándar. RubyGems 3.2.0.rc.1Bundler 2.2.0.rc.1IRB 1.2.6Reline 0.1.5
  • Las siguientes librerías ya no son gemas distribuidas con Ruby.Instale las gemas correspondientes para usar sus funcionalidades.
  • Las siguientes gemas por omisión se volvieron gemas distribuidascon Ruby.
  • stdlib se volvió gema por omisión. Las siguientes gemas por omisiónse publicaron en rubygems.org abbrevbase64Englisherbfindio-nonblockio-waitnet-ftpnet-httpnet-imapnet-protocolnkfopen-urioptparseresolvresolv-replacerindasecurerandomsetshellwordstempfiletimetmpdirtsortweakref
  GAMBADAS: El 77% de los sitios web utiliza bibliotecas JavaScript vulnerables

Ver más detalles en el archivoNEWSo en la bitácora de contribuciones.

Con estos cambios, 3385 archivos cambiados, 150159 inserciones(+), 124949 eliminaciones(-)desde Ruby 2.7.0!

¡Por favor pruebe Ruby 3.0.0-preview1, y denos cualquier retroalimentación!

Descargas

  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.bz2SIZE: 15538340SHA1: 032697f3ace0a697cd72f68bac0032c31a8328d4SHA256: 013bdc6e859d76d67a6fcd990d401ed57e6e25896bab96d1d0648a877f556dbbSHA512: 3a6a6458d9c5f06555ab8705160f6b071f4dbe9d2a91cd7848852633657b495c480d74e4b2ff2cebddda556118d26bbb271160c989bc970bb1b5cb234e868d2f
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.gzSIZE: 17747808SHA1: 2842d2af2568d74c8d4071f5f536889a6b149202SHA256: ce8bd7534e7ec2a870b24d2145ea20e9bbe5b2d76b7dfa1102dbee5785253105SHA512: b94892951f842a1538f4b99022606ac2c0b5031f1ede7eef3833a8caa9ed63e9b22868509173bfefb406f263c65211db75597b152b61f49e5ba2a875fce63a27
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.xzSIZE: 12703060SHA1: 91d9fbe87504924148deeec90199d6ff4d7dcf56SHA256: aa7cce0c99f4ea2145fef9b78d74a44857754396790cd23bad75d759811e7a2aSHA512: dca5dcc965c434371947c100864090e29e649e19ae24b8bb2e88a534ebd8220c5a086035a999b1e8b1cd5ec154a6985a8d8dfea56095d712d62aeea7a2054f7d
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.zipSIZE: 22002645SHA1: 4b5b61066373daf0a947d3fafe2645788504a164SHA256: a39a48ed9a8ca2c83d65d225a1bb3db331c6587a77ba156c20e630c1b4bfc23bSHA512: 10f6f28715a52093d7d9da82d1678147091b45e2f279e463626adea8efbf181485daa42565e5086057ffb45a097ffb8ff395c572b247b6b5da27d85933cf58a8

Avance de 3.0.0-preview2

Planeamos incluir “type-profiler”que es un analizador de tipos estáticos. ¡Esté pendiente!

Qué es Ruby

Ruby fue desarrollado inicialmente por Matz (Yukihiro Matsumoto) en 1993,y ahora es desarrollado como código abierto. Corre en muchasplataformas y se usa en todas partes del mundo especialmente paradesarrollos web.

Publicado por naruse el 2020-09-25
Traducción de vtamara

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad