Erlang

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 R19.1[1] ( 21 de septiembre de 2016)
Última versión en pruebas R19.0-rc1[2] ( 12 de mayo de 2016)
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[3] ( MPL modificada)
[ editar datos en Wikidata]
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).[4]

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

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).
Other Languages
العربية: إرلانج
български: Erlang
català: Erlang
Ελληνικά: Erlang
eesti: Erlang
فارسی: ارلنگ
français: Erlang (langage)
galego: Erlang
日本語: Erlang
ქართული: ერლანგი
한국어: 얼랭
русский: Erlang
slovenščina: Erlang
тоҷикӣ: Erlang
українська: Erlang
中文: Erlang