
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 (https://onebitcode.com/women-seeking-men-in-nigeria/)
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 nigerian dating app, 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 bbw friendly dating sites.
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ curl -sL "https://keybase.io/crystal/pgp_keys.asc" | sudo apt-key add $ echo "deb https://dist.crystal-lang.org/apt crystal main" | sudo tee /etc/apt/sources.list.d/crystal.list $ sudo apt-get update $ sudo apt-get install crystal sudo apt install libssl-dev # for using OpenSSL sudo apt install libxml2-dev # for using XML sudo apt install libyaml-dev # for using YAML sudo apt install libgmp-dev # for using Big numbers sudo apt install libreadline-dev # for using Readline |
III – Instalação no MacOS
Para instalar no MacOs basta seguir as instruções deste 50 plus dating events.
No MacOS eu instalei usando a versão macOS High Sierra, 10.13.6. Os comandos que usei para instalação foram esses:
1 2 3 |
$ brew update $ brew install crystal |
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.
1 2 3 |
$ crystal --version Crystal 0.26.0 (2018-08-17) |
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, usa free dating site without payment, 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:
1 |
puts “Hello World!” |
2. Vá para o terminal e digite:
1 |
$ crystal hello_world.cr |
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:
1 2 3 4 5 |
$ crystal build hello_world.cr $ ./hello_world ## execute o programa dessa forma Hello World! ## resultado na tela! |
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:
1 2 3 4 5 6 7 |
$ time crystal hello_world.cr Hello World! crystal hello_world.cr 1.12s user 1.03s system 82% cpu 2.594 total $ time ./hello_world Hello World! ./hello_world 0.01s user 0.01s system 68% cpu 0.022 total |
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.
1 |
$ crystal build hello_world.cr --release --no-debug |
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.
1 2 3 4 5 6 7 8 9 |
class Year def self.leap?(year) year % 400 == 0 || (year % 100 != 0 && year % 4 == 0) end end (1..2020).each do |y| puts "#{y} é ano bissexto" if Year.leap?(y) end |
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:
1 2 3 4 5 6 7 8 |
$ time ruby year.rb 4 é ano bissexto 8 é ano bissexto 12 é ano bissexto .. . 2020 é ano bissexto ruby year.rb 0.11s user 0.05s system 73% cpu 0.221 total |
Agora em Crystal, compilado e gerado o código nativo:
1 2 3 4 5 6 7 |
$ time ./year 4 é ano bissexto 8 é ano bissexto .. . 2020 é ano bissexto ./year 0.01s user 0.01s system 65% cpu 0.032 total |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Say def initialize(@name : String) @name = name end {% for method in %w(morning afternoon evening) %} def good_{{method.id}} "#{greeting} {{ method.id }}" end {% end %} private def greeting "Hi #{@name}, good" end end puts Say.new("OneBitCode").good_morning puts Say.new("OneBitCode").good_afternoon puts Say.new("OneBitCode").good_evening |
Resultado:
Hi OneBitCode, good morning
Hi OneBitCode, good afternoon
Hi OneBitCode, good evening
Alguns itens interessantes nesta classe:
- 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.
- Crystal é “tipada”. Isto significa que podemos definir um tipo para uma variável. No caso, a variável @name é do tipo String.
- Os métodos good_morning, good_afternoon, good_evening, foram criados dinamicamente com o recurso de macros.
- 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.
1 2 |
$ crystal init app hello_web $ cd hello_web |
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:
1 |
$ crystal src/hello_web.cr |
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:
1 |
$ vim shard.yml |
Conteúdo do shard.yml:
1 2 3 4 5 6 7 8 9 10 11 12 |
name: hello_web version: 0.1.0 authors: - John Doe <john.doe@gmail.com> targets: hello_web: main: src/hello_web.cr dependencies: kemal: github: kemalcr/kemal crystal: 0.26.0 license: MIT |
2. Adicionando o framework Kemal ao projeto.
Agora vamos instalar o Kemal:
1 |
$ shards install |
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:
1 |
$ vim src/hello_web.cr |
Conteúdo do src/hello_web.cr:
1 2 3 4 5 6 7 |
require "kemal" get "/" do "Hello World!" end Kemal.run |
2. Feito isto, vamos finalmente colocar nossa página no ar.
Digite no terminal:
1 2 3 |
$ crystal run src/hello_web.cr [development] Kemal is ready to lead at http://0.0.0.0:3000 |
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 😎
Quer se tornar um Programador Full Stack Javascript em 8 semanas? 😀
Nós desenvolvemos um treinamento completo onde você vai aprender desde a base da Web (HTML5, CSS, Bulma,
Javascript e Es6+) até React e ExpressJs totalmente do zero!
Nele você também vai desenvolver um projeto do inicio até o Deploy (clone do Evernote) e irá
aprender como conseguir as melhores vagas no módulo carreira de Programador.
Se você não quer mais perder oportunidades, clique aqui e saiba mais 💪
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
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 também JavaScript.
Além disso, aqui sempre levamos à você conteúdos valiosos sobre a carreira de programação, dicas sobre currículos, portfólios, perfil profissional, soft skills, enfim, tudo o que você precisa saber para continuar evoluindo como Programador(a)!
Fique por dentro de todos os conteúdos o/
Nossas redes sociais:
📹 • https://youtube.com/Onebitcode [Live todas as terças-feiras às 19h)
💻 • https://linkedin.com/company/onebitcode
🙂 • https://facebook.com/onebitcode
📱 • https://instagram.com/one_bit_code
🐦 • https://twitter.com/onebitcode
Nossos cursos:
🥇 • Programador Full Stack Javascript em 8 Semanas
💎 • Curso Completo de Ruby
⚙ • Minicurso: API Rails 5 Completo
🐞 • Minicurso de Testes para Ruby on Rails com RSpec
Espero que curta nossos conteúdos e sempre que precisar de ajuda, fala com a gente!
Estamos aqui para você 🙂
Bem-vindo à família OneBitCode o/