Publicado Ruby 3.0.0 RC1

26/12/2020Artículo original

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

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

Análisis Estático

###RBS

RBS es un lenguaje para describir los tipos de los programas Ruby.

Los verificadores de tipos, incluyendo TypeProf y otras herramientasque soporten RBS entenderán mejor los programas Ruby 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 tipadopato (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 con una clase, un modulo ydefiniciones de constantes.

module AplicacionMensajeria VERSION: String class Channel attr_reader nombre: String attr_reader mensajes: Array[Mensaje] attr_reader usuarios: Array[Usuario | Robot] # `|` significa tipos unión, `Usuario` o `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.

TypeProf

TypeProf es una herramienta para análisis de tipos incluida en el paqueteRuby.

Actualmente, TypeProf sirve como una forma de inferencia de tipos.

Lee código Ruby plano (sin anotiaciones de tipos), analiza que métodos sedefinen y como se usan, y genera un prototipo de la firma de los tipos enformato RBS.

Aquí hay una simple demostración de TypeProf.

Entrada de ejemplo:

# test.rbclassUserdefinitialize(name:,age:)@name,@age=name,ageendattr_reader:name,:ageendUser.new(name: "John",age: 20)

Salida de ejemplo:

$ typeprof test.rb# Classesclass User attr_reader name : String attr_reader age : Integer def initialize : (name: String, age: Integer) -> [String, Integer]end

Puede ejecutar TypeProf guardando el archivo de entrada como “test.rb” yejecutandolo como “typeprof test.rb”.

También puede probar TypeProf en línea. (TypeProf corre al lado del servidor, así que ¡disculpe si no está operando!)

Ver detalles en la documentación y en demostraciones.

  Un estudio sugiere que el ruido no afecta el trabajo de los desarrolladores, excepto cuando toca arreglar bugs

TypeProf es experimental y aún no es una herramienta madura, sólo soporta unsubconjunto del lenguaje Ruby, y la detección de errores en tipos es limitada.Pero está creciendo rapidamente para mejorar la cobertura de lascaracterísticas del lenguaje, el desempeño del análisis y la usabilidad.Toda retroalimentación es bienvenida.

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 (thread-safe) 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.

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 con el primer Ractor.new se presenta una advertencia de característicaexperimental.

El siguiente programita calcula prime? en paralelo con dosractores. Podrá comprobar que la ejecución es casi 2 veces más rápidaque la del programa secuencial en un computador paralelo.

require'prime'# n.prime? con enteros enviados en r1, r2 que corren en paralelor1,r2=*(1..2).mapdoRactor.newdon=Ractor.recvn.prime?endend# enviar parámetrosr1.send2**61-1r2.send2**61+15# esperar resultados de expr1 y expr2pr1.take#=> truepr2.take#=> true

Ver más detalles endoc/ractor.md.

Planificador (Scheduler) de Fibras

Se introduce Fiber#scheduler para interceptar operaciones que bloquean.Esto permite una concurrencia liviana sin cambiar elcódigo existente. Dar un vistazo general y ver como funciona en “Don’t Wait For Me, Scalable Concurrency for Ruby 3”.

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
  • Process.wait
  • 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.

(Explicar la gema Async con enlaces). Este programa de ejemplo realizarávarias peticiones HTTP de manera concurrente:(Explicar esto:)

  1. async es una gema exterior
  2. async usa esta nueva característica
require'async'require'net/http'require'uri'Asyncdo["ruby","python","c"].eachdo|topic|AsyncdoNet::HTTP.get(URI"https://www.google.com/search?q=#{topic}")endendend

Otras características notables

  • El reconocimiento de patrones en una línea se ha rediseñado (experimental) se añade =>. Puede usarse como una asignación al lado derecho.0=>apa#=> 0{b: 0,c: 1}=>{b:}pb#=> 0in se ha cambiado para retornar true o false.# version 3.00in1#=> false# version 2.70in1#=> raise NoMatchingPatternError
  • Se agrega un patrón Encontrar (Find). (experimental)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
  • El reconocimiento de patrones (case/in) ya no es experimental.
  • Se agrega una definición de métodos que no requiere end.defcuadrado(x)=x*x
  • Hash#except ahora es un método incorporado.h={a: 1,b: 2,c: 3}ph.except(:a)#=> {:b=>2, :c=>3}
  • Memory view se agrega como característica experimentalEste 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 arreglo multidimensional. Esta nueva característica se diseñó empleando como referencia el protocolo de colchón (buffer ) de Python.
  Así puedes crear tu primer documento usando LaTeX, el lenguaje de maquetación por excelencia

Mejoras en desempeño

  • Se implemetaron muchas mejoras en MJIT. Ver detalles en el archivoNEWS.
  • Pegar código largo en IRB es 53 veces más rápido que con Ruby 2.7.0.Por ejemplo el tiempo requerido para pegar este código de ejemplopasa de 11.7 segundos a 0.22 segundos.

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 eneste documento.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 invertidoen Ruby 2.5, pero esto se ha revertido. 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.2Bundler 2.2.2IRB 1.2.6Reline 0.1.5Pysch 3.2.1JSON 2.4.1BigDecimal 3.0.0CSV 3.1.9Digest 3.0.0Fiddle 1.0.4StringIO 3.0.0StringScanner 3.0.0
  • 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.
  • Los siguientes archivos de stdlib ahora son gemas y se publicaron enrubygems.org. Englishabbrevbase64drbdebugdigesterbfindio-nonblockio-waitnet-ftpnet-httpnet-imapnet-protocolnkfopen-urioptparsepathnameppprettyprintresolv-replaceresolvrindasecurerandomsetshellwordssyslogtempfiletimetmpdirtsortunweakrefwin32ole
  El resurgir de la programación funcional

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

Con estos cambios, 3889 archivos cambiados, 195560 inserciones(+), 152740 eliminaciones(-)desde Ruby 2.7.0!

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

Descargas

  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-rc1.tar.gzSIZE: 19488885SHA1: 34ede2128a90ef3217d9cab9efcdf20fc444f67cSHA256: e1270f38b969ce7b124f0a4c217e33eda643f75c7cb20debc62c17535406e37fSHA512: 798926db82d27366b39be97556ac5cb322986b96df913c398449bd3ece533e484a3047fe35e7a6241dfbd0f7da803438f5b04b805b33f95c73e3e41d0bb51183
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-rc1.tar.xzSIZE: 14341128SHA1: deff34cf67373dca166e9961051b6c4723aaaec6SHA256: f1adda082f9291e394d25ed32975abbef90962dc4c8b11130586a0151558e79aSHA512: f4f13dbfa1c96088eb3dbfba0cb1fe99f4e17197ee2d4b78fbe16496780797a10daa3f2ff9c38d2d7b316974101eccf45184708ad05491fb49898b3a7cc6d673
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-rc1.zipSIZE: 23902334SHA1: e3e20b4d0ec895e579ae416f2b7552c6be3596f7SHA256: 25ced95fa544af6a64d348dc5eace008edfda22f55ed1f6ad9f932b344e6196dSHA512: c81b3bf7ce582bf39fd7bc1e691d0777ed4cf38ca6b4d54bc9edaef076ae8bcecb6a86ebfd773591f7d8533e772517033c762d35fdc8b05cb4db4488c2bacec2

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-12-20
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