BT

Porque considerar o uso de Erlang no seu próximo projeto

por Leandro Silva em 25 Fev 2010 |

O nascimento

Erlang nasceu no laboratório de ciência da computação da Ericsson, na década de 1980, influenciada por linguagens como ML, Ada, Module, Prolog e Smalltalk, quando um time de três cientistas – entre eles, Joe Armstrong, considerado o pai da linguagem – receberam a missão de descobrir qual seria a melhor linguagem de programação para escrever a próxima geração de sistemas de telecom. Após dois anos de ardua investigação e prototipação, estes cientistas descobriram que nenhuma linguagem era completa o bastante para tal objetivo e, conclusivamente, decidiram criar uma nova linguagem. Nasceu então Erlang, the ERicsson LANGuage.

De lá pra cá, Erlang vem sendo evoluída e usada para escrever grandes sistemas críticos, porque é exatamente nesse cenário que Erlang mostra melhor seu valor.

O primeiro grande caso de sucesso foi do AXD301 ATM Switch, que tem em seu coração mais de 1,5 milhão de linhas de código Erlang lidando com toda a complexidade de controle lógico, supervisão de operação e manteneção, integrado a mais meio milhão de linhas de código C/C++, que lida com protocolos de baixo nível, drivers, etc. Este switch foi usado pela British Telecom em 2002 com a inacreditável marca de 99,9999999% de disponibilidade, segundo um press release da própria Ericsson. À época, Bernt Nilson, diretor do programa Ericsson Next Generation Systems, confirmou que "a rede tem estado tão disponível, mas tão disponível, que existe o risco de nossos engenheiros de campo não desenvolverem habilidades de manutenção".

Diferente de algumas linguagens que nascem para encontrar um nicho, Erlang nasceu com um problema a ser resolvido, com requisitos a serem atendidos. Tolerância a falhas, concorrência realmente pesada, computação distribuída, atualização da aplicação sem derrubá-la, sistemas de tempo real, este é o nicho de Erlang, foi para isto que Erlang nasceu.

 
Quem usa
 
Além da Ericsson, é lógico, há algumas outras grandes empresas e projetos usando Erlang, como por exemplo:
  • Facebook, no backend de seu sistema de chat, lidando com 100 milhõs de usuários ativos;
  • Delicious, que tem mais de 5 milhões de usuários e mais de 150 milhões de bookmarks;
  • Amazon SimpleDB, o serviço de dados do poderoso Amazon EC2;
  • GitHub, no seu sistema de backend, lidando com milhares de transações concorrentes;
  • Motorola, CouchDB, RabbitMQ, Ejabbed, entre outros.
 
Algumas características

1 - Expressividade e beleza

Há quem diga que não, mas Erlang é uma linguagem muito bonita. Dado as já citadas influências de Erlang, ela é uma linguagem bem expressiva e declarativa, que encoraja a escrita de código simples e objetivo, o que certamente promove código fácil de ler, escrever e organizar [em módulos reutilizáveis]. O snippet abaixo é um exemplo de implementação do famoso fatorial:

-module(sample1).
-export([fac/1]).
fac(0) -> 1;
fac(N) -> N * fac(N-1).

 

2 - Forte uso de recursividade

Esta certamente é uma clara herança da veia funcional de Erlang, que torna o código muito menos imperativo e mais declarativo. Mas além da beleza declarativa óbvia, é importante saber que Erlang foi projetada para lidar com iterações recursivas gigantescas sem qualquer degradação de performance – e sem estourar o “heap” de memória. O item anterior é um bom exemplo disso.

 

3- Livre de efeito colateral

Uma das coisas que Erlang favorece é a construção de sistemas altamente concorrentes rodando em processadores com multiplos núcleos. E como concorrência e efeito colateral absolutamente não combinam, em Erlang, uma vez que um dado valor tenha sido atribuído a uma variável, esta não pode mais ser modificada – ou seja, estão mais para o que conhecemos por constantes do que para variaveis.

Se você já escreveu código concorrente sabe o quanto tê-lo livre de efeitos colaterais te faz livre de dores de cabeça. Poucas coisas são tão deprimentes quanto debugar código concorrente repleto de efeitos colaterais.

 

4- Pattern matching

Pattern matching em Erlang é usado para associar valores a variáveis, controlar fluxo de execução de programas, extrair valores de estruturas de dados compostas e lidar com argumentos de funções. Mais um ponto para código declarativo e expressividade. Como mostra o código abaixo:

-module(sample2).
-export([convert_length/1]).

convert_length({_, 0}) ->
{error, unconvertable_value},

convert_length(Length) ->
case Length of
{centimeter, X} ->
{inch, X / 2.54};
{inch, Y} ->
{centimeter, Y * 2.54}
end.

Fala por si, não fala? Pattern matching para selecionar a função – o que acaba validando a entrada – e para conversão da unidade de medida.

5- Concorrência baseada em passagem de mensagens (a.k.a. Actors) Acho que concorrência baseada em passagem de mensagem entre atores é uma das features mais populares de Erlang. Vejamos o porque com o famoso exemplo do Ping-Pong:

-module(sample3).

-export([start/0, ping/2, pong/0]).

ping(0, Pong_PID) ->
Pong_PID ! finished,
io:format("Ping finished~n", []);

ping(N, Pong_PID) ->
Pong_PID ! {ping, self()},
receive
pong ->
io:format("Ping received pong~n", [])
end,
ping(N - 1, Pong_PID).

pong() ->
receive
finished ->
io:format("Pong finished~n", []);
{ping, Ping_PID} ->
io:format("Pong received ping~n", []),
Ping_PID ! pong,
pong()
end.

start() ->
Pong_PID = spawn(sample3, pong, []),
spawn(sample3, ping, [3, Pong_PID]).

Neste pequeno snippet podemos observar algumas características de Erlang já citadas neste post, tal como pattern matching na captura das mensagens e recursividade no controle das iterações. Agora, falando do aspecto concorrente em si, algumas coisas são particularmente interessantes aqui:

  • Em Erlang, a concorrência acontece entre processos leves, diferente de linguagens como C++ e Java, que baseiam sua concorrência em threads nativas de sistema operacional, que são caríssimas;
  • Em Erlang, há um tipo de dado chamado PID, o qual é o identificador do processo paralelo (mais conhecido como Actor) e para o qual as mensagens podem ser enviadas.

Releia o código acima com estas informações em mente e veja como concorrência em Erlang é algo completamente descomplicado e natural. Depois, pense no mesmo código implementado em C#, Java ou C++. Não, não, brincadeira, não pense não

 

Conclusão

Erlang possui muitas outras características e informações bem interessantes (como a OTP, por exemplo), mas que foge um pouco do escopo desse artigo, senão ele ficaria absurdamente gigantesco para o meu gosto – e acho que para o seu também. Mas acredito que pelo que já apresentei até aqui, você já tenha motivos suficientes para pensar em Erlang com carinho, buscar conhecê-la um pouco mais, e quem sabe, considerá-la para seu próximo grande projeto.
 
Mais discussões sobre Erlang podem ser encontrados no meu blog. Você consideraria usar Erlang em seu próximo grande projeto?

 

Avalie esse artigo

Relevância
Estilo/Redação

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

Dê sua opinião
Feedback geral
Bugs
Publicidade
Editorial
Marketing
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2016 C4Media Inc.
Política de privacidade
BT

We notice you’re using an ad blocker

We understand why you use ad blockers. However to keep InfoQ free we need your support. InfoQ will not provide your data to third parties without individual opt-in consent. We only work with advertisers relevant to our readers. Please consider whitelisting us.