Elixir é uma linguagem de programação funcional. Foi lançada em 2011. Idealizado e desenvolvido por José Valim dentro da empresa Plataformatec.
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.
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.
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
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 seguinte 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 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>
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:
Algumas das empresas que usam Elixir:
Documentário:
Há um documentário no Youtube sobre a linguagem:
Aprendizado:
Alguns sites para aprender Elixir:
Elixir School
Exercism
Documentação da Linguagem
Fontes:
- 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/
Top comments (0)