7 lenguajes en 7 semanas: Ruby
Photo by Oleg Magni from Pexels
Esta es la primera entrada de una serie en la que analizamos el libro seven languages in seven weeks publicado por Bruce A Tate en el año 2010. Este interesante libro no pretende profundizar en el conocimiento de cada uno de los lenguajes, sino dar un vistazo rápido a los diferentes paradigmas que existen, así como los puntos fuertes y débiles de cada uno de los lenguajes que analiza.
En esta primera entrada vamos a centrarnos en el lenguaje de programación Ruby. Esto no es un tutorial. El objetivo de esta entrada es dar un vistazo a las características generales de este lenguaje, para poder comprender mejor algunas de sus caracterísiticas de diseño. Lee esta entrada sí. Tienes curiosidad por saber cómo son otros lenguajes o si tienes intención de aprende Ruby próximamente.
Introducción
Ruby es un lenguaje de programación interpretado, reflexivo y orientado a objetos, creado por el programador japonés Yukihiro "Matz" Matsumoto, quien lo presentó públicamente en 1995 y que se distribuye bajo una licencia Open Source. A partir del año 2006 se hace muy popular en la industria del desarrollo de software japonesa gracias a la irrupción del framework de desarrollo web Ruby on Rails.
Habitualmente los ingenieros cuando diseñan un lenguaje ponen toda la atención sobre el rendimiento. En contraposición a esto Matz, quiso poner toda la atención en la productividad del programador. A lo largo de esta entrada vamos a ver como este enfoque se plasma en diferentes características del lenguaje.
Mary Popins
El autor asigna un personaje a cada uno de los lenguajes del libro. En este caso Ruby es Mary Popins. La motivación es que los lenguajes anteriores eran rígidos y aburridos como las niñeras de principios de siglo. En ese momento aparece mary popins una niñera fabulosa y divertida.
Principales características
Interpretado
Ruby forma parte de los lenguajes interpretados. Esto implica que el ciclo de desarrollo es más rápido ya que no es necesario compilar cada iteración. El precio a pagar en los lenguajes interpretados es que ofrecen un rendimiento menor.
Paradigma
Ruby en un lenguaje de alto nivel y orientado a objetos. Soporta las características de encapsulamiento, herencia y polimorfismo.
Sintaxis
La sintaxis de Ruby está inspirada en los lenguajes de programación python y perl. A su vez Ruby ha inspirado la sintaxis de otros lenguajes como Elixir y de Coffeescript.
Es una sintaxis que está diseñada para facilitar la productividad al programador
Algunas partes destacables de su sintaxis son:
- No se require finalizar cada sentencia con un punto y coma.
- No se require declarar variables.
- Es sencillo trabajar con cadenas de texto.
- Se utilizan identaciones para delimitar bloques de código.
- No se requieren los parantesis en las llamadas y definiciones de funciones.
Todo es un objeto
Una característica muy apreciada de Ruby es que todo está definido como un objeto. Así podríamos hacer cosas del tipo.
puts 'hola mundo'.upcase
En contraposición a otros lenguajes, la api de ruby está muy bien diseñada, es consistente y con una muy buena orientación a objetos.
Tipado
Tipado dinámico significa que no necesitas declarar una variable antes de usarla. El intérprete inferirá el tipo de dato y lo asignará a la variable. Este tipo de tipado es muy utilizado en lenguajes de scripting.
foo = 1
foo = '1'
Duck typing se refiere a la características de algunos lenguajes en la que no se realiza comprobación de tipos, por ejemplo cuando se envía un objeto como argumento. En el momento de ejecución cuando se realice una llamada sobre ese objeto, el sistema verificará si está definido y si no llamará a un método especial llamado method_missing
.
def method(foo)
puts foo.upcase # si upcase no está definido se invocará method_missing
end
Simbolos
Ruby utiliza un tipo especial de cadenas de texto inmutables. Si diferentes variables definen el mismo símbolo todas ellas apuntan a la misma referencia.
foo = 'bar'
foo = :bar # los símbolos ofrecen mejoras de rendimiento
Bloques
Un bloque es una conjunto de sentencias agrupadas. En otros lenguajes se les conoce como funciones anónimas.
odds = [1,2,3,4,5,6,7,8,9].select { |number| number % 2 != 0 }
Mixins
Ruby no soporta la herencia múltiple de forma directa. En lugar de ello utiliza mixins.
module MODULE_A
def method_1
puts "Module A method 1"
end
def method_2
puts "Module A method 2"
end
end
module MODULE_B
def method_2
puts "Module B method 2"
end
def method_3
puts "Module B method 3"
end
end
class Foo
include MODULE_A
include MODULE_B
end
foo = Foo.new()
foo.method_2 # Module B method 2
Reflexibidad
Una caracteristica que hace muy potente a Ruby es la capacidad para extender o modificar las clases en tiempo de ejecución.
a = 'fooBAR'
class String
def upcase
return self.downcase
end
end
puts a.upcase # foobar
Conclusiones
Fortalezas
API Bien diseñada
Una de las características más destacables de Ruby es la fuerte orientacioón a objetos y su api consistente y bien diseñada.
Azúcar sintáctico
El azúcar sintáctico es un conjunto de características que se añaden a ciertos lenguajes, que sin añadir funcionalidad al mismo, mejoran el lenguaje en el sentido de hacerlo más fácil de escribir o de leer. Ruby tiene un montón de azúcar sintáctico.
Productivo
Por todo lo que hemos visto Ruby es un lenguaje muy flexible y orientado a la productividad del programador. Ruby es un lenguaje ideal para ser usado como lenguaje pegamento entre la increible cantidad de librerías disponibles, tanto para ser usado como lenguaje de scripting, como para el desarrollo web.
Debilidades
Rendimiento
Algunas de las características que hemos visto y que hacen de ruby un lenguaje tan productivo afectan a su rendimiento.
Seguridad
Sus caracterísiticas de tipado, como hemos visto hacen que programar sea muy rápido, pero también hacen que algunos errores no puedan ser detectados antes de pasar al entorno de producción.