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:
- https://medium.com/true-henrique/elixir-10-motivos-para-aprender-6cd4d6876f05
- https://www.alura.com.br/artigos/programacao-funcional-o-que-e
- https://blog.lelonek.me/elixir-on-erlang-vm-demystified-320557d09e1f
- https://zemuldo.com/blog/erlang-elixir-concurrency-model-5f26fddb356aef5185fd38b9
- https://www.erlang.org/
- https://elixir-lang.org/