Skip to main content

Nesse artigo vamos falar sobre a linguagem Elixir e abordar conceitos de programação funcional.

O que é o Elixir?

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

Conceitos de programação funcional

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.

Os conceitos

  • Composição de Função: cria-se uma nova função, através da composição de outras.
  • Funções Puras: independentemente 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.

Erlang, OTP e tolerância a falhas

Erlang

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 – 2 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

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.

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.

Funcionalidades da Linguagem

Performance

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

Elixir 10k requisições

Node 10k requisições

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

Produtividade

Além da performance, existe um framework que nos dá um grande aumento da produtividade. O nome é Phoenix Framework.
Com o Phoenix 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>

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

Exemplo sem pipe

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

    :ok
  end

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:

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.

Cases

Conheça algumas das empresas que usam Elixir: acesse a lista completa.

Documentário

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

Aprendizado

Alguns sites para aprender Elixir:

Fontes:

João Paulo de Castro Lima – Analista de Sistemas na BRQ

BRQ fale conosco