Crystal: a linguagem rápida como C e amigável como Ruby

Introdução sobre a linguagem Crystal.

Amigos developers, neste artigo veremos uma introdução profunda e prática à linguagem Crystal, ela foi criada em 2012 e tem os seguintes objetivos segundo a documentação oficial.

  • Ter uma sintaxe semelhante à de Ruby (mas nosso objetivo não é compatibilidade)
  • Checagem de tipos estática, mas sem ter que especificar o tipo das variáveis ou dos argumentos dos métodos.
  • Poder chamar código em C através de bindings escritos em Crystal.
  • Ter avaliação e geração de código em tempo de compilação, para evitar código de boilerplate.
  • Compilar em código nativo eficiente.

 

O que vamos aprender?

Neste artigo vamos explorar principalmente os itens sobre sintaxe semelhante com Ruby, geração de código em tempo de compilação e geração de código nativo.

Vamos exercitar, através de um Passo a Passo, a compilação de programas Crystal e geração de código nativo para ambiente de desenvolvimento e de produção.

Impossível deixar de lado comparações de velocidade entre as duas linguagens. Crystal e Ruby são bem semelhantes, então vamos fazer um simples comparativo de velocidade de execução entre as duas linguagens.

O assunto sobre Crystal para web ficou bem interessante. Existe o framework web Ruby On Rails para Ruby, e existe também o framework web Kemal para Crystal. Veja sobre isso na sessão “Passo a Passo da criação do APP”, e crie uma aplicação em Crystal e Kemal para web.

Se gostarem 👍 avisem. Faremos uma continuação.
Agora é hora de ler este post e saber mais sobre essa linguagem incrível. 💎

 

O que é Crystal?

Crystal é uma nova linguagem de programação, criada em 2012, que promete gerar programas com boa performance na execução, como são os programas construídos usando-se a linguagem C, e que seja tão amigável para o programador, como é a linguagem Ruby.

De acordo com o site oficial da linguagem e sua documentação, seus criadores deixam claro que desejavam usar uma ferramenta para programação que compilando e gerando código nativo, resultasse em eficiência na execução e ao mesmo tempo, evitasse a complexidade de se usar a linguagem C/C++.

Crystal teve sua arquitetura construída com uma sintaxe bem similar, mas não totalmente compatível com Ruby. A compatibilidade total com Ruby não está nas principais metas da linguagem.

No momento que este artigo está sendo criado, a linguagem está na versão 0.26.0, lançada em  09 de agosto de 2018 (acompanhe as versões aqui)  e pode ser usada em sistemas baseados em Linux e MacOS.

Máquinas com Sistemas Windows ainda não são o foco da linguagem.

 

O que vamos criar?

Através deste artigo, vamos construir vários pequenos programas na linguagem Crystal.

Conforme passamos pelos itens da sessão “Conhecendo Crystal”, vamos aprendendo como programar nesta linguagem.

Na sessão “Passo a Passo da criação do APP”, vamos construir uma pequena aplicação web com Crystal e Kemal.

 

Links Importantes

Documentação (https://crystal-lang.org/docs/)
Documentação em Português (http://br.crystal-lang.org)
Try On Line (https://play.crystal-lang.org/#/r/4psi)
Instalação no Linux (crystal-lang_on_debian_and_ubuntu)
Instalação no MacOS (crystal-lang_on_mac_osx_using_homebrew)

 

Instalação

 

I – Use o Crystal de maneira interativa

Usando o “TRY ONLINE” do Crystal, é possível executar pequenos trechos de código Crystal, sem instalar e compilar.
Entre neste link, que você poderá usar a linguagem de forma interativa em seu navegador.

II – Instalação no Linux Ubuntu e no Linux Deepin

Para instalar no Linux Ubuntu ou Debian basta seguir as instruções deste link.

Eu instalei no Linux Ubuntu 16.04 LTS, e no Linux Deepin 15.6, baseado no Debian, ambos sem problemas.
Para Ubuntu 16.04 LTS e Deepin 15.6, os comandos que usei foram os mesmos e estão a seguir:

 

III – Instalação no MacOS

Para instalar no MacOs basta seguir as instruções deste link.

No MacOS eu instalei usando a versão macOS High Sierra, 10.13.6. Os comandos que usei para instalação foram esses:

 

IV – Verificando a Instalação

Para saber se a instalação foi feita com sucesso em qualquer um desses sistemas operacionais, basta digitar o comando a seguir.

Se o processo de instalação está ok, você verá a versão sendo exibida na tela.

 

Conhecendo a linguagem

 

I – O primeiro programa em Crystal: Hello World!

É comum, quando estamos aprendendo uma nova linguagem, construir o conhecido programa “Hello World”.

Faremos então, nosso primeiro programa em Crystal, que ao ser executado simplesmente exibe a frase “Hello World”.

Se usarmos o modo interativo disponível na internet, https://play.crystal-lang.org, apenas digitando puts “Hello World!” e após um click no botão “Compile & run code”, já é possível ver o resultado.

Mas vamos usar o terminal e criar um programa. Assim começamos a conhecer melhor como a linguagem funciona.

 

1. Programas Crystal terminam com .cr.
Entre em seu editor preferido e digite a linha a seguir.
Depois salve o programa como hello_world.cr:

2. Vá para o terminal e digite:

Se tudo deu certo, você verá a saída “Hello World!” na tela.
Pronto! Você fez o primeiro programa em Crystal 🎉

 

II – Compilando e gerando um executável.

Apesar de termos executado nosso primeiro programa anteriormente, nós não geramos um executável.

O comando crystal é bom para executar programas mas ele é lento, pois tem que compilar todas as vezes em que é acionado.

Se compilamos o programa e geramos um código nativo, o programa é bem mais rápido ao ser executado.
Faremos isso agora.

Compile o programa usando o comando crystal build e em seguida execute:

Assim fica muito mais rápido 🚀. Essa é uma das finalidades da linguagem: “Compilar em código nativo eficiente.

Eu fiz um pequeno comparativo de tempo entre as duas execuções:

O programa sendo executado em código nativo é cerca de 114x mais rápido que o mesmo programa interpretado. Wow! 👏👏👏

 

III – Liberando o executável para o ambiente de produção.

Anteriormente fizemos a compilação do nosso programa e geramos um executável. Embora ele já seja rápido, o que fizemos foi criar um executável apropriado para o ambiente de desenvolvimento.

Usando a opção –release, vamos gerar a seguir, o executável apropriado para ser liberado para o ambiente de produção, que vai levar um pouco mais de tempo para ser gerado.

Também vamos adicionar um parâmetro –no-debug para reduzir o tamanho do executável, mas vai retirar os recursos que permitem debug. Isto só deve ser usado se o tamanho do executável for um problema, ou, no caso de liberação para produção, quando temos certeza que os recursos de debug não serão necessários.

Agora o executável ficou com 161 KB.
O executável anterior estava com 868 KB de tamanho, ou seja, estava 5.4x maior!

 

IV – A inevitável comparação de sintaxe com Ruby

Sabemos até agora que Crystal foi criada inspirada na beleza da sintaxe e facilidade de se escrever programas na linguagem Ruby.

Acredito que em qualquer artigo sobre esta linguagem, sejam naturais as comparações com Ruby.

Então vamos seguir a lógica e comparar a sintaxe de um programa Crystal e Ruby e depois comparar a velocidade entre as duas linguagens!

Vamos analisar o seguinte código fonte. É uma classe que tem como função receber um determinado ano e dizer se é ano bissexto ou não.

 

Ainda sabemos pouco sobre Crystal mas se perguntassem para você, leitor e desenvolvedor Ruby:

“Em qual linguagem está escrita essa classe? Crystal ou Ruby?”

Você pode apostar: em ambas. Isto mesmo, esta classe Year pode ser executada e interpretada em Ruby e Crystal e pode ser compilada sem erros em Crystal! 🙏

Assim, para quem sabe Ruby e pretende programar em Crystal, a curva de aprendizagem tende a ser pequena.

Mas lembre-se da documentação onde diz: “Ter uma sintaxe semelhante à de Ruby (mas nosso objetivo não é compatibilidade)“.

Então não espere compatibilidade de 100% entre as duas linguagens.

 

V – A inevitável comparação de velocidade com Ruby

Depois que comparamos a sintaxe agora vamos comparar a velocidade. Nos items “II e III” aprendemos a gerar código nativo do programa Crystal. Então vamos executar o programa anterior em Ruby e depois gerar um executável e executar o mesmo programa em Crystal.

Crie um programa em Ruby chamado, por exemplo, year.rb.

Em Crystal crie por exemplo, um programa chamado, year.cr.

Não se esqueça de compilar o seu programa year.cr com as opções –release e –-no-debug

Veja a seguir minhas medições. Primeiro em Ruby:

Agora em Crystal, compilado e gerado o código nativo:

Crystal levou 0.032 segundos para terminar. Ruby levou 0.221 para terminar.
Legal! 👏👏👏 Crystal é 6.93x mais rápido.

É claro que podemos escolher formas melhores se fazer essas comparações. Acredito que este teste de comparação é apenas um começo. Podemos melhorar essa técnica.

O que acha de fazer você mesmo seu método de comparação? Depois divulgue. Queremos saber como você fez!

 

VI – Criando uma nova classe no Crystal

Vamos criar agora uma classe, com algumas novidades que a linguagem nos apresenta:

  • Sintaxe simplificada para variáveis de instância
  • Tipos de variáveis
  • Métodos criados como Macros
  • Métodos privados

Em Crystal podemos criar macros que são como se fossem templates para escrever código. Escrevemos partes de código que serão substituídos por outros valores.

É um modo de se escrever DRY code.

Para ficar mais claro vejamos um exemplo:

Resultado:

Hi OneBitCode, good morning
Hi OneBitCode, good afternoon
Hi OneBitCode, good evening

 

Alguns itens interessantes nesta classe:

  1. Nós usamos no construtor da classe, uma sintaxe simplificada. O método “initialize” tem o argumento @name, que é também uma variável de instância.
  2. Crystal é “tipada”. Isto significa que podemos definir um tipo para uma variável. No caso, a variável @name é do tipo String.
  3. Os métodos good_morning, good_afternoon, good_evening, foram criados dinamicamente com o recurso de macros.
  4. Métodos privados devem ter a palavra “private” em frente ao “def”.

 

 

Passo a Passo da criação do APP

Chegou o momento de irmos para a web.

Da mesma maneira que para Ruby temos o Ruby on Rails, para Crystal existe o Kemal, um framework para desenvolvimento web.

Nesta sessão, criaremos um “Hello World!” para acessar pelo browser.

Siga o passo a passo. Vamos criar uma aplicação simples chamada “hello_web”.

 

I – Gerando a aplicação

1. Usando o comando “init app” vamos iniciar gerando um “esqueleto” do nosso projeto, e entrar na nova pasta.

2. Apenas para conferir se tudo está certo, execute o programa principal com o comando do crystal.
Não será retornado nenhum resultado, mas se não retornar erros, estará tudo ok para continuar:

Nenhum erro? Ótimo! 🎉
Vamos incluir uma biblioteca externa a seguir.

 

II – Incluir uma biblioteca externa usando Shards.

Para gerenciar bibliotecas externas, ou as chamadas dependências usamos o Shards. Impossível não comparar com o Gemfile do Ruby On Rails.

Então usando essa analogia, “shards” é como se fosse o “bundler” e “shard.yml” é como se fosse o “Gemfile” do Rails.

 

1. Incluindo o framework Kemal no shard.yml
Abra o arquivo shard.yml, com seu editor preferido (no meu caso é o vim 😊), e faça o arquivo ficar parecido com isto:

Conteúdo do shard.yml:

 

2. Adicionando o framework Kemal ao projeto.
Agora vamos instalar o Kemal:

 

III – Usando o Kemal.

Após instalarmos o framework Kemal, vamos construir um método “get” para responder a uma requisição pelo browser.

 

1. Usando o framework Kemal no projeto.

Neste item vamos usar os recursos do Kemal.
Abra o arquivo src/hello_web.cr com seu editor, e faça o arquivo ficar parecido com isto:

Conteúdo do src/hello_web.cr:

2. Feito isto, vamos finalmente colocar nossa página no ar.
Digite no terminal:

Abra seu navegador e informe o endereço http://localhost:3000

Se tudo deu certo deve aparecer na tela: Hello World!

 

Conclusão

Neste artigo, ficamos sabendo sobre os objetivos da linguagem Crystal.

Exploramos, através de alguns exercícios, a compilação e geração de código nativo. Comparamos a sintaxe e velocidade de execução entre Crystal e Ruby.

Na sessão “Passo a Passo da criação do APP”, criamos uma aplicação em Crystal e Kemal para web.

E tem muito mais para mostrar!!!

Essa linguagem incrível tem outros recursos que não apresentamos aqui. Esperamos que gostem deste artigo para que possamos continuar falando sobre ela.

Até o próximo post 😎



12 formas de vencer o bloqueio criativo e escrever textos memoráveis (e 6 dicas extras)

Não perca nenhum conteúdo

Receba nosso resumo semanal com os novos posts, cursos, talks e vagas \o/



Referências

https://crystal-lang.org/
https://www.sitepoint.com/a-quick-dive-into-the-crystal-programming-language
https://dev.to/jwoertink/my-favorite-things-in-crystal-lang-ce9
https://hackernoon.com/an-introduction-to-the-crystal-programming-language-b9e0222b5b5e
https://www.dailydrip.com/topics/crystal/drips/installation-and-introduction-to-crystal
http://www.crystalforrubyists.com/book/index.html


Você é novo por aqui?

Primeira vez no OneBitCode? Curtiu esse conteúdo? O OneBitCode tem muito mais para você!

O OneBitCode traz conteúdos de qualidade e em português sobre programação com foco em Ruby on Rails e outras tecnologias como Angular, Ionic, React, desenvolvimento de Chatbots e etc.

Se você deseja aprender mais, de uma forma natural e dentro de uma comunidade ativa, visite nosso Facebook e nosso Twitter, veja os screencasts e talks no Youtube, alguns acontecimentos no Instagram, ouça os Podcasts e faça parte de nossa Newsletter.

Além disso, também estamos com alguns e-Books muito interessantes para quem deseja se aprimorar como programador e também como freelancer (os e-Books são gratuitos!):

Espero que curta nossos conteúdos e sempre que precisar de ajuda com os tutoriais, fala com a gente! Seja por Facebook ou e-mail, estamos aqui para você 🙂

Bem-vindo à família OneBitCode \o/

agosto 22, 2018

Deixe um comentário

avatar
  Subscribe  
Notify of
Feito com s2 por OneBitCode
%d blogueiros gostam disto: