Erlang es un lenguaje de programación funcional diseñado para construir sistemas escalables y tolerantes a fallos, particularmente en el ámbito de aplicaciones concurrentes y distribuidas. Fue desarrollado originalmente por Ericsson a finales de la década de 1980 para crear sistemas robustos de telecomunicaciones. Las características únicas de Erlang incluyen su soporte para procesos ligeros, concurrencia basada en el paso de mensajes, intercambio de código en caliente y un fuerte énfasis en la fiabilidad. Hoy en día, se utiliza ampliamente en industrias que requieren alta disponibilidad y sistemas distribuidos, como telecomunicaciones, aplicaciones de mensajería y sistemas de bases de datos.
Erlang fue creado a finales de la década de 1980 por Joe Armstrong, Robert Virding y Mike Williams en Ericsson, principalmente para abordar las necesidades de la industria de telecomunicaciones. El lenguaje fue desarrollado para facilitar la construcción de sistemas a gran escala y tolerantes a fallos que pudieran gestionar múltiples llamadas y conexiones simultáneamente.
A principios de la década de 1990, Ericsson reconoció el potencial de Erlang más allá de las telecomunicaciones. En 1998, Erlang fue liberado como código abierto, lo que permitió a una comunidad más amplia de desarrolladores contribuir a su crecimiento. El movimiento de código abierto llevó al desarrollo de la máquina virtual BEAM, que ejecuta código Erlang y que desde entonces ha evolucionado para soportar otros lenguajes.
Erlang es actualmente mantenido por el equipo de Erlang/OTP y cuenta con una comunidad dedicada. El ciclo de lanzamiento de Erlang se ha vuelto más consistente, con actualizaciones y mejoras regulares centradas en el rendimiento, nuevas características y documentación mejorada. El lenguaje también ha inspirado el desarrollo de Elixir, un lenguaje de programación moderno que se ejecuta en la máquina virtual de Erlang e incorpora muchos de sus principios mientras proporciona características adicionales.
Erlang es principalmente un lenguaje funcional, lo que significa que las funciones son ciudadanos de primera clase y pueden ser pasadas como variables.
double(X) -> X * 2.
Los procesos ligeros de Erlang permiten la creación de miles de procesos concurrentes sin un overhead significativo.
spawn(fun() -> io:format("¡Hola desde un proceso!~n") end).
Los procesos en Erlang se comunican utilizando el paso de mensajes, lo que permite una comunicación segura sin estado compartido.
Pid = spawn(fun() -> receive
{msg, Content} -> io:format("Recibido: ~s~n", [Content])
end end),
Pid ! {msg, "¡Hola!"}.
Erlang utiliza la coincidencia de patrones, una característica poderosa que permite un código claro y conciso.
match(X) when X > 0 -> io:format("Número positivo: ~B~n", [X]);
match(X) -> io:format("Número no positivo: ~B~n", [X]).
Erlang soporta la tolerancia a fallos a través de su filosofía de "dejar que falle", permitiendo que los procesos fallen y sean reiniciados sin afectar al sistema.
start_process() ->
spawn(fun() -> crash() end).
Erlang permite a los desarrolladores cambiar el código en sistemas en ejecución sin detenerlos.
%% Versión antigua
-module(example).
-export([hello/0]).
hello() -> io:format("Versión Antigua~n").
%% Nueva versión
-module(example).
-export([hello/0]).
hello() -> io:format("Nueva Versión~n").
Los datos en Erlang son inmutables, lo que conduce a menos errores y a un razonamiento más fácil sobre el código.
List = [1, 2, 3],
NewList = [4 | List].
Erlang tiene características que permiten la fácil distribución de procesos a través de diferentes nodos.
net_adm:start() ->
net_adm:ping('otro_nodo@hostname').
Erlang soporta tipos de registros para crear tipos de datos estructurados.
-record(person, {name, age}).
Person = #person{name="Alice", age=30}.
Erlang permite comprensiones de listas para generar y manipular listas de manera concisa.
Squares = [X*X || X <- [1,2,3]].
Erlang se ejecuta en la máquina virtual BEAM, que está diseñada para ejecutar aplicaciones concurrentes y tolerantes a fallos. BEAM optimiza el rendimiento y permite características como el intercambio de código en caliente.
Existen varios entornos de desarrollo para Erlang, siendo Emacs e IntelliJ IDEA (con el plugin de Erlang) algunos de los más populares. Otras herramientas notables incluyen editores específicos de Erlang como Erlide.
Para crear un proyecto en Erlang, tradicionalmente se utiliza la herramienta rebar3
, que gestiona dependencias y construcciones. Por ejemplo, para crear un nuevo proyecto, se ejecutaría:
rebar3 new app myapp
Luego, se puede construir el proyecto con:
rebar3 compile
Erlang se utiliza ampliamente en telecomunicaciones, sistemas de mensajería y aplicaciones en tiempo real. Aplicaciones notables incluyen:
Las principales fortalezas de Erlang residen en su modelo de concurrencia y tolerancia a fallos, lo que lo distingue de lenguajes como:
Traducir código hacia y desde Erlang puede ser complejo debido a sus paradigmas únicos. Existen herramientas como erl2cpp
para ciertas traducciones, pero no hay una herramienta automatizada generalizada para todos los lenguajes. La traducción manual puede implicar: