Erlang Programming Language Aluísio Rodrigo (arfs) Diego Lima (dclal) Roteiro Introdução Histórico Características Utilização Especificação Implementação e Ambientes de Desenvolvimento Sintaxe Vantagens e Desvantagens Tendências Introdução “Programming Erlang, Software for a Concurrent World” Joe Armstrong, 2007 Introdução Linguagem de programação concorrente Sistemas de telecomunicações Sistemas de controle Aplicações distribuídas Soft Real-Time Applications Open Source Útil para Servidores de aplicação da Internet Roteiro Introdução Histórico Características Utilização Especificação Implementação e Ambientes de Desenvolvimento Sintaxe Vantagens e Desvantagens Tendências Histórico Motivação: Nenhuma linguagem para sistemas de telecomunicações 1984 – Formado Laboratório de Computação da Ericsson 1987 – criação do protótipo da linguagem Erlang 1991 – Primeira Implementação rápida 1993 – Distributed Erlang Homenagem ao matemático A.K. Erlang Ericsson Language Programação de sistemas de telecomunicações Suporte à aplicações concorrentes e distribuídas 1998 – Open Source Roteiro Introdução Histórico Características Utilização Especificação Implementação e Ambientes de Desenvolvimento Sintaxe Vantagens e Desvantagens Tendências Características Linguagem Funcional Funções matemáticas Prova de propriedades Concorrência Baseada em processos Concorrência é explícita O usuário pode controlar quais segmentos são computados seqüencialmente e quais são feitos em paralelo Processos só trocam informações através de mensagens Características Tempo Real Projetada para aplicações leves em tempo real. Respostas na ordem de milissegundos. Programação Distribuída Possui mecanismos que facilitam a escrita de aplicações que possam rodar tanto em um único computador como em uma rede de computadores Características Robustez Tolerância a falhas Operação contínua Gerenciamento de Memória Primitivas de carregamento de código Garbage Collector Processos não compartilham memória Integração Pode ser integrado facilmente com programas em outras linguagens Roteiro Introdução Histórico Características Utilização Especificação Implementação e Ambientes de Desenvolvimento Sintaxe Vantagens e Desvantagens Tendências Utilização Ericsson: AXD 301, GPRS, (NetSim), LCS Nortel: SSL Accelerator, SSL VPN gateway + others TMobile: IN applications Vail Systems: Computer Telephony Apps Service Prov. Erlang Financial Systems: Banking & Lottery systems Mobile Arts: Presence & Messaging for GSM/UMTS Synap.se: Billing & device configuration Blue Position: Bluetooth Location Information System Motivity: Answer Supervision Generator, Signalling Gateway Telia: CTI Platform Corelatus: Signalling gateways & cross-connects Bluetail/TeleNordia: Robust SMTP Mail Server Univ. of Coruña: VoD Cluster Roteiro Introdução Histórico Características Utilização Especificação Implementação e Ambientes de Desenvolvimento Sintaxe Vantagens e Desvantagens Tendências Especificação Open Source Erlang www.erlang.org Getting Started Documentation Examples Downloads Source Binary Roteiro Introdução Histórico Características Utilização Especificação Implementação e Ambientes de Desenvolvimento Sintaxe Vantagens e Desvantagens Tendências Implementação Tipos de Implementação Open Source Erlang Implementação mais popular Inclui a biblioteca OTP (Open Telecom Plataform) Corba, Databases, GUI Ericsson’s Comercial Erlang Essencialmente a mesma da Open Source Oferece suporte Implementação Máquinas Virtuais New BEAN (Bogdan/Björn's Erlang Abstract Machine) JAM (Joe’s Abstract Machine) Utilizada na versão comercial A máquina virtual original de Erlang inspirada em Prolog Old BEAN Transformar de Erlang para C e depois para código nativo Foi abandonado devido a problemas com eficiência Ambientes de Desenvolvimento Erlang Shell ErlyBird Desenvolvido pela Ericsson IDE baseado no NetBeans Erlide Plug-in para o Eclipse Instalação: http://www.cin.ufpe.br/~dclal/arquivos/instalacao.pdf Roteiro Introdução Histórico Características Utilização Especificação Implementação e Ambientes de Desenvolvimento Sintaxe Vantagens e Desvantagens Tendências Sintaxe Números Integers 10. -234. 2#110111010. (BASE#VALOR) $A. ($CHAR) Floats 17.368. -56.654. 12.34E-10. Sintaxe Átomos O valor do átomo é sua própria declaração O tamanho do átomo é indefinido Deve possuir aspas caso não comece com uma letra em minúsculo ou contenha caracteres especiais que não seja _ ( ) ou @ hello. phone_number. ‘Monday’. ‘phone number’. Sintaxe Tuplas {123, bcd}. {person, 'Joe', 'Armstrong'}. Listas [123, 456]. [{person, 'Joe', 'Armstrong'}, {person, 'Robert', 'Virding'}]. Sintaxe Variáveis Devem começar com a primeira letra maiúscula Ao contrário dos átomos, só alguns caracteres são permitidos A variável só pode receber o valor apenas uma vez Abc A_long_variable_name AnObjectOrientatedVariableName Sintaxe Casamento de Padrão {A, B, C} = {10, foo, bar} [H|T] = [1,2,3,4] A = 10, B = foo, C = bar H = 1, T = [2,3,4] {A,_,[B|_],{C}} = {abc,1,[2,3],{4}} A = abc, B = 2, C = 4 Sintaxe Boolean Não existe o tipo booleano em Erlang. São utilizados os átomos true e false. String São representações de listas de inteiros “hello” = [$h,$e,$l,$l,$o] = [104,101,108,108,111] Sintaxe Seqüências Especiais Sintaxe Operadores - 3. 5 + 10.0. 3 / 2. 3 div 2. true and (1 =< 3). Sintaxe Lógicos Operadores Relacionais Aritméticos Sintaxe Operadores Symbol Purpose , Statement Separator ; Statement Separator . Statement Terminator -> Function or Guard declaration Sintaxe Operadores de Listas Concatenação ++ [1,2,3]++[4,5] = [1,2,3,4,5] Subtração - [1,2,3,2,1,2]--[2,1,2] = [3,1,2] Sintaxe Expressões Não são lazy-evaluation E1 + E2 – E1 e E2 são avaliadas. Expressões curto-circuito Expression_1 orelse Expression_2 Expression_1 andalso Expression_2 Sintaxe Módulos Em Erlang os códigos são divididos em módulos Cada módulo consiste de uma seqüência de atributos e de declaração de funções Os atributos de um módulo definem certas propriedades . Ex.: Aridade de uma função Sintaxe Módulos Atributos pré-definidos: -module(Module) -export(Functions) -import(Module,Functions) -compile(Options) -vsn(Vsn) Sintaxe Funções Seqüência de cláusulas separadas por ponto e vírgula e finalizada por um ponto Cada cláusula consiste de uma cabeça e de um corpo separado por -> A cabeça consiste no nome da função com uma lista de argumentos e uma guarda opcional começando com when Sintaxe Funções -module(fat). -export([fatorial/1]). fatorial(0) -> 1; fatorial (N) when N > 0 -> N * fatorial (N - 1); fatorial(_) -> 0. fat:fatorial(6). Sintaxe Funções -module(calculo). -export[area/1]. area({quadrado, Lado}) -> Lado* Lado; area({retangulo, X, Y}) -> X * Y; area({circulo, Raio}) -> % aproximadamente 3.14159 * Raio* Raio; area({triangulo, A, B, C}) -> S = (A + B + C)/2, math:sqrt(S*(S-A)*(S-B)*(S-C)). Sintaxe Algumas Built-in Functions atom_to_list(atom) float_to_list(Float) atom_to_list(hello) = “hello” float_to_list(7.0) = "7.00000000000000000000e+000" tuple_size({a,b,c}) date(), time() processes() Sintaxe Estruturas de Controle IF if Guard1 -> Sequence1 ; Guard2 ->Sequence2 ; ... end Sintaxe Estruturas de Controle IF -module(modulo). -export([maior_que/2]). maior_que(X, Y) -> if X > Y -> true; true -> % átomo funcionando como um else false end. Sintaxe Estruturas de Controle Case case Expr of Pattern1 [when Guard1] -> Seq1; Pattern2 [when Guard2] -> Seq2; ... end Sintaxe Estruturas de Controle Case -module(redondo). -export([eh_redondo/1]). eh_redondo(Forma) -> case Forma of {circulo, _} -> true; {quadrado, _} -> false; _ -> false end. Sintaxe Escopo das variáveis Em Erlang, variáveis em uma cláusula existem a partir do ponto que são atribuídas até a última referência textual da variável na cláusula Variáveis dentro do IF e Case são exportadas para o contexto de fora delas. Sintaxe Escopo das variáveis -module(teste). -export([f/1,g/1,h/1]). f(X) -> case g(X) of true -> A = h(X), B = 7; false -> B = 6 end, h(A), h(B). Sintaxe Processo Pid = spawn(Modulo, Funcao, [args]) Identifica um processo que vai executar uma função Pid = spawn(Node, Modulo, Funcao, [args]) Aplicação distribuída Node = Nó remoto Sintaxe Send Pid ! {a, 12} Receive receive Message 1 -> ... ; Message 2 -> ...; ... end Sintaxe -module(echo). -export([go/0, loop/0]). go() -> Pid = spawn(echo, loop, []), Pid ! {self(), hello}, receive {Pid2, Msg} -> Print = "Mensagem:" ++ atom_to_list(Msg) ++ "~nRecebido de:" ++ pid_to_list(Pid2) ++ "~n", io:format(Print,[]) end, Pid ! stop. loop() -> receive {From, Msg} -> From ! {self(), Msg}, loop(); stop -> true end. Sintaxe Tratamento de erros Catch e Throw -module(modulo). -export([roda_funcao/1]). funcao(1) -> hello; funcao(2) -> throw({exception, abc}); funcao(3) -> tuple_to_list(a); funcao(_) -> exit({myExit, 222}). roda_funcao(X) -> case catch funcao(X) of {exception, Args} -> "erro1"; {'EXIT',{myExit, Code}} -> "erro2"; {'EXIT', What} -> "erro3"; Other -> Other end. Sintaxe Palavras Reservadas: after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse query receive rem try when xor Comentários %comentário Sintaxe Exercícios fibonacci(X): Recebe um número inteiro positivo e retorna o n-ésimo elemento da seqüência de Fibonacci. elemento(X,Y): Recebe um número inteiro positivo e uma lista para retornar o n-ésimo elemento da lista. dobra1(X): Defina as funções dobra1(X) e dobra2() na qual a função dobra1 recebe o valor X e envia uma mensagem para o processo na qual a funcao dobra2 esta rodando. A funcao dobra2 duplica o valor passado na mensagem e retorna o valor para o processo que esta rodando dobra1 Roteiro Introdução Histórico Características Utilização Especificação Implementação e Ambientes de Desenvolvimento Sintaxe Vantagens e Desvantagens Tendências Vantagens Suporte à implementação de sistemas em Rede e telecomunicações Eficiência e confiabilidade Programação Concorrente Suporte à programação de sistemas distribuídos Atualizado sem necessidade de interromper sistema Pode ser integrado com Java, C/C++... Open Source Suporte da Ericsson (pago) Desvantagens Desempenho (linguagem interpretada) Não disponível para muitas plataformas (versão compilada) Fraqueza em programação “baixo nível” Roteiro Introdução Histórico Características Utilização Especificação Implementação e Ambientes de Desenvolvimento Sintaxe Vantagens e Desvantagens Tendências Tendências Open Source Linguagem atualizada Fácil literatura Baixo Custo Documentações recentes Constantes Releases Futuro promissor com sistemas multi-processados e tendências dos novos processadores “Multi-core” Referências Erlang. Wikipedia, the free encyclopedia. http://en.wikipedia.org/wiki/Erlang_programming_language. Linguagem de Programação Erlang. HoloCoCos @ TNT.br. http://holococos.sjdr.com.br/2007/05/linguagem-de-programaoerlang.php. Armstrong, Joe. Erlang: What´s all this fuss about Erlang?. http://www.pragmaticprogrammer.com/articles/erlang.html Open Source Erlang. www.erlang.org. A History of Erlang. http://portal.acm.org/citation.cfm?id=1238844.1238850&coll=G UIDE&dl=%23url.coll. Erlang Reference Manual. http://www.erlang.org/doc/doc5.5.4/doc/reference_manual/part_frame.html Erlang Programming Language ? Dúvidas