Erlang
Erlang es un lenguaje de programación concurrente (u orientado a la concurrencia) y un sistema de ejecución que incluye una máquina virtual (BEAM) y bibliotecas (OTP).[3]
Erlang | ||
---|---|---|
Desarrollador(es) | ||
Ericsson https://www.erlang.org/ | ||
Información general | ||
Extensiones comunes | .erl .hrl | |
Paradigma | multiparadigma: funcional, concurrente | |
Apareció en | 1986 | |
Diseñado por | Joe Armstrong Robert Virding Mike Williams | |
Última versión estable | OTP 24.2[1] (15 de diciembre de 2021) | |
Sistema de tipos | Dinámico, fuerte | |
Implementaciones | Erlang | |
Influido por | Prolog, Smalltalk | |
Ha influido a | F#, Clojure, Rust, Scala, Opa, Reia, Elixir | |
Licencia | Erlang Public License[2] (MPL modificada) | |
El subconjunto de programación secuencial de Erlang es un lenguaje funcional, con evaluación estricta, asignación única, y tipado dinámico. Fue diseñado en la compañía Ericsson para realizar aplicaciones distribuidas, tolerantes de fallos, soft-real-time y de funcionamiento ininterrumpido. Proporciona el cambio en caliente de código de forma que este se puede cambiar sin parar el sistema. Originalmente, Erlang era un lenguaje propietario de Ericsson, pero fue cedido como software de código abierto en 1998. La implementación de Ericsson es principalmente interpretada, pero también incluye un compilador HiPE (sólo soportado en algunas plataformas).
La creación, gestión y comunicación de procesos es sencilla en Erlang, mientras que en muchos lenguajes, los hilos se consideran un apartado complicado y propenso a errores. En Erlang toda concurrencia es explícita.
Erlang recibe el nombre de A. K. Erlang. A veces se piensa que el nombre es una abreviación de ERicsson LANGuage, debido a su uso intensivo en Ericsson. Según Bjarne Däcker -quien fue el jefe del Computer Science Lab en su día-, esta dualidad es intencional.
Características
Concurrente - Erlang tiene procesos extremadamente livianos cuyos requerimientos de memoria varían dinámicamente. Los procesos no tienen memoria compartida y se comunican vía mensajes asincrónicos. Soporta aplicaciones con una gran cantidad de procesos concurrentes.
Distribuido - Erlang está diseñado para correr en ambientes distribuidos. Una máquina virtual de Erlang es un nodo de Erlang. Un sistema distribuido de Erlang es una red de nodos (generalmente uno por procesador). Un nodo Erlang puede crear procesos paralelos ejecutando en otros nodos, lo cuales podrían utilizar otros sistemas operativos. Los procesos que residen en diferentes nodos se comunican exactamente de la misma forma que si estuviesen en un nodo local.
Robustez - Erlang posee varias primitivas de detección de errores las cuales sirven para estructurar sistemas con Tolerancia frente a fallos. Por ejemplo, los procesos pueden monitorear el estado y las actividades de otros procesos, aun si se ejecutan en otros nodos. Los procesos en un sistema distribuidos pueden configurarse para derivar en caso de falla a otros nodos y automáticamente migrar hacia los nodos que se han recuperado.
Soft real-time - Erlang soporta sistemas "soft" real-time, el cual requiere tiempo de respuesta del orden de los milisegundos. Las demoras introducidas por las largas operaciones del garbage collector son inaceptables, por eso Erlang utiliza técnicas incrementales en el proceso de garbage collection.
Actualización de código "en caliente" - Muchos sistemas no pueden detenerse para hacer mantenimiento de software. Erlang permite cambiar el código mientras el sistema esta ejecutando. El viejo código puede ser desafectado y reemplazado por el nuevo código. Durante la transición, el código nuevo y el viejo puede coexistir. Es posible instalar parches y evolutivos en un sistema funcionando sin pertubar la operación normal del sistema.
Carga de código incremental - Los usuarios pueden controlar en detalle como se carga el código. En sistemas embebidos, todo el código se carga al momento del arranque. En sistemas en desarrollo, el código se carga cuando es necesario, aun cuando el sistema está corriendo. Si al momento de pruebas se descubren bugs, solo el código con fallas será reemplazado.
Interfaces Externas - Los procesos Erlang se comunican con el mundo exterior utilizando el mismo mecanismo de envío de mensajes como los usados internamente entre procesos. Este mecanismo es utilizado para la comunicación con el sistema operativo y para interactuar con programas escritos en otros lenguajes. Si hubiesen requisitos particulares de eficiencia, existe una versión especial de este concepto para enlazar programas escritos por ejemplo en C dentro del runtime de Erlang.
Processes
Joe Armstrong, el coinventor de Erlang, sintetizó los principios de los procesos:[4]
- Todo es un proceso.
- Los procesos están aislados fuertemente.
- La creación y destrucción de los procesos es una operación muy liviana.
- El envío de mensajes es la única forma de interactuar con los procesos.
- Los procesos tienen nombres únicos.
- Si conoce el nombre de un proceso, entonces puede enviarle un mensaje.
- Los procesos no comparten recursos.
- El manejo de errores no es local.
- Los procesos hacen lo que se suponen que hacen o fallan.
Ejemplos de programación funcional
Cálculo del factorial:
-module(fact).
-export([fac/1]).
fac(0) -> 1;
fac(N) '''when''' N > 0 -> N * fac(N-1).
A continuación se mostrará la implementación del algoritmo Quicksort:
%% quicksort:qsort(List)
%% Ordena una lista de elementos
-module(quicksort).
-export([qsort/1]).
qsort ([]) -> [];
qsort([Pivot |Rest]) ->
qsort ([ X || X <- Rest, X < Pivot]) ++ [Pivot] ++ qsort ([ Y || Y <- Rest, Y >= Pivot]).
El ejemplo anterior llama recursivamente a la función qsort
hasta que no hay nada más para ordenar. La expresión [ X || X <- Rest, X < Pivot]
es lo que se conoce como una lista por comprensión, y se puede interpretar como: "Elige todo X
dónde X
es miembro de Rest
y X
es menor que Pivot
", resultando en un forma muy sencilla de manipular listas. ++
es el operador de concatenación de listas.
Se puede utilizar una función de comparación para definir formas más complejas de ordenar elementos.
El siguiente ejemplo ordenaría varias listas en función de su longitud:
-module(listsort).
-export([by_length/1]).
by_length(Lists) ->
F = fun(A,B) when is_list(A), is_list(B) ->
length(A) < length(B)
end,
qsort(Lists, F).
qsort([], _) -> [];
qsort([Pivot|Rest], Smaller) ->
qsort([ X || X <- Rest, Smaller(X, Pivot)], Smaller)
++ [Pivot] ++
qsort([ Y || Y <- Rest, not(Smaller(Y, Pivot))], Smaller).
Lenguaje orientado a concurrencia y distribución
La mayor fortaleza de Erlang es el soporte para la concurrencia. Tiene un pequeño pero potente conjunto de primitivas para crear procesos y comunicarlos. El modelo de procesos se basa en el modelo Comunicación de procesos secuenciales de C.A.R. Hoare. Dichos procesos son la forma principal de estructurar una aplicación, y se puede crear un gran número de ellos sin que se degrade el rendimiento (se ha llegado a hacer una prueba c).
El soporte para la programación distribuida es también parte de Erlang: los procesos se pueden crear tanto localmente como en nodos remotos, y la comunicación entre ellos se realiza de igual manera.
Ejemplos:
Pid = spawn(Mod, Func, Args) % ejecutar la función Func como un nuevo proceso
Pid = spawn(Node, Mod, Func, Args) % ejecutar la función Func en un nodo remoto
Pid ! a_message % enviar un mensaje al proceso (asíncronamente)
receive % recibir el mensaje enviado a este proceso
a_message -> do_something
end.
La principal forma de control de errores en Erlang también se basa en la concurrencia. Cuando un proceso se cuelga, termina limpiamente y envía un mensaje al proceso controlador quien puede actuar en consecuencia. Esta forma de control de errores puede incrementar la mantenibilidad y reducir la complejidad del código.
Distribución
Ericsson publicó Erlang con licencia abierta para asegurar su independencia de un único vendedor y para darlo a conocer de una forma más amplia. La distribución del lenguaje junto con las librerías y la base de datos de tiempo real (Mnesia) se denominan Open Telecom Platform (Plataforma abierta de Telecom), u OTP. Ericsson y otras empresas ofrecen soporte comercial para Erlang.
Desde su liberación en 1998, Erlang empezó a ser utilizado por varias compañías en todo el mundo, incluyendo Nortel y T-Mobile. De todas formas, Erlang todavía no es un lenguaje de programación muy extendido.
En la actualidad, Erlang continúa desarrollándose regularmente. Está disponible para diversos sistemas operativos de tipo Unix y Microsoft Windows.
Véase también
- ejabberd, un servidor de mensajes instantáneos XMPP (Jabber) escrito en Erlang.
- Wings 3D, Herramienta de modelado 3D en Erlang.
- Yet another web server (YAWS, un servidor de aplicaciones web muy completo en Erlang).
- Tsung, una herramienta de análisis de rendimiento muy potente.
- RabbitMQ, es un software de negociación de mensajes mediante colas de código abierto escrito en Erlang.
- CouchDB, base de datos NoSql documental escrita en Erlang.
Referencias
- https://www.erlang.org/news/152
- http://www.erlang.org/about.html
- Joe Armstrong, Bjarne Däcker, Thomas Lindgren, Håkan Millroth. «Open-source Erlang - White Paper». Archivado desde el original el 25 de octubre de 2011. Consultado el 31 de julio de 2011.
- http://erlang.org/download/armstrong_thesis_2003.pdf
Enlaces externos
Proyecto principal
Otros enlaces
- Libro en Castellano y Consultoría en España
- Servicios de formación y consultoría de Erlang
- portal con mucha información sobre Erlang: Howto, foros, wiki, FAQ,...
- Process-one (Empresa que ofrece soporte de Erlang)
- Una jungla de código Erlang
- Un agregador de news para Erlang
- Repositorio de artículos y trabajos sobre Erlang
- ESense - Completado de código tipo IntelliSense para Erlang sobre Emacs