Diferencias entre Ruby 2.5 y 3

Clase 21 de 39Curso de Ruby

Gracias a que la comunidad de Ruby es muy activa, constantemente se están lanzando nuevas versiones del lenguaje y de los diferentes intérpretes. Al momento de crear este curso el último "release" es la versión 2.5.3. Para mantenerte actualizado sobre estas versiones puedes revisar la página oficial del lenguaje (https://www.ruby-lang.org) y también, cada vez que sale una nueva versión te recomiendo "googlear" los cambios que esta versión incluye.

Por ejemplo: http://lmgtfy.com/?q=ruby+2.5+release+new+features en donde te encontraras con articulos como https://blog.jetbrains.com/ruby/2017/10/10-new-features-in-ruby-2-5/ o https://www.engineyard.com/blog/ruby-250-new-features en donde te resumen las nuevas caracteristicas que se incluyen en la nueva version. Adicionalmente cada nueva versión incluye parches de seguridad que son importantes para mantener tu aplicación siempre segura y protegida en contra de ataques por lo que es muy recomendable siempre estar revisando las nuevas versiones y actualizar las aplicaciones cuando sea posible.

¿Qué esperar de Ruby 3?

Los desarrolladores de Ruby tienen un proyecto llamado Ruby 3x3 con el que pretenden hacer que la versión 3 de Ruby sea 3 veces mas rápida que Ruby 2.

El termino rápido es muy subjetivo y depende de cómo se hagan las mediciones. Esto es algo que los desarrolladores del lenguaje tienen en cuenta así que no podemos esperar que con Ruby 3, nuestra aplicación web que utiliza Ruby on Rails sea 3 veces mas rápida que la versión que utiliza Ruby 2 pues el desempeño depende también de muchos detalles de implementación que están fuera del control de los desarrolladores del lenguaje.

Respecto al futuro de Ruby 3, los principales objetivos son:

  • Desempeño
  • Modelo de concurrencia
  • Tipos

Desempeño

Por lo pronto el proyecto ha hecho varios avances que ya se pueden ver respecto a desempeño. Como el punto de comparación es Ruby 2.0, ya hemos podido ver varias mejoras entre los releases intermedios como Ruby 2.1, 2.2, 2.3, etc en donde se han hecho mejoras por ejemplo de manejo de memoria que hacen que el intérprete sea más rápido.

Concurrencia

Adicionalmente están trabajando en un nuevo modelo de concurrencia para ofrecer nuevas abstracciones que no solamente van a hacer posible ejecución en paralelo sino que además van a ofrecer una manera más fácil de crear programas concurrentes. Esta nueva abstracción es llamada guild, propuesta por Koichi Sasada en http://rubykaigi.org/2016/presentations/ko1.html. A grandes rasgos, los guilds son como grupos de ejecución de threads. Dentro del mismo guild pueden existir varios threads que comparten variables, pero estos threads en el mismo guild o grupo no se pueden ejecutar en paralelo. Sin embargo, threads en diferentes guilds si pueden ejecutarse en paralelo pero no tienen acceso a las mismas variables, lo cual limita lo que se puede hacer con guilds pero a la vez ofrece garantías para evitar problemas comunes de programas concurrentes como data races. Para compartir información entre diferentes guilds, se pueden usar channels (muy parecido al modelo de concurrencia en Go) y también se puede compartir objetos que sean inmutables. Para conocer mas sobre este modelo de concurrencia te recomiendo leer este blog post (https://mensfeld.pl/2016/11/getting-ready-for-new-concurrency-in-ruby-3-with-guilds/) en donde explican a grandes rasgos como prepararnos para el nuevo modelo de concurrencia en Ruby 3.

Tipos

Finalmente, en lo que respecta a tipos en Ruby 3, aunque es uno de los grandes objetivos pues se sabe que la comunidad está pidiendo soporte para esto, el trabajo en este campo no está tan avanzado como en los otros 2 puntos.

Release de Ruby 3

En una conversación con 3 líderes de la comunidad incluyendo a Matz (el creador de Ruby), se habló de Ruby 3x3 y de los diferentes avances, sin embargo dijeron que hay todavía mucho trabajo por hacer y qué podemos esperar por Ruby 3 hasta el 2020.

Puedes encontrar la conversación en https://blog.heroku.com/ruby-3-by-3 y un post en redit en donde se hace un resumen del avance de Ruby 3x3 en https://www.reddit.com/r/ruby/comments/7hhgrt/where_is_the_work_on_ruby_3/