Download - Panorámica del lenguaje de programación Erlanggpd.sip.ucm.es/charlas/20110511ClaraBenac/benacSld.pdf · Panorámica del lenguaje de programación Erlang Clara Benac Earle Grupo

Transcript

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 13

Garantias de la comunicación

Q

QM2 M1P

PM2, M1

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 21

Patrones de diseño

Supervisor

W5W1 W2

S3

W3 W4

S1

S2

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:

[email protected]