Crystal es un lenguaje de programación orientado a objetos de propósito general de alto nivel , diseñado y desarrollado por Ary Borenszweig, Juan Wajnerman, Brian Cardiff y más de 400 colaboradores. [5] Con una sintaxis inspirada en el lenguaje Ruby , [4] es un lenguaje compilado con verificación de tipos estática , pero generalmente no es necesario especificar los tipos de variables o argumentos de métodos. Los tipos se resuelven mediante un algoritmo avanzado de inferencia de tipos global. [6] [7] Crystal se encuentra actualmente en desarrollo activo. Se publica como software libre y de código abierto bajo la Licencia Apache versión 2.0.
El trabajo en el lenguaje comenzó en junio de 2011, [8] con el objetivo de fusionar la elegancia y productividad de Ruby con la velocidad, eficiencia y seguridad de tipos de un lenguaje compilado. [9] [8] Inicialmente llamado Joy , rápidamente fue renombrado a Crystal . [8]
El compilador Crystal fue escrito primero en Ruby, pero luego reescrito en Crystal, volviéndose así autohospedado , a partir de noviembre de 2013. [actualizar][ 10] La primera versión oficial fue lanzada en junio de 2014. [11] En julio de 2016, Crystal se unió al índice TIOBE .
Aunque se parece al lenguaje Ruby en sintaxis, Crystal compila a un código nativo mucho más eficiente utilizando un backend LLVM , a costa de excluir los aspectos dinámicos de Ruby. La inferencia de tipo global avanzada utilizada por el compilador Crystal, combinada con tipos de unión , le da más la sensación de un lenguaje de script de nivel superior que muchos otros lenguajes de programación comparables. Tiene recolección de basura automatizada y ofrece un recolector Boehm . Crystal posee un sistema de macros y admite genéricos, así como sobrecarga de métodos y operadores. Su modelo de concurrencia está inspirado en los procesos secuenciales de comunicación (CSP) e implementa fibras y canales livianos (para comunicación entre fibras) inspirados en Go . [4]
Esta es la forma más sencilla de escribir el programa Hola Mundo en Crystal:
pone "¡Hola mundo!"
Lo mismo que en Ruby.
O utilizando un estilo de programación orientado a objetos :
clase Greeter def inicializar ( @name : String ) fin def salute pone "Hola #{ @name } !" fin fin g = Greeter . new ( "mundo" ) g . salute
requiere "http/servidor" servidor = HTTP :: Servidor.new do | contexto | contexto.respuesta.contenido_tipo = " texto/ sin formato " contexto.respuesta.print " ¡ Hola mundo ! La hora es # { Time.local } " fin server.bind_tcp ( " 0.0.0.0 " , 8080 ) pone " Escuchando en http://0.0.0.0:8080 " server.list
requiere "socket" def handle_client ( cliente ) mensaje = cliente . gets cliente . puts mensaje fin servidor = TCPServer . new ( "localhost" , 1234 ) mientras cliente = servidor . accept? spawn handle_client ( cliente ) fin
El código siguiente define una matriz que contiene distintos tipos sin un ancestro común utilizable. Crystal crea automáticamente un tipo de unión a partir de los tipos de los elementos individuales.
cosas_deseadas = [ :unicornios , "mariposas" , 1_000_000 ] p typeof ( cosas_deseadas . first ) # typeof devuelve el tipo de tiempo de compilación, aquí (Símbolo | Cadena | Int32) p cosas_deseadas . first . class # el método de clase devuelve el tipo de tiempo de ejecución, aquí Símbolo
Los canales se pueden utilizar para comunicarse entre fibras, que se inician mediante la palabra clave spawn
.
canal = Canal ( Int32 ) . nuevo spawn do puts "Antes del primer envío" canal . send ( 1 ) puts "Antes del segundo envío" canal . send ( 2 ) fin pone "Antes de la primera recepción" valor = canal . recibir pone valor # => 1 pone "Antes de la segunda recepción" valor = canal .recibir pone valor # => 2
Está fuertemente inspirado en Ruby y otros lenguajes (como C#, Go y Python).