Tecnologia / Artigos / Erlang /
Mão na massa Erlang: o básico da linguagem

Cléber

* Date: 2014-12-02 12:34:56 * Modified: 2018-11-30 22:24:45 ----- Começo suscinto: * Erlang é filho de Prolog, que é um paradigma de programação completamente diferente da programação procedural, assim como é diferente de programação funcional. O que Erlang tem em comum com o pai é a semelhança na sintaxe. * Erlang geralmente roda em uma VM, que chamamos, normalmente, de BEAM (Bogdan/Björn’s Erlang Abstract Machine). Ela funciona mais ou menos como a JVM (Java Virtual Machine), só que, claro, aplicando os conceitos e requisitos de Erlang. * Se você nunca programou em uma linguagem funcional, em Prolog ou mesmo em Erlang, eu acredito que você tenha melhores chances de entender os conceitos se, primeiro, souber programar em Python (um dia, em algum artigo, eu explico os motivos detalhadamente). Ruby também deve ajudar, mas essa linguagem eu não faço questão de aprender. :-P * Esse curso considera que você já é um programador experiente, conhecendo algumas outras linguagens de programação. Então vamos lá? Vamos começar instalando o Erlang. Se você usa Linux ou um BSD, é só buscar por Erlang no seu gerenciador de pacotes ou sistema de ports. Não tem segredo para instalar. Agora chame o “shell” do Erlang: # erl No meu caso, aparece o seguinte: Erlang R16B03 (erts-5.10.4) [source] [smp:2:2] [async-threads:10] [kernel-poll:false] Eshell V5.10.4 (abort with ^G) 1ᐳ ## Variáveis Variáveis meio que não existem em Erlang. Pelo menos não segundo o velho conceito das linguagens procedurais. Quando você está aprendendo C, Python ou até shell script, os exemplos acabam sendo assim: ```bash ᐳ x = 10 ᐳ print x 10 ᐳ x = 45 ᐳ print x 45 ``` Para uma linguagem de programação, ok. Mas, matematicamente, isso aí não faz sentido. Se você tem um valor “x” no meio de um monte de equações, não pode simplesmente, no meio do caminho, dizer que x não é mais 10, e que agora é 45! Por isso, em Erlang, se você disser que x é 10, x será 10 para sempre. Ponto. Mas por que isso? Um dos princípios básicos de Erlang é diminuir ao máximo (em geral, completamente) a quantidade de efeitos colaterais. … … “Efeitos what?” Efeitos Colaterais Ah, a orientação a objetos! Já disse o sábio Jacob Gabrielson, em seu excelente artigo “Execution in the Kingdom of Nouns” que: Defender programação orientada a objetos é como defender vestimenta orientada a calças. E não é? O fato é que é bem difícil, complicado e chato (especialmente chato. Oh, que chato!) fazer código concorrente (em que há vários fluxos de execução simultâneos) com uma linguagem orientada a calças. Digo, objetos. Se você tem uma aplicação complexa o suficiente, logo estará perdido entre as várias threads e os zilhõõões de locks que terá que ter. Mas para que travar coisas? Ora, porque há mais de um fluxo de execução mexendo no mesmo objeto/variável/estrutura! Então você precisa proteger seus dados. E o motivo é simples: em Python (eu sempre vou usar Python como exemplo, mas você pode trocar por C, C++, Java, Ruby, Perl, etc), o “container básico” são os objetos. A concorrência é uma intempérie. Como o container básico existe de forma transversal ao conceito de concorrência, temos que criar mecanismos para proteger nossos objetos deles mesmos quando a execução deixa de ser linear. Python, como linguagem, não se preocupa em evitar efeitos colaterais. Ela apenas provê remédios paliativos para que os efeitos do problema não sejam sentidos (mas, claro, isso não é um “problema” se seu código não usa concorrência). E toda a complexidade envolvida em criar-se algoritmos que usam concorrência deve-se à arquitetura da própria linguagem e seu ambiente. Em um ambiente que se preocupa com concorrência, manter “x = 10″ até o fim da execução é uma maneira de garantir que um ramo de execução não acabe estragando o resultado de outro ramo, ou que vários ramos tenham resultados incoerentes. Lembre-se, também, que na “OOP de mercado”, um objeto é, basicamente, uma grande estrutura de dados que tem o poder de alterar-se a si mesma. Seu estado interno é alterado por vários meios, e, a não ser que você faça uma implementação não-tradicional, transpor isso para um mundo repleto de concorrência representa, basicamente, que cada “ator” que mexa em seu objeto deve travá-lo pelo tempo que precisar para fazer sua interação com o mesmo. Voltando às “variáveis” de Erlang… Quando você diz, em Erlang, que o valor de x é 10, você nunca mais muda esse fato. Por isso, ao invés de chamarmos x de “variável”, nós o chamamos de “valor”. É o “valor x”, pois ele não varia. Mas existe, sim, algo que podemos chamar de “variável”, que são as variáveis usadas dentro das funções. Digamos que eu tenha (em Python) a seguinte função: ```python def f(x): return 10*x + 2 ``` x é, de fato, variável. Matematicamente, seria a minha “incógnita”. De fato, x pode variar entre as diversas execuções da função “f”, mas não costuma variar dentro do próprio corpo (escopo) da função. Em Erlang, é a mesma coisa, mas com algumas diferenças: Os nomes das variáveis começam com letras maiúsculas, o que torna nosso “x” um “X” (isso é herança do Prolog). Quando a função é chamada, é feito o “bind” do valor de X, e esse X nunca mais mudará dentro da execução da função. Exemplo em Erlang: ```elixir f(X) -ᐳ 10*X + 2. ``` Se, no meio da função, eu resolvesse alterar o valor de X… ```elixir f(X) -ᐳ X = 100, 10*X + 2. ``` O shell (erl) me daria um erro: ``` ** exception error: no match of right hand side value 100 ``` Creio que valha o esforço explicar a mensagem de erro: como X é um valor que já foi “ligado/atado” (bound), o erl pensa que você está perguntando se X casa com 100. Se eu executar f com argumento 100, essa cláusula passa sem erro, pois 100 é igual a 100. No próprio erl, você pode reproduzir esse erro: ``` 5 = 100. ** exception error: no match of right hand side value 100 ``` ## Resumo Bom, acho que é o suficiente para um artigo. Recomendo que você abra o erl e brinque um pouco com os conceitos que aprendeu e tente algumas coisas que você já sabe de outras linguagens, como comparadores, operações aritméticas, etc. Até a próxima aula! * Valores/variáveis começam com letras maiúsculas; * Uma vez bound, sempre bound (valores não mudam).

Curti

51 visitantes curtiram esse Item.

Anterior: Por que eu programo em Erlang | Próximo: Dica rápida: spawn e self