logo_crystal
INICIO CARACTERÍSTICAS CODIFICAÇÃO PROGRAMANDO SERVIDOR HTTP

Introdução





Crystal é uma linguagem de programação para sistemas operacionais Linux, Ubunto e MacOS, que têm uma sintaxe muito parecida com a linguagem de programação Ruby. Ela teve início em 2011 com o intuito de ser uma linguagem veloz, eficiente e um tipo de segurança de uma linguagem compilada. O compilador Crystal foi primeiro escrito em Ruby, por isso de sua aproximação com a linguagem. Tendo sua primeira versão oficial lançada em 2014.


Características





• Ter uma sintaxe semelhante a Ruby (mas a compatibilidade com ela não é um objetivo);
• Ter o tipo verificado estaticamente, mas sem ter que especificar o tipo de variáveis ou argumentos do método;
• Ser capaz de chamar o código C escrevendo ligações para ele no Crystal;
• Possui avaliação em tempo de compilação e geração de código, para evitar código clichê;
• Compila para código nativo eficiente.



Codificação





A seguir, alguns exemplos de codificação da linguagem Crystal:

Nomeação:

  module Money
    CURRENCIES = {
      "EUR" => 1.0,
      "ARS" => 10.55,
      "USD" => 1.12,
      "JPY" => 134.15,
    }

    class Amount
      getter :currency, :value

      def initialize(@currency, @value)
      end
    end

    class CurrencyConversion
      def initialize(@amount, @target_currency)
      end

      def amount
        # implement conversion ...
      end
    end
  end


Neste exemplo, vale comentar alguns pontos de nomeação em Crystal:
• Os nomes dos métodos são sublinhados;
• Os nomes das variáveis são sublinhados;
• Nos nomes das classes, as siglas são todas maiúsculas;
• Em nomes de métodos, os acrônimos são todos em minúsculas;
• Dentro de uma classe, separe as definições de método, constantes e definições de classe interna com uma nova linha.

• Criando uma nova Classe no Crystal




Para criar uma nova classe em Crystal, são necessários alguns novos conceitos 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 exemplo para ficar mais claro:


  class Say
      def initialize(@name : String)
          @name = name
      end 
      {% for method in %w(tarde noite) %}
      def boa_{{method.id}}
          "#{greeting} {{ method.id }}"
      end
      {% end %}
  
      private def greeting
          "Ola #{@name}, boa"
      end
  end
 
  puts Say.new("Estudante").boa_tarde
  puts Say.new("Estudante").boa_noite


Resultado:
Ola Estudante, boa tarde
Ola Estudante, boa noite


Algo que vale comentar 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 boa_tarde, boa_noite, foram criados dinamicamente com o recurso de macros;
4. Métodos privados devem ter a palavra private em frente ao def.

Programando





É comum quem quer aprender a programar em uma linguagem nova, querer construir o “Hello Word” como seu primeiro programa, a seguir mostraremos como fazer isso na linguagem de programação Crystal:

1. Programas Crystal terminam com .cr
Entre em seu editor preferido e digite a linha a seguir:

  puts “Hello Word!”
Depois salve o programa como hello_world.cr

2. Vá para o terminal e digite:

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


• Gerando um Executável



Se você já leu sobre como fazer o primeiro programa em nosso site, agora veremos como criar um executável do nosso “Hello World”. Para isso geramos um código nativo, que vai tornar nosso programa bem mais rápido ao ser executado.
Usando o comando Crystal build da seguinte maneira temos:


  $Crystal build hello_word.cr
  $./hello_world ## execute o programa dessa forma
  Hello World ## resultado na tela!
Com isso fica muito mais rápido.
Em um comparativo com o nosso primeiro programa do Hello World, temos uma grande diferença de tempo quando usamos um executável, ficando da seguinte forma:

  $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 usando código nativo está mais de 100x mais rápido!


Servidor HTTP





Um exemplo ligeiramente mais interessante é o de um servidor HTTP:

  require "http/server"

  server = HTTP::Server.new(8080) do |context|
    context.response.content_type = "text/plain"
    context.response.print "Hello world! The time is #{Time.now}"
  end

  puts "Listening on http://0.0.0.0:8080"
  server.listen

Algumas funções uteis:

• Incluir código definido em outros arquivos:

  require "http/server"

• Definir variáveis locais sem a necessidade de especificar o seu tipo:

  server = HTTP::Server.new ...

• É possível invocar métodos ou enviar mensagens em objetos:

  HTTP::Server.new(8000) ...
    ...
    Time.now
    ...
    puts "Listening on http://0.0.0.0:8080"
    ...
    server.listen

• É possível usar blocos de código, ou simplesmente blocos, que são um modo muito conveniente de reaproveitar código e usar algumas características do mundo funcional:

  HTTP::Server.new(8080) do |context|
      ...
    end

• É possível criar strings facilmente com conteúdo embutido, também chamado de interpolação de strings. A linguagem também vem com outras sintaxes para criar arrays, hashes, rangesb, tuplas e mais:

  "Hello world! The time is #{Time.now}"

Framework Kemal



Assim como outras linguagens de programação, a Crystal possui seu framework para desenvolvimento web chamado Kemal. Para gerenciar bibliotecas externas, ou as chamadas dependências usamos o Shards.
Instalando o framework Kemal ao projeto:


  $shards install

Após instalarmos o framework Kemal, vamos construir um método get para responder a uma requisição pelo browser. Agora, usando os recursos do Kemal:

  require "kemal"
 
  get "/" do
    "Hello World!"
  end
 
  Kemal.run

Feito isso, podemos finalmente colocar a página no ar, digitando no terminal:


  $crystal run src/hello_web.cr
  [development]   Kemal is ready to lead at http://0.0.0.0:3000
Agora o seu programa recebe um endereço que quando acessá-lo irá printar na tela: Hello World!


Referências



• http://br.crystal-lang.org/docs/guides/concurrency.html

• https://onebitcode.com/introducao-ao-crystal/


Site Oficial



Visite o site oficial da linguagem Crystal através do link:

Crystal-lang.org


Desenvolvido por:

Alysson André de Quadros - DEINFO | UEPG


Eduardo Patrick Ferreira - DEINFO | UEPG


© 2020 Crystal, all rights reserved