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)

Fibonacci em python

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

Fibonacci em ruby

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.

Fibonacci em crystal

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