Panorámica del lenguaje de programación Erlang
Clara Benac EarleGrupo Babel
Madrid, 11 de mayo de 2011
11/05/2011 2
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.protest-
project.eu
11/05/2011 3
Características principales de Erlang
● Lenguaje funcional
● Concurrencia
● Soft real-time
● Robustez
● Computación distribuida
11/05/2011 4
Erlang/OTP
Open Telecom Platform
● Patrones de diseño (gen_server, supervisor, fsm...)
● Aplicaciones (DB distribuida, Servidor web, etc...)
11/05/2011 5
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 6
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 7
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 8
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 9
Programación concurrente
● Procesos ligeros
● No compartición de memoria
● Paso de mensajes asíncrono
● Bien adaptado a arquitecturas
multicore
11/05/2011 10
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 11
Primitivas concurrentes (II)
Recibir un mensaje
receive
P1 [when Guard1]→ Exp1;
P2 [when Guard2]→ Exp2
…
end Pid
11/05/2011 12
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 14
Garantías de la comunicación
Pero puede ocurrir lo siguiente:
P
R
QQ ! hola
R ! mundo Q ! mundo
loop() ->receive
X → io:format(X)end,loop().
11/05/2011 15
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 16
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 → 0end
11/05/2011 17
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 18
Tolerancia a fallos para los procesos
Enlaces bidireccionales (link(Pid)) entre procesos
11/05/2011 19
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 20
Tolerancia a fallos para los procesos
Los procesos pueden atrapar estos mensajes y entonces no mueren (process_flag(trap_exit,true))
11/05/2011 22
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 23
Herramientas
● Testing: Erlang Quickcheck ● Refactoring: Wrangler● Model checking: McErlang● Análisis estático: Dialyzer
11/05/2011 24
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 25
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: