DEV Community

Cover image for Elixir - Uma Breve Introdução
João Paulo de C. Lima
João Paulo de C. Lima

Posted on

Elixir - Uma Breve Introdução

Elixir é uma linguagem de programação funcional. Foi lançada em 2011. Idealizado e desenvolvido por José Valim dentro da empresa Plataformatec.

Foto do José Valim

Antes de entrarmos nas funcionalidades da linguagem, vamos abordar alguns conceitos de programação funcional.

Segundo Eric Elliott,

Programação funcional é o processo de construir software através de composição de funções puras, evitando compartilhamento de estados, dados mutáveis e efeitos colaterais.

O paradigma funcional, surgiu para auxiliar na resolução de problemas complexos. Os matemáticos encontraram nas funções a forma de chegar no objetivo final.

Paradigma Funcional na Matemática

Conceitos

  • Composição de Função: Cria-se uma nova função, através da composição de outras
  • Funções Puras: Independente da quantidade de vezes em que é chamada, o resultado será sempre o mesmo.
  • Imutabilidade: A variável ou objeto terá sempre o mesmo valor.
  • Efeito Colateral: Interações com o “mundo externo” (acesso ao banco de dados, chamadas de APIs externas, etc) onde não podemos prever o resultado.

Evolução da programação desenho Simpson

Erlang, OTP e Tolerância a falhas

Erlang é uma linguagem de programação usada para construir sistemas real-time, massivamente escaláveis ​e ​com requisitos de alta disponibilidade.
Alguns de seus usos são em telecomunicações, bancos, comércio eletrônico, telefonia por computador e mensagens instantâneas (WhatsApp e Facebook Messenger).
O runtime do Erlang tem suporte embutido para simultaneidade, distribuição e tolerância a falhas.
Veja alguns casos interessantes do WhatsApp:
WhatsApp Blog - 02 milhões de conexões TCP
WhatsApp tem 50 engenheiros para 900 milhões de usuários

OTP:

OTP é um conjunto de bibliotecas Erlang e princípios de design que fornecem middleware para desenvolver esses sistemas. Inclui seu próprio banco de dados distribuído, aplicativos para interface com outras linguagens, ferramentas de depuração e manipulação de lançamentos.

BEAM:

BEAM é a máquina virtual no núcleo da plataforma Erlang Open Telecom. O BEAM faz parte do Erlang Run-Time System, que compila o código-fonte Erlang em bytecode, que é então executado no BEAM. Os arquivos de bytecode BEAM têm a extensão de arquivo .beam

Erlang BEAM

Scheduler:

A instância BEAM é iniciada em um único processo do SO (você pode procurá-la pelo nome beam). Para cada CPU disponível, ele cria um thread. Isso torna os sistemas Erlang escaláveis ​​porque podem aproveitar todos os núcleos disponíveis.

Erlang Scheduler

Como parte do ERTS, o BEAM é responsável por escalonar os processos Erlang. Um único thread executa exatamente um escalonador que é, entre os outros, responsável por preencher a fila de processos Erlang. O escalonador também extrai processos Erlang da fila e aloca um intervalo de tempo para executar cada um deles.

Actor Model:

O Actor Model é um modelo/conceito matemático de computação concorrente que trata os atores como a primitiva fundamental e universal da computação concorrente.

O ERTS sobre o qual o Elixir se baseia, implementa o modelo de ator usando processos como atores que são leves e rápidos para criar e encerrar.

Os atores, neste modelo, podem ter as seguintes propriedades, entre outras, dependendo de seu design:

  • Tome a entrada como uma mensagem.
  • Faça o cálculo.
  • Pode criar outros atores.
  • Enviar mensagem de saída ou resposta.
  • Cada ator geralmente tem seu estado que não é compartilhado.
  • Os atores podem alterar o estado uns dos outros passando mensagens. Também podem modificar seu próprio estado.

Elixir ActorModel

Funcionalidades da Linguagem

Performance:

Para demonstrar a performance do Elixir, vou utilizar um exemplo retirado do seguinte artigo: Elixir: 10 motivos para aprender

Elixir 10k requisições:

Código Exemplo 10k requisições Elixir

Exemplo 10k requisições Elixir

Node 10k requisições:

Código Exemplo 10k requisições Node

Exemplo 10k requisições Node

Mais informações sobre performance em Elixir:
2 milhões de conexões websockets
Como o Discord escalou para 5M de usuários concorrentes

Produtividade:

Além da performance, existe um framework que nos dá um grande aumento da produtividade. O nome é Pheonix Framework
Com o Pheonix Framework, você consegue prototipar uma aplicação de forma muito rápida.
Para criar um projeto, via CLI, basta fazer:

mix phx.new <nome_projeto>
Enter fullscreen mode Exit fullscreen mode

PheonixFramework Logo

Sintaxe:

Alguns pontos sobre a sintaxe da linguagem:

  • inspirada em Ruby;
  • Podemos, por exemplo, utilizar “?” ou “!” na nomenclatura de funções e variáveis;
  • Parênteses não são obrigatórios e não precisamos declarar o retorno explicitamente em funções com “return”;
  • “Pattern Matching” (reconhecimento de padrões);
  • ”Guards”;
  • “Pipe Operator” (torna possível economizar diversas linhas de código e tornar a legibilidade muito alta).

Exemplo Com Pipe:

def perform(notification) do
    notification |> get_client |> get_remote_chats |> insert_or_update_local_chats

    :ok
  end
Enter fullscreen mode Exit fullscreen mode

Exemplo Sem Pipe:

def perform(notification) do
    insert_or_update_local_chats(get_remote_chats(get_client(notification)))

    :ok
  end
Enter fullscreen mode Exit fullscreen mode

Documentação:

Para a documentação, existe uma ferramenta chamada HexDocs
Para gerar uma página de documentação, basta adicionar alguns comentários “marcando” as funções e módulos e rodar um pequeno comando.

Codigo uso HexDocs

Pagina Gerada HexDocs

Macros e Metaprogramação:

Em Elixir, macros permitem uma extensão da linguagem. Ou seja, você pode criar código que escreve código em tempo de compilação.

Macros Elixir

Cases:

Algumas das empresas que usam Elixir:

Image description

Lista Completa

Documentário:

Há um documentário no Youtube sobre a linguagem:

Image description

Assista aqui

Aprendizado:

Alguns sites para aprender Elixir:
Elixir School
Exercism
Documentação da Linguagem

Fontes:

Top comments (0)