Erlang é uma linguagem de programação funcional projetada para construir sistemas escaláveis e tolerantes a falhas, particularmente no domínio de aplicações concorrentes e distribuídas. Foi originalmente desenvolvida pela Ericsson no final da década de 1980 para criar sistemas robustos de telecomunicações. As características únicas do Erlang incluem seu suporte a processos leves, concorrência baseada em passagem de mensagens, troca de código em tempo real e uma forte ênfase na confiabilidade. Hoje, é amplamente utilizado em indústrias que requerem alta disponibilidade e sistemas distribuídos, como telecomunicações, aplicações de mensagens e sistemas de banco de dados.
Erlang foi criado no final da década de 1980 por Joe Armstrong, Robert Virding e Mike Williams na Ericsson, principalmente para atender às necessidades da indústria de telecomunicações. A linguagem foi desenvolvida para facilitar a construção de sistemas em larga escala e tolerantes a falhas que pudessem gerenciar múltiplas chamadas e conexões simultaneamente.
No início da década de 1990, a Ericsson reconheceu o potencial do Erlang além das telecomunicações. Em 1998, o Erlang foi lançado como código aberto, o que permitiu que uma comunidade mais ampla de desenvolvedores contribuísse para seu crescimento. O movimento de código aberto levou ao desenvolvimento da máquina virtual BEAM, que executa código Erlang e desde então evoluiu para suportar outras linguagens.
Atualmente, o Erlang é mantido pela equipe Erlang/OTP e possui uma comunidade dedicada. O ciclo de lançamento do Erlang se tornou mais consistente, com atualizações e melhorias regulares focadas em desempenho, novos recursos e documentação aprimorada. A linguagem também inspirou o desenvolvimento do Elixir, uma linguagem de programação moderna que roda na VM Erlang e incorpora muitos de seus princípios, enquanto fornece recursos adicionais.
Erlang é principalmente uma linguagem funcional, o que significa que funções são cidadãos de primeira classe e podem ser passadas como variáveis.
double(X) -> X * 2.
Os processos leves do Erlang permitem a criação de milhares de processos concorrentes sem sobrecarga significativa.
spawn(fun() -> io:format("Olá de um processo!~n") end).
Os processos em Erlang se comunicam usando passagem de mensagens, o que permite uma comunicação segura sem estado compartilhado.
Pid = spawn(fun() -> receive
{msg, Content} -> io:format("Recebido: ~s~n", [Content])
end end),
Pid ! {msg, "Olá!"}.
Erlang utiliza correspondência de padrões, um recurso poderoso que permite um código claro e conciso.
match(X) when X > 0 -> io:format("Número positivo: ~B~n", [X]);
match(X) -> io:format("Número não positivo: ~B~n", [X]).
Erlang suporta tolerância a falhas através de sua filosofia "deixe falhar", permitindo que processos falhem e sejam reiniciados sem afetar o sistema.
start_process() ->
spawn(fun() -> crash() end).
Erlang permite que os desenvolvedores mudem o código em sistemas em execução sem pará-los.
%% Versão antiga
-module(example).
-export([hello/0]).
hello() -> io:format("Versão Antiga~n").
%% Nova versão
-module(example).
-export([hello/0]).
hello() -> io:format("Nova Versão~n").
Os dados em Erlang são imutáveis, levando a menos bugs e facilitando o raciocínio sobre o código.
List = [1, 2, 3],
NewList = [4 | List].
Erlang possui recursos que permitem a fácil distribuição de processos entre diferentes nós.
net_adm:start() ->
net_adm:ping('other_node@hostname').
Erlang suporta tipos de registro para criar tipos de dados estruturados.
-record(person, {name, age}).
Person = #person{name="Alice", age=30}.
Erlang permite compreensões de lista para gerar e manipular listas de forma sucinta.
Squares = [X*X || X <- [1,2,3]].
Erlang é executado na máquina virtual BEAM, que é projetada para rodar aplicações concorrentes e tolerantes a falhas. O BEAM otimiza o desempenho e permite recursos como troca de código em tempo real.
Existem vários ambientes de desenvolvimento para Erlang, sendo o Emacs e o IntelliJ IDEA (com o plugin Erlang) alguns dos mais populares. Outras ferramentas notáveis incluem editores específicos para Erlang, como o Erlide.
Para criar um projeto Erlang, tradicionalmente usa-se a ferramenta rebar3
, que gerencia dependências e compila. Por exemplo, para criar um novo projeto, você executaria:
rebar3 new app myapp
Então, você pode compilar o projeto com:
rebar3 compile
Erlang é amplamente utilizado em telecomunicações, sistemas de mensagens e aplicações em tempo real. Aplicações notáveis incluem:
As principais forças do Erlang residem em seu modelo de concorrência e tolerância a falhas, o que o diferencia de linguagens como:
Traduzir código para e de Erlang pode ser complexo devido aos seus paradigmas únicos. Ferramentas como erl2cpp
existem para certas traduções, mas não há uma ferramenta automatizada amplamente disponível para todas as linguagens. A tradução manual pode envolver: