Crystal (linguagem de programação) - Crystal (programming language)
Paradigma | Multi-paradigma : orientado a objetos , concorrente |
---|---|
Projetado por | Ary Borenszweig, Juan Wajnerman, Brian Cardiff |
Desenvolvedor | Manas Technology Solutions |
Apareceu pela primeira vez | 18 de junho de 2014 |
Versão estável | |
Disciplina de digitação | estático , inferido , nominal , pato |
Linguagem de implementação | Cristal |
Plataforma | IA-32 (i386), x86-64 , AArch64 |
SO | Linux , macOS , FreeBSD , OpenBSD |
Licença | Licença Apache 2.0 |
Extensões de nome de arquivo | .cr |
Local na rede Internet | crystal-lang |
Influenciado por | |
Ruby , C , Rust , Go , C # , Python |
Cristal é um general-purpose , programação orientada a objeto linguagem, projetado e desenvolvido por Ary Borenszweig, Juan Wajnerman, Brian Cardiff e mais de 300 colaboradores. Com sintaxe inspirada na linguagem Ruby , é uma linguagem compilada com verificação de tipo estática , mas especificar os tipos de variáveis ou argumentos de método geralmente é desnecessário. Os tipos são resolvidos por um algoritmo de inferência de tipo global avançado . Crystal está atualmente em desenvolvimento ativo. É lançado como software livre e de código aberto sob a licença Apache versão 2.0.
História
O trabalho na linguagem começou em junho de 2011, com o objetivo de combinar a elegância e produtividade do Ruby com a velocidade, eficiência e segurança de tipo de uma linguagem compilada. Inicialmente chamado de Joy , foi rapidamente renomeado para Crystal .
O compilador Crystal foi primeiro escrito em Ruby, mas depois reescrito em Crystal, tornando - se self-hosting , em novembro de 2013. A primeira versão oficial foi lançada em junho de 2014. Em julho de 2016, Crystal juntou-se ao índice TIOBE .
Descrição
Embora se assemelhe à linguagem Ruby na sintaxe, o Crystal compila para um código nativo muito mais eficiente usando um back-end LLVM , ao custo de impedir os aspectos dinâmicos do Ruby. No entanto, a inferência de tipo global avançada usada pelo compilador Crystal, combinada com o uso de tipos de união , dá ao Crystal a sensação de uma linguagem de script de nível superior mais do que muitas outras linguagens de programação comparáveis. A linguagem automatizou a coleta de lixo e atualmente oferece um coletor Boehm . O Crystal possui um sistema macro e suporta genéricos, bem como sobrecarga de método e operador. O modelo de simultaneidade do Crystal é inspirado em processos sequenciais de comunicação (CSP) e implementa fibras e canais leves (para comunicação entre fibras) inspirados em Go .
Exemplos
Olá Mundo
Esta é a maneira mais simples de escrever o programa Hello World no Crystal:
puts "Hello World!"
O mesmo que em Ruby.
Ou usando um estilo de programação orientado a objetos :
class Greeter
def initialize(@name : String)
end
def salute
puts "Hello #{@name}!"
end
end
g = Greeter.new("world")
g.salute
Servidor HTTP
require "http/server"
server = HTTP::Server.new do |context|
context.response.content_type = "text/plain"
context.response.print "Hello world! The time is #{Time.local}"
end
server.bind_tcp("0.0.0.0", 8080)
puts "Listening on http://0.0.0.0:8080"
server.listen
Servidor de eco TCP
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 inferência e união
O código a seguir define uma matriz contendo diferentes tipos sem ancestral comum utilizável. O Crystal cria automaticamente um tipo de união a partir dos tipos de itens individuais.
desired_things = [:unicorns, "butterflies", 1_000_000]
p typeof(desired_things.first) # typeof returns the compile time type, here (Symbol | String | Int32)
p desired_things.first.class # the class method returns the runtime type, here Symbol
Simultaneidade
Os canais podem ser usados para comunicação entre as fibras, que são iniciadas com a palavra-chave spawn
.
channel = Channel(Int32).new
spawn do
puts "Before first send"
channel.send(1)
puts "Before second send"
channel.send(2)
end
puts "Before first receive"
value = channel.receive
puts value # => 1
puts "Before second receive"
value = channel.receive
puts value # => 2
Leitura adicional
- St. Laurent, Simon; Balbaert, Ivo (1 de fevereiro de 2019), Programming Crystal (P1.0 ed.), Pragmatic Bookshelf , ISBN 978-1-68050-286-2
- Wartala, Ramon (março de 2016), "Die Ruby-artige Programmiersprache Crystal" [The Ruby-like programming language Crystal], Linux Magazin (em alemão) (3/2016), ISSN 1432-640X