Um dia talvez você precise usar Erlang

Uma breve introdução e apresentação dessa linguagem de programação para desenvolvimento concorrente e paralelo.

Introdução

Vamos pular a parte histórica desnecessária e ir direto ao ponto. # Ou você já pode ir direto para (Leitura ou Código)

Erlang surgiu para resolver problemas em telecomunicações, (antes mesmo de eu nascer), o objetivo era rodar em switches telefônicos, ou seja, atender milhões de processos em aparelhos com poder de processamento muito limitado e mesmo assim nunca parar.

Quem usa Erlang? – Grandes nomes como, por exemplo: Facebook, Yahoo, GitHub, Amazon, Motorola, CouchDB, RabbitMQ, entre outros.

Então eu acho que isto já te diz se ela dá conta do recado ou não.

Apresentação da linguagem

Erlang pode exigir um pouco de dedicação e uma certa curva de aprendizado, pois sua sintaxe é bem diferente do que estamos acostumados a ver em Python, PHP, Java, entre outros. E não é somente isto, o paradigma de programação também muda.

Programação Funcional, sim Erlang faz o uso deste paradigma de programação, porém não é puramente funcional, uma vez que o objetivo principal é trabalhar com programação concorrente e paralela. Atuando fortemente em sistemas como:

  • Sistemas distribuídos, transformar uma aplicação que roda sobre um processador em uma aplicação distribuída entre vários cores e clusters torna-se uma tarefa, relativamente, fácil com Erlang.

  • Sistemas em tempo real, sistemas críticos como controle aéreo ou mesmo uma aplicação online que recebe milhões de requisições ou milhões de dados para serem processados podem manter-se up o tempo todo quando está rodando com Erlang.

  • Sistemas tolerantes a falhas e que nunca podem parar contam com o mecanismo de detecção de erros que permite o controle sobre estes erros em produção, e a possibilidade de fazer o redeploy da aplicação sem parar ou reiniciar o serviço permite que sua aplicação fique online com o código antigo e novo ao mesmo tempo e em um certo momento você só "diz" ao serviço para passar a utilizar o novo código em produção.

O modelo de concorrência é baseado em processos. Tudo é bem explícito de modo que você escolhe o que será processado sequencialmente e o que será processado em paralelo. A troca de mensagens entre processos é assíncrona, ou seja, enquanto a mensagem é enviada o processo continua com suas tarefas. E este é o único método de troca de informação entre processos, e é o que torna fácil a tarefa de transformar uma aplicação comum em uma multicore.

E a syntax Erlang?

Bem, antes de código:

  • As variáveis são como as constantes que costumamos utilizar, atribuímos o valor apenas uma vez e após isto ele se torna imutável. Torna o debug mais fácil e evita diversos outros problemas.
  • Os programas são escritos utilizando funções é bem fácil de ler, quando se está acostumado com a sintaxe e paradigma utilizados.
  • Quando você cria o arquivo com funções, você deve dizer explicitamente no início do arquivo qual o nome do módulo e logo após quais são as funções deste módulo que serão exportadas para serem utilizadas fora em outros lugares fora do mesmo.
  • Erlang possui as diversas estruturas que estamos acostumados utilizar, principalmente para pythonistas, listas, tuplas, dicionários.
  • Possui um shell prompt bem legal.
  • As particularidades da syntax erlang e estrutura de programação podem ser bem esclarecidas na documentação, mas tem um modo bem interativo e legal de aprender o básico, acesse o Try Erlang.

Hey man! Where is the code?

Olhe! É um fatorial! (Arquivo math1.erl)

-module(math1).
-export([fatorial/1]).

% comentários são feitos assim
% exemplo de função fazendo o uso de recursão
% função que calcula o fatorial de um número
fatorial(0) -> 1;
fatorial(N) when N > 0 -> N*fatorial(N-1).

Agora vamos ver um exemplo aplicado em um problema do project euler que resolvi com Erlang.

(Problema 1) Se nós listarmos todos os números naturais abaixo de 10 que são múltiplos por 3 ou 5, nós teremos 3, 5, 6 e 9. A soma desses múltiplos é 23. Encontre a soma de todos os múltiplos de 3 ou 5 abaixo de 1000.

Arquivo problema_1.erl

-module(problema_1).
-import(lists, [sum/1, seq/1]).
-export([soma_dos_multiplos_de_3_e_5_menores_que_1000/0]).

soma_dos_multiplos_de_3_e_5_menores_que_1000()->
    lists:sum([X || X <- lists:seq(1,999), X rem 3 == 0 orelse X rem 5 == 0]).

Observem que neste eu faço o uso de lists comprehension [X || X <- lists:seq(1,999), X rem 3 == 0 orelse X rem 5 == 0].

No próximo exemplo vamos ver o uso do Pattern Matching que facilita o controle do fluxo do programa, uma vez que não podemos mudar os valores das variáveis mais que uma vez, podemos encontrar padrões nos valores recebidos por uma função e definir os comportamentos para cada padrão, como no exemplo abaixo, (retirado do Erlang Book, Part 1):

Programa 1.4 define uma função que converte temperaturas entre as escalas Celsius, Fahrenheit and R'aumur. O primeiro argumento é uma tupla contendo a escala e o valor da temperatura a ser convertida e o segundo argumento é a escala que queremos converter o valor passado no primeiro argumento.

Arquivo temp_converter.erl

-module(temp_converter).
-export([convert/2]).

convert({fahrenheit, Temp}, celsius) ->
        {celsius, 5 * (Temp - 32) / 9};
convert({celsius, Temp}, fahrenheit) ->
        {farenheit, 32 + Temp * 9 / 5};
convert({reaumur, Temp}, celsius) ->
        {celsius, 10 * Temp / 8};
convert({celsius, Temp}, reaumur) ->
        {reaumur, 8 * Temp / 10};
convert({X, _}, Y) ->
        {cannot, convert, X, to, Y}.

Aproveitando este último exemplo vamos mostrar como executá-lo:

Vamos partir do princípio que você tenha o Erlang instalado, entrado na pasta onde está o seu módulo temp_converter.erl e tenha entrado no shell com o comando erl.

Para compilar seu arquivo e ter o módulo disponível para você basta fazer:

> c(temp_converter).
{ok,temp_converter}

Agora chame o módulo e função e execute-o:

> temp_converter:convert({celsius, 30}, reaumur).
{reaumur,24.0}
>

Os outros exemplos podem ser executados dessa mesma forma.

Agora deixo para vocês uns links úteis para encontrarem mais informações e em um próximo artigo posso mostrar algum exemplo de troca de mensagens entre processos. Espero que tenham gostado!

Livros: Programming Erlang: Software for a Concurrent World, ERLANG Programming

Material online: Teste o Erlang online no Try Erlang, Erlang.org, Learn you some Erlang

blog comments powered by Disqus