Crystal (lenguaje de programación)
Crystal | ||
---|---|---|
Desarrollador(es) | ||
Manas Technology Solutions https://crystal-lang.org/ | ||
Información general | ||
Extensiones comunes | cr | |
Paradigma | Multi-paradigma: orientado a objetos, concurrente | |
Apareció en | 2014 | |
Diseñado por | Ary Borenszweig, Juan Wajnerman, Brian Cardiff | |
Influido por | Ruby, C, Rust, Go, C#, Python | |
Licencia | Apache License 2.0 | |
Crystal es un lenguaje de programación de propósito general y orientado a objetos, diseñado y desarrollado por Ary Borenszweig, Juan Wajnerman, Brian Cardiff y más de 300 colaboradores.[1] Con una sintaxis inspirada en el lenguaje Ruby,[2] es un lenguaje compilado con verificación estática de tipos, pero especificar los tipos de variables o los argumentos de los métodos es generalmente innecesario. Los tipos se resuelven mediante un avanzado algoritmo de inferencia de tipos globales.[3] Crystal está actualmente en desarrollo activo. Se publica como software libre y de código abierto bajo la licencia Apache versión 2.0.
Historia
[editar]El trabajo en el lenguaje comenzó en junio de 2011,[4] con el propósito de crear un lenguaje con la elegancia y productividad de Ruby y la velocidad, eficiencia y seguridad tipográfica de un lenguaje compilado.[5][4] Inicialmente llamado Joy, fue rápidamente rebautizado como Crystal.[4]
El compilador de Crystal fue escrito por primera vez en Ruby, pero luego fue reescrito en Crystal, convirtiéndose así en self-hosting, a partir de noviembre de 2013.[6] La primera versión oficial se publicó en junio de 2014.[7] En julio de 2016, Crystal se unió al índice TIOBE.
Descripción
[editar]Aunque se parece al lenguaje Ruby en su sintaxis, Crystal compila a un código nativo mucho más eficiente usando un backend LLVM, a costa de excluir los aspectos dinámicos de Ruby. Sin embargo, la avanzada inferencia de tipo global usada por el compilador Crystal, combinada con el uso de unión de datos, le da a Crystal la sensación de un lenguaje de scripts de alto nivel más que muchos otros lenguajes de programación comparables. El lenguaje ha automatizado la recolección de basura y actualmente ofrece un recolector Boehm. Crystal posee un sistema de macros y soporta genéricos y sobrecarga de métodos y operadores. El modelo de concurrencia de Crystal se inspira en la comunicación de procesos secuenciales (CSP) e implementa fibras ligeras y canales (para la comunicación entre fibras) inspirados en el lenguaje Go.[2]
Ejemplos
[editar]Hola mundo
[editar]Esta es la forma más simple de escribir el programa Hola Mundo en Crystal:
puts "Hola, mundo!"
Lo mismo que en Ruby. O usando un estilo de programación orientado a objetos:
class Greeter
def initialize(@name : String)
end
def salute
puts "Hola #{@name}!"
end
end
g = Greeter.new("mundo")
g.salute
Servidor HTTP
[editar]require "http/server"
server = HTTP::Server.new do |context|
context.response.content_type = "text/plain"
context.response.print "Hello world! The time is #{Time.now}"
end
server.bind_tcp("0.0.0.0", 8080)
puts "Listening on http://0.0.0.0:8080"
server.listen
Servidor TCP
[editar]require "socket"
def handle_client(client)
message = client.gets
client.puts message
end
server = TCPServer.new("localhost", 1234)
while client = server.accept?
spawn handle_client(client)
end
Tipos de inferencia y unión de datos
[editar]El siguiente código define una matriz que contiene diferentes tipos sin un ancestro común utilizable. Crystal crea automáticamente una unión de datos a partir de los tipos de los elementos individuales.
desired_things = [:unicorns, "butterflies", 1_000_000]
p typeof(desired_things.first) # typeof devuelve el tipo de tiempo de compilación, aquí (Int32 | String | Symbol)
p desired_things.first.class # el método de la clase devuelve el tipo de tiempo de ejecución, aquí Symbol
Concurrencia
[editar]
Se pueden utilizar canales para comunicarse entre las fibras, que se inician con la palabra clave spawn
.
channel = Channel(Int32).new
spawn do
puts "Antes del primero envío"
channel.send(1)
puts "Antes del segundo envío"
channel.send(2)
end
puts "Antes de recibir el primero"
value = channel.receive
puts value # => 1
puts "Antes de recibir el segundo"
value = channel.receive
puts value # => 2
Más información
[editar]- St. Laurent, Simon; Balbaert, Ivo (1 de febrero de 2019), Programming Crystal (P1.0 edición), Pragmatic Bookshelf, ISBN 978-1-68050-286-2.
- Wartala, Ramon (March 2016), «Die Ruby-artige Programmiersprache Crystal» [The Ruby-like programming language Crystal], Linux Magazin (en alemán) (03/2016), ISSN 1432-640X.
- ↑ «crystal-lang/crystal». GitHub (en inglés). Consultado el 25 de junio de 2020.
- ↑ a b asterite (14 de junio de 2016). «Crystal 0.18.0 released!». The Crystal Programming Language (en inglés). Consultado el 25 de junio de 2020.
- ↑ bcardiff (23 de septiembre de 2013). «Type inference (part 1)». The Crystal Programming Language (en inglés). Consultado el 25 de junio de 2020.
- ↑ a b c David, María Inti (1 de abril de 2016). «The story behind #CrystalLang | Manas.Tech». Manas Technology Solutions (en inglés). Consultado el 25 de junio de 2020.
- ↑ «Why Crystal programming language? | Motion Express | Ruby, Rails, Golang & DevOps». adlerhsieh.com. Consultado el 25 de junio de 2020.
- ↑ asterite (14 de noviembre de 2013). «Good bye Ruby Thursday». The Crystal Programming Language (en inglés). Consultado el 25 de junio de 2020.
- ↑ asterite (19 de junio de 2014). «Crystal 0.1.0 released!». The Crystal Programming Language (en inglés). Consultado el 25 de junio de 2020.