0
Erlang/OTP
Un Mundo Concurrente
Manuel Ángel Rubio Jiménez
¿Quién soy?
○

Programador desde los 12 años... unos 20 años programando en: Perl,
Python, Ruby, PHP, Java, C/C++, JavaScr...
¿Qué es Erlang?
¿Qué es Erlang?
○

Nació en 1986 como una extensión de Prolog en los laboratorios Ericsson.

○

Lenguaje
○ ¿Funcional o no...
¿Quién usa Erlang?
Caso
○

En 2005, sistemas C++ y MySQL
○
○

○

Máx. 80 usuarios concurrentes
Crashes son muy frecuentes

En 2006, sistemas ...
Caso
○

En 2005, sistemas C++ y MySQL
○
○

○

Máx. 80 usuarios concurrentes
Crashes son muy frecuentes

En 2006, sistemas ...
Caso
Progresión Informática
○

Carrera de los Hertzios vs Cores
Cuando estás en un atasco de tráfico con un Porsche, todo lo qu...
OOP vs Actor Model
OOP vs Actor Model
Apache vs Yaws
Sintaxis de Erlang
Solo hay dos tipos de lenguajes:
aquellos de los que la gente se queja y
aquellos que nadie usa.
-- Bja...
Sintaxis de Erlang
Solo hay dos tipos de lenguajes:
aquellos de los que la gente se queja y
aquellos que nadie usa.
-- Bja...
Sintaxis de Erlang
Solo hay dos tipos de lenguajes:
aquellos de los que la gente se queja y
aquellos que nadie usa.
-- Bja...
Sintaxis de Erlang
Sintaxis de Erlang
Solo hay dos tipos de lenguajes:
aquellos de los que la gente se queja y
aquellos que nadie usa.
-- Bja...
Características del Lenguaje
○

Asignaciones únicas
> A = 1.
1
> A = 2.
** exception error: no match of right hand side va...
Características del Lenguaje
○

Capacidad numérica

1> fact:fact(128).
385620482362580421735677065923463640617493109590223...
Características del Lenguaje
○

Matching
> "Hola " ++ Quien = "Hola mundo!".
"Hola mundo!"
> Quien.
"mundo!"

○

Conjuntos...
Características del Lenguaje
○

Listas de Comprensión
> [ X || X <- lists:seq(1,10), X rem 2 =:= 0 ].
[2,4,6,8,10]
> [ {X,...
Recursividad
2

-module(mergesort).

5

1

3

4

0

-export([ordena/1]).

2

ordena([]) -> [];

5

1

3

5

1

4

0

3

or...
Recursividad
2

-module(quicksort).

5

1

3

4

0

-export([ordena/1]).

1

ordena([]) -> [];

0

2

5

3

4

3

4

5

or...
Distribución
○

Conectando nodos
$ erl -sname bosqueviejo
Erlang R15B02 (erts-5.9.2) [64-bit] [smp:8:8] [async-threads:0] ...
Comportamientos - OTP
App

○

gen_server: servidores genéricos, actores base.

○

gen_fsm: máquinas de estados finitos.

○...
-module(ascensor).
-behaviour(gen_fsm).
-compile([export_all]). % para simplificar, cambiar por -export().

Ejemplo
Finite...
Libros en inglés
Libro en castellano
Descarga PDF gratuita

Compra en Papel

http://erlang.bosqueviejo.net
¿Preguntas?
Agradecimientos

○ Organización de CodeMotion
○ Universidad Politécnica de Madrid
○ ¡A todos vosotros por asistir!
Upcoming SlideShare
Loading in...5
×

Erlang/OTP - Altenwald - CodeMotion Madrid 2013

779

Published on

Erlang/OTP: Un Mundo Concurrente, charla dada el 19 de octubre de 2013 a las 15:15h en el Track Programming de CodeMotion 2013 de Madrid. La charla hace un repaso de la base del Lenguaje Erlang, el framework OTP y las ventajas que ofrece su plataforma.

http://altenwald.org/2013/10/21/codemotion-2013/

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
779
On Slideshare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
11
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "Erlang/OTP - Altenwald - CodeMotion Madrid 2013"

  1. 1. Erlang/OTP Un Mundo Concurrente Manuel Ángel Rubio Jiménez
  2. 2. ¿Quién soy? ○ Programador desde los 12 años... unos 20 años programando en: Perl, Python, Ruby, PHP, Java, C/C++, JavaScript, Pascal, Modula-2, Basic y Erlang. ○ Administrador de sistemas desde los 22 años... unos 10 años administrando Windows, GNU/Linux y BSD. ○ En definitiva... DevOps. ○ Fundador de Altenwald y Freelance. ○ Contacto: ○ Blog: http://bosqueviejo.net ○ Twitter: @MRonErlang
  3. 3. ¿Qué es Erlang?
  4. 4. ¿Qué es Erlang? ○ Nació en 1986 como una extensión de Prolog en los laboratorios Ericsson. ○ Lenguaje ○ ¿Funcional o no? ... mejor híbrido. ○ Orientado a la Concurrencia... Modelo Actor ○ Máquina Virtual o Plataforma ○ Gestión y Planificador de Procesos (soporta más de 1.000.000 procs) ○ Gestor de Memoria ○ Intérprete de comandos (shell) ○ Interfaz transparente para comunicación entre nodos ○ Características ○ Distribuido ○ Tolerante a fallos ○ Escalable ○ Cambio de código en caliente
  5. 5. ¿Quién usa Erlang?
  6. 6. Caso ○ En 2005, sistemas C++ y MySQL ○ ○ ○ Máx. 80 usuarios concurrentes Crashes son muy frecuentes En 2006, sistemas C++, Python y MySQL ○ Máx. 1.000 usuarios concurrentes ○ Requiere reinicios, el código es difícil de mantener... muchos errores
  7. 7. Caso ○ En 2005, sistemas C++ y MySQL ○ ○ ○ Máx. 80 usuarios concurrentes Crashes son muy frecuentes En 2006, sistemas C++, Python y MySQL ○ ○ ○ Máx. 1.000 usuarios concurrentes Requiere reinicios, el código es difícil de mantener... muchos errores En 2007, sistemas Erlang, Python y MySQL ○ ○ ○ De 20.000 a 1.000.000 de usuarios concurrentes en De 500 a 50.000 peticiones por segundo De 50 a 1.850 servidores
  8. 8. Caso
  9. 9. Progresión Informática ○ Carrera de los Hertzios vs Cores Cuando estás en un atasco de tráfico con un Porsche, todo lo que puedes hacer es consumir más combustible que el resto estando parado. La escalabilidad va de construir carreteras más anchas, no coches más rápidos. -- Steve Swartz ○ Programación Orientada a Objetos se atribuye a Alan Kay (Smalltalk) ○ Modelo Actor se atribuye a Carl Hewitt por un estudio de 1977.
  10. 10. OOP vs Actor Model
  11. 11. OOP vs Actor Model
  12. 12. Apache vs Yaws
  13. 13. Sintaxis de Erlang Solo hay dos tipos de lenguajes: aquellos de los que la gente se queja y aquellos que nadie usa. -- Bjarne Stroustrup Ejemplo típico del factorial
  14. 14. Sintaxis de Erlang Solo hay dos tipos de lenguajes: aquellos de los que la gente se queja y aquellos que nadie usa. -- Bjarne Stroustrup Ejemplo típico del factorial (C) factorial(int f) { int i; for (i=f-1; i>1; i--) { f *= i; } return f; }
  15. 15. Sintaxis de Erlang Solo hay dos tipos de lenguajes: aquellos de los que la gente se queja y aquellos que nadie usa. -- Bjarne Stroustrup Ejemplo típico del factorial (C recursivo) factorial(int f) { if (f <= 1) { return f; } return f * factorial(f-1); }
  16. 16. Sintaxis de Erlang
  17. 17. Sintaxis de Erlang Solo hay dos tipos de lenguajes: aquellos de los que la gente se queja y aquellos que nadie usa. -- Bjarne Stroustrup Ejemplo típico del factorial (Erlang) factorial(0) -> 0; factorial(1) -> 1; factorial(N) -> N * factorial(N-1).
  18. 18. Características del Lenguaje ○ Asignaciones únicas > A = 1. 1 > A = 2. ** exception error: no match of right hand side value 2 ○ Lenguaje simple: case, if, try...catch y receive. case Value of 12 when is_integer(Value) -> "OK"; _ -> "FAIL"; end. ○ Paso de mensajes Pid = spawn(fun micode/0), Pid ! "hola mundo!", receive Any -> io:format("OK") end.
  19. 19. Características del Lenguaje ○ Capacidad numérica 1> fact:fact(128). 3856204823625804217356770659234636406174931095902235902788284032763734025751655435606 8616858850736153403005183305891634759217293226249885776611495524503935776003464470927 9247692495585280000000000000000000000000000000 2> fact:fact(1024). 5418528796058857283076921944683854738001553963538013444482870270683210612073376603733 1409841362145867190791884570898075393199416577018736826045413333372193910836752801276 4993769768292516937891165755680659663747947314518404886677672556125188694335251213677 2745219634307701337132057962484331288700884361716546902375183904529447322778084029321 5872206185380616280606392543531082218684823928713026169091421136225114468471388858788 1629252104046295315949943900357882410243934315037444113890806181406210863953275235375 8850185984515822295996545585412427891309024869442986109231533075791316757451464363040 2489082044290773456182736903050225279692655307296737099075874779312763510470246988966 7961462133026237158973227857814631807156427767644064591085076564783456324457736853810 3369817760804987077670463942726053414167791256977333745680374751866762659616656158846 8145026333704252266414186215704682568477336094432673749367667491509895376811294583162 6643856479027816385730291542667725665642276826058264393884514911976419675509290208592 7131563629832909894410527321251872495275013140716764055169361907818212367019122957673 6311705412658992991648200851578175195546691090283872923222450990638863814777125522778 2631322385756948819393658889908993670874516860653098...
  20. 20. Características del Lenguaje ○ Matching > "Hola " ++ Quien = "Hola mundo!". "Hola mundo!" > Quien. "mundo!" ○ Conjuntos > A = [1,2,3,4,5], B = [2,4,6], A -- B. [1,3,5] > (A -- B) ++ (B -- A). [1,3,5,6] ○ Binarios {ok, PNG} = file:open("debian-logo.png", [read,binary]), {ok, <<137,"PNG",13,10,26,10,Length:32,"IHDR">>} = file:read(PNG, 16), {ok, <<Width:32, Height:32, Depth:8, Color:8>>} = file:read(PNG, 10), {ok, <<Compression:8, Filter:8, Interlace:8>>} = file:read(PNG, 3), file:close(PNG).
  21. 21. Características del Lenguaje ○ Listas de Comprensión > [ X || X <- lists:seq(1,10), X rem 2 =:= 0 ]. [2,4,6,8,10] > [ {X,2,X*2} || X <- lists:seq(1,10) ]. [{1,2,2}, {2,2,4}, {3,2,6}, {4,2,8}, {5,2,10}, {6,2,12}, {7,2,14}, {8,2,16}, {9,2,18}, {10,2,20}] > [ X || X <- [1,5,9,3,2,6,5,4], X >= 5 ]. [5,9,6,5]
  22. 22. Recursividad 2 -module(mergesort). 5 1 3 4 0 -export([ordena/1]). 2 ordena([]) -> []; 5 1 3 5 1 4 0 3 ordena([H]) -> [H]; ordena(L) -> {L1,L2} = separa(L), 2 4 0 mezcla(ordena(L1), ordena(L2)). separa(L) -> 5 1 4 0 lists:split(length(L) div 2, L). 1 mezcla([], L) -> L; 0 5 4 mezcla(L, []) -> L; mezcla([H1|T1], [H2|_]=L2) when H1 =< H2 -> [H1|mezcla(T1,L2)]; 1 2 5 0 3 4 5 mezcla(L1, [H2|T2]) -> [H2|mezcla(L1,T2)]. 0 1 2 3 4
  23. 23. Recursividad 2 -module(quicksort). 5 1 3 4 0 -export([ordena/1]). 1 ordena([]) -> []; 0 2 5 3 4 3 4 5 ordena([H]) -> [H]; ordena(L) -> {L1, [Pivote], L2} = separa(L), 0 1 2 mezcla(ordena(L1) ++ [Pivote], ordena(L2)). separa([]) -> {[], [], []}; 0 1 3 4 5 separa([H]) -> {[H], [], []}; separa([Pivote|T]) -> 4 ListaMenores = [ X || X <- T, X =< Pivote ], ListaMayores = [ X || X <- T, X > Pivote ], {ListaMenores, [Pivote], ListaMayores}. mezcla(L1, L2) -> L1 ++ L2. 0 1 2 3 4 5 5
  24. 24. Distribución ○ Conectando nodos $ erl -sname bosqueviejo Erlang R15B02 (erts-5.9.2) [64-bit] [smp:8:8] [async-threads:0] [hipe] Eshell V5.9.2 (abort with ^G) (bosqueviejo@bosque)1> $ erl -sname bosquenegro Erlang R15B02 (erts-5.9.2) [64-bit] [smp:8:8] [async-threads:0] [hipe] Eshell V5.9.2 (abort with ^G) (bosquenegro@bosque)1> net_kernel:connect_node(bosqueviejo@bosque). true (bosquenegro@bosque)2> nodes(). [bosqueviejo@bosque] (bosqueviejo@bosque)1> nodes(). [bosquenegro@bosque]
  25. 25. Comportamientos - OTP App ○ gen_server: servidores genéricos, actores base. ○ gen_fsm: máquinas de estados finitos. ○ gen_event: manejadores de eventos. ○ supervisor: supervisión de procesos. ○ application: estructura de aplicación. Sup Sup Srv Srv FSM
  26. 26. -module(ascensor). -behaviour(gen_fsm). -compile([export_all]). % para simplificar, cambiar por -export(). Ejemplo Finite State Machine start_link() -> gen_fsm:start_link({local, ?MODULE}, ?MODULE, [], []). init([]) -> {ok, planta_baja, []}. planta_baja(bajar, State) -> io:format("Beeep!, opcion incorrecta~n", []), {next_state, planta_baja, State}; planta_baja(subir, State) -> io:format("Subiendo a la planta primera~n", []), {next_state, planta_primera, State}. planta_primera(bajar, State) -> io:format("Bajando a la planta baja~n", []), {next_state, planta_baja, State}; planta_primera(subir, State) -> io:format("Subiendo a la planta segunda~n", []), {next_state, planta_segunda, State}. planta_segunda(bajar, State) -> io:format("Bajando a la planta primera~n", []), {next_state, planta_primera, State}; planta_segunda(subir, State) -> io:format("Beeep!, opcion incorrecta~n", []), {next_state, planta_segunda, State}. % agregamos funciones para facilitar las llamadas % estas son opcionales: boton_subir() -> gen_fsm:send_event(?MODULE, subir). boton_bajar() -> gen_fsm:send_event(?MODULE, bajar).
  27. 27. Libros en inglés
  28. 28. Libro en castellano Descarga PDF gratuita Compra en Papel http://erlang.bosqueviejo.net
  29. 29. ¿Preguntas?
  30. 30. Agradecimientos ○ Organización de CodeMotion ○ Universidad Politécnica de Madrid ○ ¡A todos vosotros por asistir!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×