Panorámica del lenguaje de programación...

25
Panorámica del lenguaje de programación Erlang Clara Benac Earle Grupo Babel Madrid, 11 de mayo de 2011

Transcript of Panorámica del lenguaje de programación...

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]