Cozinhando Crystal
Para quem não viu, a imagem é uma referência a um dos episódios da série onde o personagem principal, Walter White, está cozinhando metanfetamina. A imagem é uma brincadeira com o nome da linguagem de programação Crystal.
“A language for humans and computers”
Essa a frase que me chamou atenção quando ouvi falar pela primeira vez sobre Crystal. É como a linguagem se apresenta em seu site oficial.
Crystal lang
Crystal é uma linguagem de programação que tem como objetivo ser amigável. Sua sintaxe é fortemente inspirada em Ruby e a sua eficiência pode ser comparada a linguagens poderosas como GO lang. Nesta talk talk, sobre Ruby, o @akita fala sobre o básico sobre a linguagem e chega a brincar dizendo que o “Crystal é o filho bastardo de Ruby com GO”, o que faz todo sentido e eu já te mostro porque. 😆
Eu ouvi falar a primeira de Crystal há uns dois anos atrás, mas, na minha cega ignorância o primeiro pensamento que tive foi:
“ah… uma linguagem que quer imitar o Ruby, meu tempo é corrido, e não tem ninguém usando isso. Se for pra fazer em Crystal, eu faço em Ruby e não vou ter que perder mais tempo tendo que aprender nenhum novo conceito.”
Tome cuidado se também estiver um pensamento parecido, o comodismo é uma arma letal para sua carreira. Aprender coisas novas é um excelente estímulo para sua mente. Afinal…
“Uma mente que se abre a uma nova ideia jamais voltará ao seu tamanho original.” - Albert Einstein
Crystal, por sua vez, é uma linguagem compilada, estaticamente tipada e orientada a objetos. Ela tem o objetivo de ser extremamente performática e amigável.
Porque Crystal?
No README da lang os próprios autores já te dão bons motivos. Eu tomei a liberdade de traduzir literalmente o que está descrito no repositório oficial.
- Adoramos a eficiência do Ruby para escrever código.
- Adoramos a eficiência do C na execução de código.
- Queremos o melhor dos dois mundos.
- Queremos que o compilador entenda o que queremos dizer sem precisar especificar tipos em todos os lugares.
- Queremos POO completo.
- Ah, e não queremos escrever código C para acelerar o código.
Estes parecem ser bons motivos para mim. Então, vamos ver o que temos por aí.
Let’s to Code
Para este post, vou focar um pouco na syntaxe e princípios da linguagem e em um próximo podemos construir algo mais palpável.
A standard library do Crystal é extremamente completa e já provê praticamente tudo o que você precisa para sair codando. Vamos usar um exemplo da documentação oficial para criar um servidor web e fazer bind dele na porta 8080
.
Link para instalação do crystal
# server.cr
# A very basic HTTP server
require "http/server"
server = HTTP::Server.new do |context|
context.response.content_type = "text/plain"
context.response.print "Hello world, got #{context.request.path}!"
end
puts "Listening on http://127.0.0.1:8080"
server.listen(8080)
A primeira vez que vi esse exemplo eu fiquei procurando o código crystal. Pois é, não tem como negar a semelhança com Ruby. Assumindo que você tem o crystal instalado na sua máquina, você pode rodar o comando crystal build
para gerar o binário do seu código e executá-lo em seguida com: ./server
. Ou pode simplesmente rodar o código com o comando crystal
passando o seu arquivo em seguida.
Agora, perceba que ao rodar o comando build ele gera pra você um binário com como o mesmo nome do seu arquivo .cr
Bacana né? 😎
Performance
Como mencionado anteriormente a linguagem Crystal foi desenvolvida com o intuito de ser extremamente performática. Na talk que citei anteriormente, é possível notar pontos interessantes da linguagem. Tomei a liberdade de replicar alguns do exemplos para ver como a linguagem se sairia com uma implementação do algoritmo de Fibonacci. O mesmo teste será feito usando as linguagens Python, Ruby para termos uma margem de comparação.
Python VS Ruby VS Crystal
Todos os testes serão feitos sob o mesmo ambiente um após o outro para que possamos ter uma comparação justa.
⚠️ Para todos os testes estou usando um MacBook Pro, 2,8 GHz Dual-Core Intel, Core i7, com 8GB de RAM 1600 MHz DDR3, sistema operacional na versão Catalina.
Em Python 3
def fib(n):
if n < 0:
print("Incorrect Number")
elif n == 1:
return 0
elif n == 2:
return 1
else:
return fib(n - 1) + fib(n - 2)
sum = 0
for i in range(1,35):
sum += fib(i)
print(sum)
Aqui na o tempo de execução foi de: 6.22s
Em Ruby
def fib(n)
puts "Incorrect Number" if n < 0
return 0 if n == 1
return 1 if n == 2
fib(n - 1) + fib(n - 2)
end
sum = 0
(1..35).each do |i|
sum += fib(i)
end
puts sum
Nas mesmas condições, para minha surpresa, o Ruby
superou o Python
executando em apenas: 2.23s
.
Em crystal ⚡️
Para o exemplo em Crystal o código permanecerá o mesmo do exemplo em Ruby. Isso mesmo! Nada muda nada no código, apenas a extensão do arquivo.
INCRÍVEIS 0.17s
😱
É muito rápido! ⚡️
Conclusão
Crystal é uma linguagem que merece ser atenção. Ela é extremamente performática e tem uma sintaxe muito amigável e não se engane, também é possível desenvolver aplicações web usando Crystal. Em um próximo post, vou mostrar como criar um projeto do zero e como podemos usar o Kemal
um framework web para Crystal.
Se quiser saber mais sobre a linguagem ou trocar uma ideia, temos uma comunidade no Telegram e qualquer pessoa é bem vinda.
Referências
- https://crystal-lang.org/api/0.33.0
- https://crystal-lang.org