![Elixir Sample](/images/contents/home-code.png)
Elixir é uma linguagem dinâmica e functional contruida para contruir aplicações escaláveis e manuteníveis.
Elixir aproveita a VM do Erlang, conhecida por executar sistemas de baixa lantência, distribuídos e tolerante a falhas, enquanto também sendo sendo utilizado com sucesso no desenvolvimento web e incorporado no software domain.
Para aprender mais sobre Elixir, verifique o guia de início rápido. ou continue vendo a visão geral da plataforma, linguagem e suas ferramentas.
Destaques da plataforma
Escalabilidade
Todo código Elixir roda dentro de pequenas threads (chamadas processos) que são isolados e trocam informações entre si.
current_process = self()
# Spawns an Elixir process (not an operating system one!)
spawn_link(fn ->
send current_process, {:msg, "hello world"}
end)
# Block until the message is received
receive do
{:msg, contents} -> IO.puts contents
end
Devido a sua natureza pequena, não é incomum ter centenas de milhares de processos executando simultaneamente na mesma maquina. O isolamento permite que os processos sejam coletados de forma independente, reduzindo as pausas do sistema e usando todos os recursos da máquina da maneira mais eficiente possível (escalonamento vertical).
Processos são também capazes de se comunicar com outros processos rodando em maquinas diferentes na mesma rede. Isto provê a base para a distribuição, permitindo os desenvolvedores trabalhar entre diferentes nôs (escalonamento horizontal).
Tolerante a falhas
The unavoidable truth about software running in production is that things will go wrong. Even more when we take network, file systems, and other third-party resources into account.
To cope with failures, Elixir provides supervisors which describe how to restart parts of your system when things go awry, going back to a known initial state that is guaranteed to work:
import Supervisor.Spec
children = [
supervisor(TCP.Pool, []),
worker(TCP.Acceptor, [4040])
]
Supervisor.start_link(children, strategy: :one_for_one)
Features da linguagem
Programação funcional
Programação funcional promove um estilo de código que ajuda os desenvolvedores escrever um código menor, rápido, e mantenível. Por exemplo, pattern matching permite desenvolvedores a facilmente desestruturar informações e acessar seu conteúdo:
%User{name: name, age: age} = User.get("John Doe")
name #=> "John Doe"
Quando misturado com guards, o pattern matching nos permite combinar e afirmar com elegância condições específicas para que algum código seja executado:
def serve_drinks(%User{age: age}) when age >= 21 do
# Code that serves drinks!
end
serve_drinks User.get("John Doe")
#=> Fails if the user is under 21
Elixir depende muito desses recursos para garantir que seu software esteja funcionando sob as restrições esperadas. E quando não é, não se preocupe, os supervisores têm a sua volta!
Extensibilidades e DSLs
Elixir has been designed to be extensible, letting developers naturally extend the language to particular domains, in order to increase their productivity.
Como por exemplo, vamos escrever um simples caso usando um framework de teste para Elixir chamado ExUnit:
defmodule MathTest do
use ExUnit.Case, async: true
test "can add two numbers" do
assert 1 + 1 == 2
end
end
A opção async: true
permite test
s rodar em pararelo, usando tantos núcleos de CPU quanto possível, enquanto o assert
funcionadade pode introspeccionar seu código, provendo ótimos reportes em caso de falhas. Essas falhas são construidas usando Elixir macros, fazendo isso possível para adicionar novas construções como se elas fossem parte da própria linguagem.
Features das ferramentas
Um ecossistema crescente
Elixir vem com um grande conjunto de ferramentas para facilitar o desenvolvimento. Mix é uma ferramenta de build que permite você criar facilmente projetos, manusear tarefas, rodar testes e mais:
$ mix new my_app
$ cd my_app
$ mix test
.
Finished in 0.04 seconds (0.04s on load, 0.00s on tests)
1 tests, 0 failures
Mix é também capaz de manusear dependências e integra-las muito bem com o Hex package manager, o qual prove uma resolução de dependências e a habilidade de fazer fetch nos pacotes remotamente.
Desenvolvimento interativo
Ferramentas como IEx (Shell iterativo do Elixir) são capazes de alavancar muitos aspectos da linguagem e da plataforma e proveem auto-complete. ferramentas para debug, recarremento de códgio, bem como documentação bem formatada:
$ iex
Interactive Elixir - press Ctrl+C to exit (type h() ENTER for help)
iex> c "my_file.ex" # Compiles a file
iex> t Enum # Prints types defined in the module Enum
iex> h IEx.pry # Prints the documentation for IEx pry functionality
iex> i "Hello, World" # Prints information about the given data type
Compatibilidade com Erlang
Elixir roda na VM do Erlang dando aos desenvolvedores um acesso completo ao ecossistema Erlang, usado por empresas como Heroku, WhatsApp, Klarna, Basho e muitas mais para construir aplicações tolerante a falhas e distribuidas. Um programador elixir pode invocar qualquer função sem custo de tempo de execução:
iex> :crypto.hash(:md5, "Using crypto from Erlang OTP")
<<192, 223, 75, 115, ...>>
Para aprender mais sobre Elixir, verifique nosso guia de início rápido. Nós também temos umadocumentação online disponível e um Crash Course para desenvolvedores Erlang.