SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
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++, 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
¿Qué es Erlang?
¿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
¿Quién usa Erlang?
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
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
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 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.
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.
-- Bjarne Stroustrup

Ejemplo típico del factorial
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;
}
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);
}
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.
-- Bjarne Stroustrup

Ejemplo típico del factorial (Erlang)

factorial(0) -> 0;
factorial(1) -> 1;
factorial(N) -> N * factorial(N-1).
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.
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...
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).
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]
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
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
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]
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
-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).
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!

Weitere ähnliche Inhalte

Ähnlich wie Erlang/OTP - Altenwald - CodeMotion Madrid 2013

Introducción a Google Go
Introducción a Google GoIntroducción a Google Go
Introducción a Google GoScalia
 
Lo que las empresas piden
Lo que las empresas pidenLo que las empresas piden
Lo que las empresas pidenSvet Ivantchev
 
Esos Raros Lenguajes Nuevos
Esos Raros Lenguajes NuevosEsos Raros Lenguajes Nuevos
Esos Raros Lenguajes NuevosEduardo Diaz
 
Sesion1_Ciencia_de_Datos-Introduccion a Pithon.pdf
Sesion1_Ciencia_de_Datos-Introduccion a Pithon.pdfSesion1_Ciencia_de_Datos-Introduccion a Pithon.pdf
Sesion1_Ciencia_de_Datos-Introduccion a Pithon.pdfMarxx4
 
8 herramientas de procesos de string
8  herramientas de procesos de string8  herramientas de procesos de string
8 herramientas de procesos de stringyimfer1
 
8 herramientas de procesos de string
8  herramientas de procesos de string8  herramientas de procesos de string
8 herramientas de procesos de stringcyberleon95
 
8 herramientas de procesos de string
8  herramientas de procesos de string8  herramientas de procesos de string
8 herramientas de procesos de stringJuan Camilo
 
Rust Hour Of Code 2017 - Valladolid
Rust Hour Of Code 2017 - ValladolidRust Hour Of Code 2017 - Valladolid
Rust Hour Of Code 2017 - ValladolidAdrián Arroyo Calle
 
Chuleta de lenguaje C para principiantes
Chuleta de lenguaje C para principiantesChuleta de lenguaje C para principiantes
Chuleta de lenguaje C para principiantesAbrirllave
 
9. LIBRO SISTEMAS SECUENCIALES PROGRAMABLES - AUTOMATI EMERSON EDUARDO RODRIGUES
9. LIBRO SISTEMAS SECUENCIALES PROGRAMABLES - AUTOMATI EMERSON EDUARDO RODRIGUES9. LIBRO SISTEMAS SECUENCIALES PROGRAMABLES - AUTOMATI EMERSON EDUARDO RODRIGUES
9. LIBRO SISTEMAS SECUENCIALES PROGRAMABLES - AUTOMATI EMERSON EDUARDO RODRIGUESEMERSON EDUARDO RODRIGUES
 

Ähnlich wie Erlang/OTP - Altenwald - CodeMotion Madrid 2013 (20)

Introducción a Google Go
Introducción a Google GoIntroducción a Google Go
Introducción a Google Go
 
Lo que las empresas piden
Lo que las empresas pidenLo que las empresas piden
Lo que las empresas piden
 
Esos Raros Lenguajes Nuevos
Esos Raros Lenguajes NuevosEsos Raros Lenguajes Nuevos
Esos Raros Lenguajes Nuevos
 
El Lenguaje de Programacipon java.
El Lenguaje de Programacipon java.El Lenguaje de Programacipon java.
El Lenguaje de Programacipon java.
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
 
Sesion1_Ciencia_de_Datos-Introduccion a Pithon.pdf
Sesion1_Ciencia_de_Datos-Introduccion a Pithon.pdfSesion1_Ciencia_de_Datos-Introduccion a Pithon.pdf
Sesion1_Ciencia_de_Datos-Introduccion a Pithon.pdf
 
8 herramientas de procesos de string
8  herramientas de procesos de string8  herramientas de procesos de string
8 herramientas de procesos de string
 
8 herramientas de procesos de string
8  herramientas de procesos de string8  herramientas de procesos de string
8 herramientas de procesos de string
 
8 herramientas de procesos de string
8  herramientas de procesos de string8  herramientas de procesos de string
8 herramientas de procesos de string
 
codigos
codigoscodigos
codigos
 
Rust Hour Of Code 2017 - Valladolid
Rust Hour Of Code 2017 - ValladolidRust Hour Of Code 2017 - Valladolid
Rust Hour Of Code 2017 - Valladolid
 
Introduccion a Python. Clase 1
Introduccion a Python. Clase 1Introduccion a Python. Clase 1
Introduccion a Python. Clase 1
 
Curso prog sist
Curso prog sistCurso prog sist
Curso prog sist
 
(1) Curso sobre el software estadístico R. Introducción al entorno R
(1) Curso sobre el software estadístico R. Introducción al entorno R(1) Curso sobre el software estadístico R. Introducción al entorno R
(1) Curso sobre el software estadístico R. Introducción al entorno R
 
Chuleta de lenguaje C para principiantes
Chuleta de lenguaje C para principiantesChuleta de lenguaje C para principiantes
Chuleta de lenguaje C para principiantes
 
Bt haskell-1
Bt haskell-1Bt haskell-1
Bt haskell-1
 
9. LIBRO SISTEMAS SECUENCIALES PROGRAMABLES - AUTOMATI EMERSON EDUARDO RODRIGUES
9. LIBRO SISTEMAS SECUENCIALES PROGRAMABLES - AUTOMATI EMERSON EDUARDO RODRIGUES9. LIBRO SISTEMAS SECUENCIALES PROGRAMABLES - AUTOMATI EMERSON EDUARDO RODRIGUES
9. LIBRO SISTEMAS SECUENCIALES PROGRAMABLES - AUTOMATI EMERSON EDUARDO RODRIGUES
 
Introducción a dr racket
Introducción a dr racketIntroducción a dr racket
Introducción a dr racket
 
Introduccion clips
Introduccion clipsIntroduccion clips
Introduccion clips
 
Programación de código
Programación de códigoProgramación de código
Programación de código
 

Kürzlich hochgeladen

Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 

Kürzlich hochgeladen (10)

Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 

Erlang/OTP - Altenwald - CodeMotion Madrid 2013

  • 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
  • 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
  • 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. 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
  • 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. OOP vs Actor Model
  • 11. OOP vs Actor Model
  • 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. 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. 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); }
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. -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).
  • 28. Libro en castellano Descarga PDF gratuita Compra en Papel http://erlang.bosqueviejo.net
  • 30. Agradecimientos ○ Organización de CodeMotion ○ Universidad Politécnica de Madrid ○ ¡A todos vosotros por asistir!