Elixir - Uma Breve Introdução
Tags: elixir, programacaofuncional, ptbr, braziliandevs
Published: 2022-09-10 09:23:28

Elixir é uma linguagem de programação funcional. Foi lançada em 2011. Idealizado e desenvolvido por [José Valim](https://github.com/josevalim) dentro da empresa [Plataformatec](https://plataformatec.com/).


![Foto do José Valim](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tfxmi3melj5cegasd8q1.jpg)

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

Segundo [Eric Elliott](https://twitter.com/_ericelliott),

> 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4k425j9iex4s8t9yydyb.png)

#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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fqmpji74pyfw0pqyzcsf.png)

#Erlang, OTP e Tolerância a falhas
[Erlang](https://www.erlang.org/) é 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](https://blog.whatsapp.com/1-million-is-so-2011)
[WhatsApp tem 50 engenheiros para 900 milhões de usuários](https://www.wired.com/2015/09/whatsapp-serves-900-million-users-50-engineers/)

##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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oz4bvnkkarfkzhag4gaf.png)

##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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eo48wc3bbvt3ygu36bgx.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jp9300qiabgpq4bilfux.png)


#Funcionalidades da Linguagem

##Performance:
Para demonstrar a performance do Elixir, vou utilizar um exemplo retirado do seguinte artigo: [Elixir: 10 motivos para aprender](https://medium.com/true-henrique/elixir-10-motivos-para-aprender-6cd4d6876f05)

**Elixir 10k requisições:**

![Código Exemplo 10k requisições Elixir](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xpxgdot8g1ptu4zb40zk.PNG)

![Exemplo 10k requisições Elixir](https://miro.medium.com/max/1400/1*zVJJroH-dWsc04mk04gMpg.gif)


**Node 10k requisições:**

![Código Exemplo 10k requisições Node](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rocif33dulizimdh9ucw.PNG)

![Exemplo 10k requisições Node](https://miro.medium.com/max/1400/1*8_YMbs7jdnQBUJHRrCghAA.gif)

Mais informações sobre performance em Elixir:
[2 milhões de conexões websockets](https://phoenixframework.org/blog/the-road-to-2-million-websocket-connections)
[Como o Discord escalou para 5M de usuários concorrentes](https://discord.com/blog/how-discord-scaled-elixir-to-5-000-000-concurrent-users)


##Produtividade:
Além da performance, existe um framework que nos dá um grande aumento da produtividade. O nome é [Pheonix Framework](https://phoenixframework.org/)
Com o Pheonix Framework, você consegue prototipar uma aplicação de forma muito rápida.
Para criar um projeto, via CLI, basta fazer: 
```bash
mix phx.new <nome_projeto>
```


![PheonixFramework Logo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0yexfmy1creo9465tz51.jpg)

##Sintaxe:
Alguns pontos sobre a sintaxe da linguagem:

- inspirada em [Ruby](https://www.ruby-lang.org/pt/);
- 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:
```elixir
def perform(notification) do
    notification |> get_client |> get_remote_chats |> insert_or_update_local_chats

    :ok
  end
```

###Exemplo Sem Pipe:
```elixir
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](https://hexdocs.pm/)
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ag3bivo0qkie553fnjam.PNG)

![Pagina Gerada HexDocs](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w1f2zxkk833oy99lu24z.PNG)

##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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8mqyjlavxiicrbg0sbun.PNG)

#Cases:
Algumas das empresas que usam Elixir:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mkl6ojn0n6nnjy01xs61.PNG)

[Lista Completa](https://elixir-lang.org/cases.html)

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/921q4h0u4e6slp6bckvx.jpg)

[Assista aqui](https://www.youtube.com/watch?v=lxYFOM3UJzo)

#Aprendizado:
Alguns sites para aprender Elixir:
[Elixir School](https://elixirschool.com/pt)
[Exercism](https://exercism.org/tracks/elixir)
[Documentação da Linguagem](https://elixir-lang.org/getting-started/introduction.html)



#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/