Elixir: Funcional, Concorrente e Distribuída


Elixir é uma linguagem de programação dinâmica, funcional e concorrente que executa na máquina virtual Erlang (BEAM), desenhada para construir aplicações escaláveis e sustentáveis.

Contexto

A história de Elixir começa por volta de 2008, quando o seu criador - José Valim - era, então, contribuidor da framework Ruby on Rails e membro da sua core-team. Por essa altura, começavam a surgir as primeiras discussões na comunidade de Ruby/Rails em torno do aparecimento de máquinas multicore (dois ou mais núcleos de processamento (cores) no interior de um único chip) e dentro da equipa do rails colocou-se a questão: Será que o Rails está preparado para tirar maior partido dessas máquinas?

Naquela época, a forma de fazer concorrência em Rails era com o uso de threads e o Rails 2.2 era thread-safe, ou seja, era seguro executar multithreading, uma vez que garantia que duas ou mais threads em simultâneo não faziam acessos a estruturas de dados comuns ou a lugares na memória.

No entanto, isto apenas garantia que a memória não era corrompida e que a execução do programa não teria erros que daí poderiam advir, contudo, não era suficiente para fazer uso ótimo de todos os cores da máquina.

Começou, então, a jornada de José Valim para resolver esta questão. Neste sentido, fez duas descobertas importantes, após as quais não existia retorno:

• Programação Funcional:

Em particular, o conceito de imutabilidade, que significa que, uma vez declarado um valor em memória, não é possível modificá-lo. Significa, por exemplo, que, se quisermos retirar um elemento de uma lista ou alterar o seu valor, em programação funcional, temos de criar uma nova lista igual à original, mas com o elemento removido/alterado. Isto tem uma implicação importante: através da transformação no lugar da mutação, problemas de concorrência deixam de se colocar, porque, simplesmente, não temos de tratar de sincronização num ambiente concorrente.

• Erlang:

Num contexto em que estavam a surgir algumas linguagens de programação novas, como Rust, Go ou Clojure com foco em resolver concorrência, José Valim apercebeu-se que, nos anos 80, a empresa sueca Ericsson já havia resolvido a concorrência e agora debruçava-se sobre distributividade (usar diversas máquinas - um cluster - para trabalhar numa tarefa de forma conjunta). Erlang, uma linguagem de programação funcional, e a sua máquina virtual foram desenvolvidas para implementar switches telefónicos, com uns requisitos particulares:

- Suportar várias pessoas a comunicar ao mesmo tempo, por outras palavras, concorrência;

- A necessidade de múltiplos switches que têm de trocar informação entre eles, introduzindo a inevitabilidade de distribuição;

- Uma vez que muitos destes switches teriam de ser colocados em lugares remotos, torna-se imprescindível um sistema capaz de se auto-recuperar após uma falha;

- Necessidade de atualizar o código em produção sem interromper os serviços a ser utilizados.

Se olharmos para esses mesmos requisitos que a Ericsson teve de satisfazer para as redes de telecomunicações e a maneira como hoje desenvolvemos aplicações/sistemas web, eles mostram enormes semelhanças. Foi esta realização que levou ao ressurgimento da linguagem.

O exemplo recente mais popular de utilização do Erlang e das suas potencialidades é o WhatsApp que afirmou, em 2011, que, graças a esta tecnologia, conseguia ter dois milhões de conexões num único nodo. Atualmente, o sistema do WhatsApp tem maior tráfego de mensagens diariamente que todo o sistema SMS.

Elixir

Com estas duas realizações em 2012, José Valim lança a linguagem de programação Elixir: funcional, concorrente e distribuída.

Em Elixir, contrariamente a outras linguagens como C, Java, Python, Ruby ou JavaScript, excertos de código sequencial correm dentro de processos, que não devem ser confundidos com processos do sistema operativo. Estes são isolados uns dos outros, correm concorrentemente e comunicam através da passagem de mensagens. Para além disso, são a base para a concorrência, assim como permitem programas distribuídos e tolerantes a faltas. Processos em Elixir são operações com pouco custo em termos de memória e CPU. Por este motivo, não é fora do comum ter centenas de milhares destes processos a correr em simultâneo.

Esta propriedade de os processos serem isolados é o que permite a tolerância a faltas de que falei anteriormente, sendo que, em Elixir, não existe rescue ou catch de erros para tratamento posterior, simplesmente, se o processo quebrar, um processo supervisor vai recuperar automaticamente ao começar um processo novo do lugar do que terminou.

O Elixir é, então, construído com base em três objetivos:

• Compatibilidade: O Elixir é compatível com tudo o que Erlang faz e, inclusive, pode-se chamar código Erlang em Elixir.

• Extensibilidade: O Elixir pode ser modificado para atuar em domínios diferentes.

• Produtividade: O Elixir possui um conjunto de features que justificaram o seu desenvolvimento por cima de Erlang, em vez da adoção do último, entre as quais estão:

-Documentação de primeira classe;

-Ferramentas como ExUnit (framework de testes unitários), o IEX (uma shell interativa) e o Mix (uma ferramenta que providencia tarefas para criar, compilar e testar a aplicação, assim como gerir dependências e muito mais);

-Formatador de código;

-Gerenciamento de pacotes;

-Frameworks como Phoenix (Web) e Nerves (IoT).

Utilização

Atualmente, muitas empresas utilizam Elixir, entre as quais se destaca a Mozilla, a Pepsico, o Discord, a Square Enix (desenvolvedora de jogos responsável por títulos como Final Fantasy e Kingdom Hearts), a BBC, a Bleacher Report, a Cabify, o Moodle, a exclusive sponsor da SEI - Accenture - e a empresa parceira do CeSIUM - Subvisual.

No CeSIUM, Elixir e a framework web Phoenix são tecnologias usadas, por exemplo, na API de backend da SEI: safira, assim como em muitos projetos que estão, neste momento, a ser desenvolvidos.

Outra empresa de renome que utiliza Elixir é a Pinterest e é isto que Steve Cohen, Senior Engineer, tem a dizer:

“Quando comecei no Spam Team, nós tínhamos perto de 1400 servidores a correr. Quando convertemos várias partes para Elixir, reduzimos este número para cerca de 95%. Em adição, a performance e a confiabilidade dos sistemas aumentou. Apesar de correr em drasticamente menos hardware, os tempos de resposta caíram significativamente, tal como os erros. O efeito combinado de uma melhor arquitetura e Elixir poupou a Pinterest mais de 2 milhões de dólares por ano em custos com servidores”.