Click here to load reader

Erlang Tópicos Avançados de Linguagens de Programação Arthur Umbelino Alves Rolim([email protected])[email protected] Rodrigo Umbelino Alves Rolim([email protected])[email protected]

  • View
    119

  • Download
    0

Embed Size (px)

Text of Erlang Tópicos Avançados de Linguagens de Programação Arthur Umbelino Alves...

  • Slide 1
  • Erlang Tpicos Avanados de Linguagens de Programao Arthur Umbelino Alves Rolim([email protected])[email protected] Rodrigo Umbelino Alves Rolim([email protected])[email protected]
  • Slide 2
  • 14 de maro de 2007 Contedo Introduo Histria Caractersticas A linguagem Programao seqencial Programao concorrente Programao distribuda Compilao Code Replacement Tratamento de erros Concluso Referncias
  • Slide 3
  • 14 de maro de 2007 Introduo O que Erlang? Linguagem de programao concorrente para desenvolvimento de sistemas de controle, de tempo real, distribudos e em larga escala Utilizada em diversos sistemas de telecomunicaes da Ericsson A implementao mais popular disponibilizada como Open Source Influncia de linguagens funcionais, lgicas e de sistemas de controle
  • Slide 4
  • 14 de maro de 2007 Introduo Em que tipos de aplicaes Erlang util? Sistemas concorrentes, soft real-time, distribudos e de controle Sistemas de telecomunicaes Ex: Controlar um Switch, Converso de protocolos Aplicaes de bancos de dados que requerem um comportamento soft real-time Servidores para aplicaes da Internet Ex: Servidor IMAP-4, servidor HTTP, WAP, etc.
  • Slide 5
  • 14 de maro de 2007 Quem usa Erlang de hoje 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 Corua: VoD Cluster
  • Slide 6
  • 14 de maro de 2007 Histria 1984: Formado laboratrio de Computao da Ericsson 1984-86: Experincias programando POTS com varias linguagens 1998: Open Source Erlang 1987: Prototipo do projeto Erlang 1991: Primeira implementao rpida 1993: Distributed Erlang 1995: Muitos novos projetos 1996: Open Telecom Platform Nenhuma linguagem para sistemas de telecomunicaes
  • Slide 7
  • 14 de maro de 2007 Caractersticas Concorrncia Baseada em processos, com troca de mensagens assncronas. Utiliza pouca memria e poucos recursos computacionais. Real-time Erlang utilizada na programao de sistemas soft real-time, onde o tempo de resposta na ordem de milissegundos Linguagem funcional Sintaxe declarativa livre de efeitos colaterais
  • Slide 8
  • 14 de maro de 2007 Caractersticas Operao contnua Possui primitivas que permitem a substituio de cdigo sem necessidade de parar o sistema e permite que cdigo novo e antigo executem ao mesmo tempo Muito til para fazer atualizaes e correes de bugs em sistemas que no podem parar Robustez Possui vrias primitivas de deteco de erros para a estruturao de sistemas tolerantes a falhas
  • Slide 9
  • 14 de maro de 2007 Caractersticas Gerenciamento de memria Real-time garbage collector Distribuio Facilidade de construo de sistemas distribudos Integrao Erlang pode chamar ou utilizar programas escritos em outras linguagens Interface transparente
  • Slide 10
  • 14 de maro de 2007 A linguagem % Arquivo ex1.erl n! = 1 n*(n-1)! n = 0 n 1 Definio -module(ex1). -export([factorial/1]). factorial(0) -> 1; factorial(N) when N >= 1 -> N * factorial(N-1). Implementao Eshell V5.0.1 (abort with ^G) 1> c(ex1). {ok,ex1} 2> ex1:factorial(6). 720
  • Slide 11
  • Programao seqencial
  • Slide 12
  • 14 de maro de 2007 Tipos de dados Constantes Nmeros tomos Pids Compostos Tuplas Listas strings
  • Slide 13
  • 14 de maro de 2007 Constantes Nmeros Inteiros 10 -234 16#AB10F 2#1101101101 $A Floats 17.368 -56.654 12.34E-10
  • Slide 14
  • 14 de maro de 2007 Constantes tomos Tamanho indefinido So constantes literais O seu valor o prprio tomo Comeam com uma letra minscula Qualquer cdigo de caractere permitido entre aspas friday unquoted_atoms_cannot_contain_blanks 'A quoted atom which contains several blanks' 'hello \n my friend'
  • Slide 15
  • 14 de maro de 2007 Compostos Tuplas Usadas para armazenar um nmero fixo de elementos So permitidas tuplas de qualquer tamanho {123, bcd} {123, def, abc} {person, Joe, Armstrong} {abc, {def, 123}, jkl} {} 2 =< 3">
  • 14 de maro de 2007 Strings e booleans No so tipos de dados em Erlang tomos true e false so utilizados para denotar os valores booleanos 1> 2 =< 3 true 2> true or false true Strings so listas hello equivale a [$h,$e,$l,$l,$o], que por sua vez equivale a [104,101,108,108,111] e a [].
  • Slide 20
  • 14 de maro de 2007 Variveis Atribuio nica Valor nunca pode ser modificado depois do bind Iniciam com letra maiscula Armazenam valores de estruturas de dados Abc A_long_variable_name
  • Slide 21
  • 14 de maro de 2007 Pattern Matching > {A, B} = {[1,2,3], {x,y}}. > A. [1,2,3] > B. {x,y} > [a,X,b,Y] = [a,{hello, fred},b,1]. > X. {hello,fred} > Y. 1 > {_,L,_} = {fred,{likes, [wine, women, song]},{drinks, [whisky, beer]}}. > L. {likes,[wine,women,song]}
  • Slide 22
  • 14 de maro de 2007 Pattern Matching - Continuao [A, B | C] = [1, 2, 3, 4, 5, 6, 7] OK, A = 1, B = 2, C = [3, 4, 5, 6, 7] [H | T] = [1, 2, 3, 4] OK, H = 1, T = [2, 3, 4] [H | T] = [abc] OK, H = abc, T = [] [H | T] = [] Erro {A, _, [B | _], {B}} = {abc, 23, [22, x], {22}} A = abc, B = 22
  • Slide 23
  • 14 de maro de 2007 Chamada de funo modulo : func(Arg1, Arg2,..., Argn) func(Arg1, Arg2,..., Argn) Arg1... Argn so estruturas de dados Erlang Os nomes das funes e dos mdulos devem ser tomos Funes podem no ter argumentos (ex: date()) Funes so definidas dentro de mdulos Devem ser exportadas antes de serem chamadas fora do mdulo onde foram definidas
  • Slide 24
  • 14 de maro de 2007 Sistema de mdulos -module(demo). -export(double/1) double(X) -> times(X, 2). times(X, N) -> X * N. double pode ser chamado de fora do mdulo times local ao mdulo, no pode ser chamado de fora
  • Slide 25
  • 14 de maro de 2007 Built-in functions (BIFs) date() time() length([1, 2, 3, 4, 5]) size({a, b, c}) atom_to_list(atom) list_to_tuple([1, 2, 3, 4]) integer_to_list(2234) tuple_to_list({}) apply(Mod, Func, ArgList) apply({Mod, Func}, ArgList)... Esto no mdulo erlang Fazem o que difcil ou impossvel em Erlang
  • Slide 26
  • 14 de maro de 2007 Sintaxe de Funes func(padrao1, padrao2,...) ->... ; func(padrao1, padrao2,...) ->.... Regras de avaliao Clusulas so lidas sequencialmente at que ocorra um match Quando ocorre um match, so feitos os binds Variveis so locais a cada clusula, e so alocadas e desalocadas automaticamente O corpo da funo avaliado sequencialmente
  • Slide 27
  • 14 de maro de 2007 Funes -module(mathStuff). -export([factorial/1, area/1]). factorial(0) -> 1; factorial(N) -> N * factorial(N-1). area({square, Side}) -> Side * Side; area({circle, Radius}) -> % almost :-) 3 * Radius * Radius; area({triangle, A, B, C}) -> S = (A + B + C)/2, math:sqrt(S*(S-A)*(S-B)*(S-C)); area(Other) -> {invalid_object, Other}. 1; factorial(N) when N > 0 -> N * factorial(N - 1). Condies que tm de ser satisfeitas antes de uma cl">
  • 14 de maro de 2007 Guards factorial(0) -> 1; factorial(N) when N > 0 -> N * factorial(N - 1). Condies que tm de ser satisfeitas antes de uma clusula ser escolhida A palavra reservada when introduz um guard. Clusulas com guards podem ser reordenadas. factorial(N) when N > 0 -> N * factorial(N - 1); factorial(0) -> 1. No equivale a: factorial(N) -> N * factorial(N - 1); factorial(0) -> 1. (incorreto!!)
  • Slide 29
  • 14 de maro de 2007 Guards - Exemplos number(X) integer(X) float(X) atom(X) tuple(X) list(X) length(X) == 3 size(X) == 2 X > Y + Z X == Y X =:= Y
  • Slide 30
  • 14 de maro de 2007 Compreenso de listas [Lista || Gerador, Filtro] [X || X 3]. A lista de X na qual X retirado da lista [1,2,a,...] e X maior que 3. [a,4,b,5,6] X 3 um filtro
  • Slide 31
  • 14 de maro de 2007 Compreenso de listas Quick Sort sort([Pivot|T]) -> sort([ X || X [].
  • Slide 32
  • 14 de maro de 2007 Funes de alta ordem foreach(Fun, [First|Rest]) -> Fun(First), foreach(Fun, Rest); foreach(Fun, []) -> ok. map(Fun, [First|Rest]) -> [Fun(First)|map(Fun,Rest)]; map(Fun, []) -> []. 92> Add_3 = fun(X) -> X + 3 end. #Fun 93> lists:map(Add_3, [1,2,3]). [4,5,6]
  • Slide 33
  • 14 de maro de 2007 If e Case case lists:member(a, X) of true ->... ; false ->... end,... if integer(X) ->... ; tuple(X) ->... end,...
  • Slide 34
  • Programao concorrente
  • Slide 35
  • 14 de maro de 2007 Programao concorrente Erlang foi projetada para suportar concorrncia massiva Processos so leves Crescem e diminuem dinamicamente Pouco consumo de memria So inicializados e terminados de forma rpida Scheduling possui pouco overhead
  • Slide 36
  • 14 de maro de 2007 Criando um processo Pid Identificador nico de um processo spawn(Module, Name, Args) cria um novo processo e retorna seu Pid O novo processo criado ir iniciar executando em Module:Name(Arg1, Arg2,...)
  • Slide 37
  • 14 de maro de 2007 Criando um processo Antes: Depois: Pid2 = spawn(Mod, Func, Args) Pid2 o identificador de processo do novo processo, apenas conhecido pelo processo Pid1.
  • Slide 38
  • 14 de maro de 2007 Registro de processos register(Nome, Pid) Regista o processo Pid com o nome global Nome Nome tem que ser um tomo Envio de mensagens atravs do nome registado nome_registado ! Msg
  • Slide 39
  • 14 de maro de 2007 Registro de processos - Continuao Algumas primitivas unregister(Nome) - Remove a associao whereis(Nome) - devolve Pid associado a Nome ou undefined registered() - devolve lista dos processos registados
  • Slide 40
  • 14 de maro de 2007 Envio de mensagens Sender ! Msg Operador de envio de mensagens receive Bloco que trata o recebimento de mensagens self() Retorna o Pid do processo que executou esta funo
  • Slide 41
  • 14 de maro de 2007 Envio de mensagens - Continuao Mensagens podem carregar dados e serem seletivamente desempacotadas Envio de mensagens assncrono e seguro A mensagem sempre chega, dado que o receptor existe
  • Slide 42
  • 14 de maro de 2007 Programao distribuda Distributed Erlang System Conjunto de mquinas virtuais Erlang comunicando entre si Cada mquina virtual um n Envio de mensagens, links e monitores entre diferentes ns transparente quando Pids so usados Mecanismo de distribuio implementado via sockets TCP/IP
  • Slide 43
  • 14 de maro de 2007 N Toda mquina virtual Erlang dada um nome, usando os flags name (nomes longos) ou sname (nomes curtos) na linha de comando [email protected] Para nomes longos, host o nome do host completo Para nomes curtos, apenas parte do host usada node() Retorna o nome do n
  • Slide 44
  • 14 de maro de 2007 N - Exemplo Um n com nome longo no pode se comunicar com um n de nome curto
  • Slide 45
  • 14 de maro de 2007 Conexo entre ns Na primeira vez que o nome de um n remoto utilizado, feita uma conexo com o mesmo spawn(Node, M, F, A) ou net_adm:ping(Node) Cria um processo no n remoto Conexes so transitivas Para desativar: -connect all false Se um n cai, todas as conexes com ele so removidas Erlang:disconnect(Node) Fora a disconexo de um n
  • Slide 46
  • 14 de maro de 2007 Distribuio - Continuao Hidden nodes N que se conecta com apenas um outro n, invs de todos C nodes Um programa escrito em C que age como um Hidden Node Magic cookies Mensagens trocadas entre ns para garantir segurana
  • Slide 47
  • 14 de maro de 2007 Mdulos de distribuio global Sistema de registro global de nomes global_group Grupos de registro global net_adm Vrias rotinas para administrao de redes net_kernel Kernel da rede Erlang
  • Slide 48
  • 14 de maro de 2007 Distribuio transparente Erlang Run-Time System B ! Msg rede C ! Msg
  • Slide 49
  • 14 de maro de 2007 Compilao Cdigos Erlang so compilados para cdigos de objeto BEAM - Bogdans's Erlang Abstract Machine .beam O compilador tambm gera binrios
  • Slide 50
  • 14 de maro de 2007 Compilao - Continuao compile:file(Module) compile:file(Module, Options) No Erlang shell c(Module) Compila e carrega o mdulo
  • Slide 51
  • 14 de maro de 2007 Code Replacement Suporta a mudana de cdigo em um sistema em execuo Ideal para sistemas que no podem parar para serem feitas atualizaes e correes de bugs Feita ao nvel de mdulo Old e current Cdigo atual sempre referenciado usando chamadas completas modulo:nome
  • Slide 52
  • 14 de maro de 2007 Code Replacement- Exemplo -module(m). -export([loop/0]). loop() -> receive code_switch -> m:loop(); Msg ->... loop() end.
  • Slide 53
  • 14 de maro de 2007 Tratamento de erros Programas podem conter erros lgicos No detectveis pelo compilador Erlang fornece mecanismo de deteco e tratamento de erros em run time Primitivas catch e throw Proteger o cdigo de erros (catch) Tratamento de excepes (catch e throw)
  • Slide 54
  • 14 de maro de 2007 Proteo contra erros catch Expresso Se no existir falha retorna o valor de Expresso Se existir falha retorna {EXIT,Razo} Razo contm a explicao para o erro Processo no termina devido ao erro Exemplos catch 1 + 3 4 catch 1 + a {EXIT,{badarith,: : :}} catch somar(A,B) depende dos valores de A e B
  • Slide 55
  • 14 de maro de 2007 Tratamento de excees throw(Exceo) Retorna uma exceo a um catch associado Mesmo que lanada vrios nveis abaixo Exceo propaga-se at ser encontrado um catch Se no existir um catch ocorre um erro de execuo
  • Slide 56
  • 14 de maro de 2007 Tratamento de excees Cont. test(X) -> catch test1(X), processo nao morreu. test1(X) ->..., test2(X). test2(X) when list(X)-> throw({erro,nao sei processar listas}); test2(X) -> processar(X). Processo trata as excepes e no termina Sem catch gerado erro de execuo se for lanada a excepo Processo termina!
  • Slide 57
  • 14 de maro de 2007 Monitorizao de processos Erlang permite monitorizar processos Ligaes entre processos Sinais EXIT Ligaes podem ser estabelecidas Na criao do novo processo spawn_link(Modulo,Funo,Lista de argumentos) Durante a execuo link(Pid) Ligaes so bidireccionais A estabelece uma ligao com B B automaticamente ligado a A Ligaes podem ser removidas com unlink(Pid)
  • Slide 58
  • 14 de maro de 2007 Sinais Quando um processo falha, sinais de trmino so propagados para todos os processos associados a ele atravs de Link Sinal - {EXIT,Pid,Razo}
  • Slide 59
  • 14 de maro de 2007 Propagao de sinais de trmino Regra da propagao de erros Se um processo que recebe sinal de trmino, causado por um erro, no est fazendo error trapping, o mesmo morrer e enviar sinais de trmino para todos os processos ligados a ele
  • Slide 60
  • 14 de maro de 2007 Error trapping receive {'EXIT', P1, Why} ->... Sinais de trmino... {P3, Msg} ->... Mensagens normais... end
  • Slide 61
  • 14 de maro de 2007 Concluso Completa Fcil aprendizado Open Source Inmeras ferramentas Apoio da Ericsson
  • Slide 62
  • 14 de maro de 2007 Referncias Site oficial da Open Erlang www.erlang.orgwww.erlang.org Concurrent Programming in Erlang, ISBN 0- 13-285792-8 Erlang Reference manual Curso sobre Erlang - www.dei.isep.ipp.pt/~luis/orgc/slides/erlang/ http://en.wikipedia.org/wiki/Erlang_%28programming_language%29
  • Slide 63
  • 14 de maro de 2007 ?