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