end - GPD

Transcripción

end - GPD
Panorámica del
lenguaje de
programación
Erlang
Clara Benac Earle
Grupo Babel
Madrid, 11 de mayo de 2011
Introducción
●
Creado en 1983 en el CSLab de Ericsson
●
Open source http://www.erlang.org
●
Ericsson lo usó en un switch ATM (2 millones de líneas de código
Erlang). Otras empresas que usan Erlang en alguno se sus productos:
Facebook,
Couchbase,
Amazon,
Yahoo...
En
España
Tuenti,
LambdaStream...
●
Erlang Workshop, Erlang User Conference, Erlang Factory...
●
Proyecto del FP7 STREP Property-based Testing (ProTest) www.protestproject.eu
11/05/2011
2
Características principales de Erlang
11/05/2011
●
Lenguaje funcional
●
Concurrencia
●
Soft real-time
●
Robustez
●
Computación distribuida
3
Erlang/OTP
Open Telecom Platform
Patrones de diseño (gen_server, supervisor,
fsm...)
●
Aplicaciones (DB distribuida, Servidor web,
etc...)
●
11/05/2011
4
Erlang básico
●
integers (2), floats (2.3), atoms (hola), tuples ({2,hola}) y
listas ([2,hola]), records (#process{label=hola}), bit strings
(<<1:1,0:1>>)
●
Evaluación impaciente
●
Paso de parámetros por valor
●
Variables sólo se asignan una vez (como Prolog)
●
Sistema de tipos dinámico
11/05/2011
5
Ejemplos de código secuencial (I)
factorial(0) → 1;
factorial(N) → N * factorial(N-1).
factorial(0) → 1;
factorial(N) → “ucm” * factorial(N-1).
¿qué pasa con factorial(0.5)?
11/05/2011
6
Ejemplos de código secuencial (II)
factorial(0) → 1;
factorial(N) when N>0 → N * factorial(N-1).
¿qué pasa con factorial(0.5)?
11/05/2011
7
Ejemplos de código secuencial (III)
convert_to_c({Name, {f, Temp}}) ->
{Name, {c, trunc((Temp - 32) * 5 / 9)}}.
1>lists:map(fun convert_to_c/1, [{“Madrid”,{f,80}},
{“Estocolmo”,{f,40}}]).
[{"Madrid",{c,26}},{"Estocolmo",{c,4}}]
11/05/2011
8
Programación concurrente
●
Procesos ligeros
●
No compartición de memoria
●
Paso de mensajes asíncrono
●
Bien adaptado a arquitecturas
multicore
11/05/2011
9
Primitivas concurrentes (I)
●
Crear processos Pid = spawn(Fun)
●
Mandar un mensaje Pid ! Message
El mensaje es puesto en el buzón del receptor (fifo)
Pid
11/05/2011
10
Primitivas concurrentes (II)
Recibir un mensaje
receive
P1 [when Guard1]→ Exp1;
P2 [when Guard2]→ Exp2
…
end
11/05/2011
Pid
11
Ejemplos con receive
receive
{inc,X} -> X+1;
Other -> error
end
¿qué pasa si el buzón contiene a · {inc, 5} ?
¿y si contiene a · {inc, 5} · b?
receive
{inc,X} -> X+1
end
¿qué pasa si el buzón contiene a · {inc, 5} · b?
¿y si contiene a · b?
11/05/2011
12
Garantias de la comunicación
M2, M1
P
P
11/05/2011
Q
M2
M1
Q
13
Garantías de la comunicación
Pero puede ocurrir lo siguiente:
Q ! hola
P
Q
R ! mundo
loop() ->
receive
X → io:format(X)
end,
loop().
Q ! mundo
R
11/05/2011
14
Ejemplo código concurrente
facserver() ->
receive
{request, N, Pid}
when is_integer(N), N>0, pid(Pid) ->
spawn(fun () -> Pid!(fac(N)) end),
facserver()
end.
1> X = spawn(fun facserver,[]).
<0.33.0>
2> X!{request,4,self()}, receive Y -> Y end.
24
11/05/2011
15
Detección y recuperación de errores
●
Las excepciones se generan en tiempo de ejecución debido a
errores de tipos (10*”hola”), error en el pattern matching...
●
Las excepciones causadas por una expresión e se pueden
recuperar usando el constructor try e catch m end
●
Ejemplo:
try
g(Y)
catch
Error → 0
end
11/05/2011
16
Tolerancia a fallos
Pero no es suficiente
Los procesos pueden morirse porque:
●
●
●
No tienen suficiente memoria
La máquina se rompe
La red que comunica dos procesos se cae
Además, muchos productos tiene requisitos muy
fuertes (funcionando 24/7). En el caso del switch
ATM de Ericsson 31ms al año máximo periodo de
inactividad
11/05/2011
17
Tolerancia a fallos para los procesos
Enlaces bidireccionales (link(Pid)) entre
procesos
11/05/2011
18
Tolerancia a fallos para los procesos
Si hay un error en un proceso éste al morir
manda un mensaje especial (exit signal,
exit(Reason)) a todos los procesos a los que
está enlazado que mueren a su vez
11/05/2011
19
Tolerancia a fallos para los procesos
Los procesos pueden atrapar estos mensajes
y entonces no mueren
(process_flag(trap_exit,true))
11/05/2011
20
Patrones de diseño
Supervisor
S1
S2
W1
11/05/2011
S3
W2
W3
W4
W5
21
Computación distribuida
Los procesos Erlang corren en nodos (un
runtime system en cada nodo) dentro de
una red
●
El paso de mensajes y los enlaces entre
procesos que están en distintos nodos es
transparente
●
11/05/2011
22
Herramientas
Testing: Erlang Quickcheck
●
Refactoring: Wrangler
●
Model checking: McErlang
●
Análisis estático: Dialyzer
●
11/05/2011
23
Conclusiones
Hoy hemos hecho un repaso a las
características principales de Erlang
●
Erlang es un lenguaje funcional orientado a
concurrencia, distribución y tolerancia a
fallos
●
Erlang está siendo usado en algunas
empresas para desarrollar sus productos
●
11/05/2011
24
Más información
●
www.erlang.org
●
Erlang programming, Francesco Cesarini and Simon
Thompson (O'Reilly)
●
Programming Erlang, Joe Armstrong (The Pragmatic
Programmers)
Lista de correos de gente interesada en Erlang en
Madrid:
[email protected]
11/05/2011
25

Documentos relacionados