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