Erlang é uma linguagem de programação funcional, com aspectos da programação concorrente e lógica. Apresenta algumas características como a construção de alto nível, sendo considerada também como uma linguagem declarativa por tentar descrever o que deve ser calculado em vez de dizer como o valor é calculado, os processos são criados e executados de forma concorrente, sendo que não são criadas threads de sistema operacional. Dessa forma, cada processo é executado em seu próprio espaço de memória, não havendo compartilhamento de memória, portanto, não interferindo com os outros processos e não existindo condições de corrida.
Erlang cria, escalona e gerencia os processos independente do sistema operacional e esse procedimento permite que os processos sejam criados de forma extremamente rápida. A comunicação entre processos ocorre por troca de mensagens, com qualquer tipo de dado sendo passado dessa forma. Cada processo possui uma caixa de mensagens que armazena as mensagens recebidas. Da mesma forma que a criação de processos, a troca de mensagens acontece de forma muito rápida e o conjunto destes tem o tempo de execução bastante reduzido comparado a linguagens que utilizam memória compartilhada, semáforos e threads
Erlang permite a atualização do código fonte com o sistema em execução. Para isso, o sistema mantém uma tabela com o endereço de todos os módulos carregados. Os novos processos são criados com uma versão atualizada dos módulos enquanto os processos em execução utilizam os módulos antigos até terminarem de executar. Isso possibilita a realização de correções e melhorias sem que o sistema precise ser interrompido. Erlang possui um ambiente distribuído, ou seja, diferentes instâncias das aplicações podem ser executadas em diferentes máquinas, comunicando-se pela troca de mensagens.
Outra característica bastante relevante é a tolerância a falhas. Os processos criados são monitorados por um processo supervisor que recebe mensagens sobre o estado de cada um. Caso uma mensagem informe que algum processo falhou, o processo supervisor pode reiniciar o processo com falha para que este possa executar novamente de forma a concluir com êxito seu objetivo
Erlang foi desenvolvida no laboratório de computação da Ericsson, uma grande empresa do ramo de telecomunicações, por uma equipe de três desenvolvedores, sendo eles Joe Armstrong, Robert Virding e Mike Williams. Surgiu da necessidade de construção da próxima geração de telecomunicações nos anos 90, sendo que o sistema precisaria ser escalável, tolerante a falhas, previsível e sustentável. Nenhuma das linguagens de programação existentes na época forneciam todos os recursos necessários para isso. Nesse contexto que Erlang surge. Sua primeira versão foi lançada em 1986. Em 1998, juntamente com o framework OTP (Open Telecom Platform) que fornece um conjunto de estruturas, princípios e padrões que dão suporte à estrutura, design e implementação de sistemas para Erlang, esta tornou-se open source, ou seja, de código aberto.
Com o advento da internet e a evolução das tecnologias, Erlang passou por um processo de transição e adaptação para atender não apenas sistemas de telecomunicações, mas qualquer sistema em que ocorra troca de mensagens e que seja necessário escalabilidade, confiabilidade e consistências dos dados.
Para o desenvolvimento de aplicações em Erlang, é necessário um ambiente próprio para isso. Este pode ser encontrado no próprio site do Erlang e feito o download de forma gratuita. Essa linguagem de programação possui definição dinâmica de tipos e semântica funcional. Quando um valor é atribuído a uma variável, este não se altera mais. Isso faz com que as aplicações sejam tolerantes a falha. Os principais tipos de dados em Erlang são:
Abaixo serão apresentados 2 exemplos de programação em Erlang, sendo o primeiro um clássico da programação, o famoso Hello World, e o segundo um exemplo mais focado na dinâmica da programação concorrente com comunicação entre processos.
As figuras abaixo irão apresentar um pouco da estrutura dos programas desenvolvidos em Erlang:
Na Figura 1 é apresentado o famoso código do Hello world em Erlang. A diretiva -module é utilizada para nomear o código. A diretiva export é utilizada para definir funções dentro do programa que podem ser usadas. O /0 ao lado de start significa que essa função não possui parâmetros. Start é a função que o programa desempenhará. Será utilizada a biblioteca io, a qual contêm todas as funções de entrada e saída em Erlang, e a fwrite serve para enviar o que foi passado como parâmetro para o console.
Na Figura 2 é possível observar que o código foi desenvolvido no editor de texto nano, que pode ser encontrado em sistemas UNIX. Com o código já desenvolvido, é chamado o terminal de execução Erlang pela diretiva erl. Com o terminal aberto, o comando c(helloworld) compila o arquivo e aponta se há erros ou não. Depois disso é chamada a função start() contida no programa denominado helloworld. Por fim, o conteúdo da função start() é apresentado em tela.
O código da Figura 3 calcula a área de retângulos e círculos. Na diretiva export é incluída mais uma função em comparação com a Figura 1. Essa função foi nomeada como loop, sendo uma chamada recursiva e não possui parâmetros. Essa função ficará esperando uma mensagem, por conta da diretiva receive, podendo calcular a área de um retângulo, um círculo, ou informar que não foi possível calcular alguma área a partir da mensagem recebida. Na função start() é criado um novo processo através da diretiva Spawn e enviado a função loop. Pelo Pid desse processo é enviada uma mensagem para realização do cálculo da área de um retângulo, juntamente com seus parâmetros.
Na Figura 4, o código é desenvolvido no editor de texto nano, compilado com êxito e, a partir da função start(), mostra o cálculo da área realizado por ele e a mensagem com os dados que foram passados.
http://cocic.cm.utfpr.edu.br/progconcorrente/doku.php?id=erlang
Oliveira, A. P.; Souza, P. S. L.; Souza, S. R. S.; Programação Concorrente em Erlang