Você está na página 1de 63

Erlang

Tpicos Avanados de Linguagens de Programao


Arthur Umbelino Alves Rolim(auar@cin.ufpe.br)
Rodrigo Umbelino Alves Rolim(ruar@cin.ufpe.br)

Contedo

Introduo
Histria
Caractersticas
A linguagem

Programao seqencial
Programao concorrente
Programao distribuda
Compilao
Code Replacement
Tratamento de erros

Concluso
Referncias
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

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.

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

14 de maro de
2007

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

Histria
1984:
Formado
laboratrio de
Computao da
Ericsson

1984-86:
Experincias
programando
POTS com
varias linguagens

Nenhuma linguagem
para sistemas de
telecomunicaes
1991:
Primeira implementao
rpida
1987:
Prototipo do
projeto Erlang

1996:
Open Telecom Platform

1993:
Distributed
Erlang
14 de maro de
2007

1998:
Open Source
Erlang

1995:
Muitos
novos projetos

Caractersticas

Concorrncia

Real-time

Baseada em processos, com troca de mensagens


assncronas. Utiliza pouca memria e poucos
recursos computacionais.
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

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

14 de maro de
2007

Caractersticas

Gerenciamento de memria

Distribuio

Real-time garbage collector

Facilidade de construo de sistemas distribudos

Integrao

Erlang pode chamar ou utilizar programas escritos em


outras linguagens
Interface transparente

14 de maro de
2007

A linguagem
%% Arquivo ex1.erl

Definio

1
n! =
n*(n-1)!

Implementao

n=0
n 1

-module(ex1).
-export([factorial/1]).
factorial(0) ->
1;
factorial(N) when N >= 1 ->
N * factorial(N-1).

Eshell V5.0.1 (abort with ^G)


1> c(ex1).
{ok,ex1}
2> ex1:factorial(6).
720

14 de maro de
2007

Programao
seqencial

Tipos de dados

Constantes

Nmeros
tomos
Pids

Compostos

Tuplas
Listas
strings

14 de maro de
2007

Constantes

Nmeros

Inteiros
10
-234
16#AB10F
2#1101101101
$A
Floats
17.368
-56.654
12.34E-10

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'
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}
{}
14 de maro de
2007

Compostos

Funes auxiliares

element(N,T) devolve elemento na posio N da


tupla

element(2,{a,b,c}) b

setelement(N,T,V) atribui ao elemento na posio


N o valor V

setelement(2,{a,b,c},x) {a,x,c}

14 de maro de
2007

Compostos

Listas

Armazenam um nmero varivel de elementos


Nmero de elementos constitui o comprimento da
lista
Exemplos

[]
[1 | [] ] [1]
[1,2,3]
[1 | [2 | [3 | [] ] ] ] [1,2,3]
[[1,2,3] | [4,5,6]] [[1,2,3],4,5,6]

14 de maro de
2007

Compostos

Estruturas complexas
[ { {person,'Joe', 'Armstrong'},
{telephoneNumber, [3,5,9,7]},
{shoeSize, 42},
{pets, [{cat, tubby},{cat, tiger}]},
{children,[{thomas, 5},{claire,1}]}},
{ {person,'Mike','Williams'},
{shoeSize,41},
{likes,[boats, beer]},
...
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 [].

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

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]}
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
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

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

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
14 de maro de
2007

Sintaxe de Funes
func(padrao1, padrao2, ...) -> ... ;
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

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}.
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!!)
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
14 de maro de
2007

Compreenso de listas
[Lista || Gerador, Filtro]
[X || X <- [1,2,a,3,4,b,5,6], 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 <- [1,2,a,...] um gerador
X > 3 um filtro

14 de maro de
2007

Compreenso de listas
Quick Sort
sort([Pivot|T]) ->
sort([ X || X <- T, X < Pivot]) ++
[Pivot] ++
sort([ X || X <- T, X >= Pivot]);
sort([]) -> [].

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<erl_eval.5.123085357>
93> lists:map(Add_3, [1,2,3]).
[4,5,6]
14 de maro de
2007

If e Case
case lists:member(a, X) of
true -> ... ;
false -> ...
end,
...
if
integer(X) -> ... ;
tuple(X) -> ...
end,
...
14 de maro de
2007

Programao
concorrente

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

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, ...)

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.
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

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

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
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

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

14 de maro de
2007

Toda mquina virtual Erlang dada um


nome, usando os flags name (nomes
longos) ou sname (nomes curtos) na linha
de comando
nome@host

Para nomes longos, host o nome do host


completo
Para nomes curtos, apenas parte do host usada

node() Retorna o nome do n


14 de maro de
2007

N - Exemplo

Um n com nome longo no pode se


comunicar com um n de nome curto
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

14 de maro de
2007

Distribuio - Continuao

Hidden nodes

C nodes

N que se conecta com apenas um outro n,


invs de todos
Um programa escrito em C que age como um
Hidden Node

Magic cookies

Mensagens trocadas entre ns para garantir


segurana

14 de maro de
2007

Mdulos de distribuio

global

global_group

Grupos de registro global

net_adm

Sistema de registro global de nomes

Vrias rotinas para administrao de redes

net_kernel

Kernel da rede Erlang

14 de maro de
2007

Distribuio transparente

B ! Msg
C ! Msg
Erlang
ErlangRun-Time
Run-TimeSystem
System

Erlang
ErlangRun-Time
Run-TimeSystem
System

rede
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

14 de maro de
2007

Compilao - Continuao
compile:file(Module)
compile:file(Module, Options)

No Erlang shell

c(Module)
Compila e carrega o mdulo

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
14 de maro de
2007

Code Replacement- Exemplo


-module(m).
-export([loop/0]).
loop() ->
receive
code_switch ->
m:loop();
Msg ->
...
loop()
end.
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)

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

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

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!
14 de maro de
2007

Monitorizao de processos

Erlang permite monitorizar processos

Ligaes podem ser estabelecidas

Na criao do novo processo


spawn_link(Modulo,Funo,Lista de argumentos)
Durante a execuo link(Pid)

Ligaes so bidireccionais

Ligaes entre processos


Sinais EXIT

A estabelece uma ligao com B


B automaticamente ligado a A

Ligaes podem ser removidas com unlink(Pid)


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}

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

14 de maro de
2007

Error trapping
receive
{'EXIT', P1, Why} ->
... Sinais de trmino ...
{P3, Msg} ->
... Mensagens
normais ...
end

14 de maro de
2007

Concluso

Completa
Fcil aprendizado
Open Source
Inmeras ferramentas
Apoio da Ericsson

14 de maro de
2007

Referncias

Site oficial da Open Erlang www.erlang.org


Concurrent Programming in Erlang, ISBN 013-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

14 de maro de
2007

?
14 de maro de
2007

Você também pode gostar