Descubriendo Crystal

Compartir esta publicación

Share on facebook
Share on linkedin
Share on twitter
Share on email

Uno más de la serie. Consulta otros lenguajes que hemos explorado en el pasado en:

Un poco de información sobre mí antes de comenzar nuestra exploración de un nuevo lenguaje de programación. Llevo un par de años enamorado de los lenguajes de programación. Me interesa mucho su semántica, el razonamiento de por qué sus diseñadores eligieron hacer X en lugar de Y, y por qué descartaron directamente Z. He hecho mi parte correspondiente de DSLs en mi tenure como desarrollador de software tanto por diversión como por beneficio; así que los lenguajes de programación son el «paso adelante» razonable para estar interesado.
Por ello, siempre estoy atento a los lenguajes más prometedores.

Por ello, siempre estoy atento a los lenguajes más prometedores.

¿Por qué Crystal?

Hace mucho tiempo, muy lejos de aquí, estuve trabajando con Ruby on Rails en un proyecto con otros desarrolladores muy expertos en Ruby y Rails. Como muchos otros que trabajan con Ruby, nos gustaba su sintaxis, su facilidad de uso, sus dependencias (gems), pero teníamos algunos problemas con él. Todos los lenguajes de programación los tienen.


Conversion Post EN

Sinceramente, el rendimiento no era mi principal motivación para buscar otros lenguajes de programación, aunque en muchos benchmarks Crystal sobresale.

Me preocupaba más la seguridad y la documentación. Me explico.

Seguridad

Mientras programaba en Ruby, muchas veces encontraba un error en el que un objeto que pensaba que era un Hash era en realidad un bloque, o una string era en realidad un número. Muchas veces un test fallaba o entraba en pánico, y tardaba un minuto en mirar la traza, tal vez poner un breakpoint. Intentaba abrir la ejecución. Me di cuenta de que había una rama del código que no establecía una clave en un parámetro options que pasaba y no tenía en cuenta. Debía arreglarlo y continuar con la codificación. El método undefined method 'foo' for nil:NilClass era particularmente recurrente en mi ciclo de desarrollo.

Documentación

Aquí no me refiero a la documentación real que puedo encontrar en Ruby Doc sino a la cantidad de información con la que puede ayudarme el IDE. Soy un gran defensor de la creación de herramientas que ayuden al desarrollo, pero tener que hidratar un hash de options para enviarlo al método de una gema y tener que ceder a mirar el código de la gema para entender qué valores están disponibles, es una gran razón por la que disfruto tanto de los lenguajes de programación tipados.

java
class FooConfiguration {
    String bar;
    Integer biz = 3
}

void foo(FooConfiguration options) { … }

A simple vista (y con el apoyo del IDE), se puede deducir que las opciones foo tienen una string requerida bar, y una biz que por defecto es 3. Mientras que un código similar en Ruby podría verse así:

ruby
def foo(options):
  # …
  enc = options.bar.encoding #Oh, so `bar` is a string. Gotcha!
  # ... 
  (options.biz || 3).times { puts enc } # if `biz` is falsey, then `3`. Can I send a boolean? Oh, no, it `#.times` it, so it is a number. 🤕 
  # ...
end

Estos dos “puntos de dolor” se abordaron, curiosamente, con el mismo enfoque: Types.

En Crystal hay un compilador muy inteligente y competente que se ocupa de saber qué métodos puede tener cualquier referencia, si es nil o qué puede y no puede hacerse a un objeto. Esto fue un regalo del cielo.

La suerte quiso que también estuviera en contacto con algún defensor de Crystal. Puedes imaginarte, con el eslogan “Fast as C, Slick as Ruby”, me enganché.

Mi proyecto de ruptura, el momento en que realmente «entendí» Crystal fue cuando necesitábamos una solución similar a un cuadro de mando. Nos dimos cuenta de que habíamos construido demasiadas herramientas internas y no teníamos un lugar para agruparlas todas. Por alguna razón, no queríamos una página web estática. Decidimos crear la nuestra propia. Un poco de análisis de YAML, algunas macros y un montón de seguridad de más tarde, y lo tuvimos en marcha. Añadir aplicaciones fue sencillo y una compilación CI se aseguró de que todas las cosas estuvieran correctamente conectadas. Era un proyecto pequeño, probablemente sobredimensionado; pero la incorporación de otro desarrollador de Ruby fue increíblemente sencilla. Ese fue un buen punto de venta.

¿Por qué Crystal ahora?

Eso es liderar el tema, su señoría!

Recently™ the nice people of Crystal announced the release of Crystal 1.0 Production ready, stable and useful standard library all in a tight little bundle; so if it was ever the time to seriously look at Crystal; I would say today is the day. Recientemente™ la amable gente de Crystal anunció el lanzamiento de Crystal 1.0. Librería estándar lista para producción, estable y útil, todo en un pequeño y apretado paquete; así que si alguna vez fue el momento de mirar seriamente a Crystal; yo diría que hoy es el día.

Otras características increíbles

Ergonomía de tipos

Hemos hablado de la seguridad de tipos, y algunos habrán puesto los ojos en blanco esperando una forma muy verbosa de escribir el código; pero no olvidemos que uno de los motores clave de Crystal es tener una sintaxis similar a la de Ruby. Un lenguaje dinámicamente tipado. Así que ambos:

ruby
class Foo                                                                  	 
  def biz
    puts "foo"
  end
end

class Bar
  def biz
    puts "bar"
  end
end

def invoke_biz(x)
  x.biz
end

invoke_biz(Foo.new) # => foo
invoke_biz(Bar.new) # => bar

does a good job covering the basics: Type inference. Es válido tanto para Ruby como para Crystal. Puedes probarlo en tu navegador en el patio de recreo de Crystal aquí!. No se ve ningún tipo, gracias a la increíble inferencia de tipos que viene con el compilador de Crystal. Hay muchas cosas geniales sobre esto que necesitaría nuevas entradas enteras en el blog para escribir, por suerte el libro de Crystal hace un buen trabajo cubriendo lo básico: Type inference.

YAML / JSON / XML

Es increíble lo útil que es tener una biblioteca de análisis tan robusta ya en la biblioteca estándar, sin necesidad de lidiar con dependencias extrañas para leer un archivo de configuración, o escribir uno.

crystal
require "yaml"

class Bar
  include YAML::Serializable
  property biz : Float64
end

class Foo
  include YAML::Serializable
  property foo : String
  property bar : Bar?
end

Este es todo el código necesario para analizar algo como

yaml
foo: hi!
bar:
  biz: 3.2

Lo mismo ocurre con JSON y XML.
Me parece desconcertante cómo, cuando la lectura y la escritura de la configuración es tan fácil, permite más personalización cuando desarrollamos herramientas con Crystal.

Fragmentos descentralizados

Tal vez como me estoy haciendo mayor, me estoy volviendo más paranoico sobre dónde se obtienen mis dependencias (que ejecutan, a todos los efectos, código arbitrario que se despliega en mi nombre); pero no puedo/quiero esperar a que una cábala apruebe una nueva dependencia. Poder elegir un archivo local o cualquier proveedor git me da un poco más de tranquilidad.

El logo… está vivo, se mueve, está vivo, ¡está vivo!

El logotipo negro de la página de inicio de Crystal es interactivo. Se puede hacer clic y girar.
A primera vista, uno puede pasar por alto este hecho, pensando que es superfluo e inútil; pero yo le instaría a divagar: Podría un mal lenguaje ^¹ aportar una página de inicio, tan pulida, unos tutoriales tan claros, una comunidad tan activa? 🤔
1: interpretación del lector de lo que podría ser un mal lenguaje.

¿Ahora dónde?

Si te interesa, puedes seguir aprendiendo Cristal con el libro y el patio de recreo online . Echa un vistazo a la lista de cosas recopiladas por awesome-crystal, algunas podrían inspirarte en tu actual o próximo proyecto. Dirígete a Crystal.

Y con esta nota final, me despido y nos vemos en el próximo blogspot.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Suscríbete a nuestro boletín de noticias

Recibe actualizaciones de los últimos descubrimientos tecnológicos

Acerca de Apiumhub

Apiumhub reúne a una comunidad de desarrolladores y arquitectos de software para ayudarte a transformar tu idea en un producto potente y escalable. Nuestro Tech Hub se especializa en Arquitectura de Software, Desarrollo Web & Desarrollo de Aplicaciones Móviles. Aquí compartimos con usted consejos de la industria & mejores prácticas, basadas en nuestra experiencia.

Posts populares
Descarga Grow Professionally: Inside Apiumhub's Dev Team

¿Estás orientado a Datos?

Construyamos tu éxito juntos.

Contáctanos

¿Tienes un proyecto desafiante?

Podemos trabajar juntos