Erlang

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda
Erlang
Erlang logo.png
Desarrollador(es)
Ericsson
www.erlang.org
Información general
Extensiones comunes .erl .hrl
Paradigma multiparadigma: funcional, concurrente
Apareció en 1986
Diseñado por Joe Armstrong
Última versión estable R17.0[1] (09 de abril de 2014)
Tipo de dato 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 paquete de software LYME se basa en Erlang y ofrece una alternativa a LAMP

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]

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 a fallos, soft-real-time y de funcionamiento ininterrumpido. Proporciona el cambio en caliente de código de forma que éste 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.

Ejemplos de programación funcional[editar]

Cálculo del factorial:

-module(fact).
-export([fac/1]).
 
 fac(0) -> 1;
 fac(N) '''when''' N > 0 -> N * fac(N-1).

A continuación una 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[editar]

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 con 20 millones de procesos [1]).

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[editar]

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 fecha actual (2010), Erlang continúa desarrollándose regularmente. Está disponible para diversos sistemas operativos de tipo Unix y Microsoft Windows.

Véase también[editar]

  • ejabberd, un servidor de mensajes instantáneos XMPP 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.

Referencias[editar]

  1. http://www.erlang.org/news/73
  2. http://www.erlang.org/about.html
  3. Joe Armstrong, Bjarne Däcker, Thomas Lindgren, Håkan Millroth. «Open-source Erlang - White Paper». Consultado el 31 de julio de 2011.

Enlaces externos[editar]

Proyecto principal[editar]

Otros enlaces[editar]