Erlang est un langage de programmation fonctionnel conçu pour construire des systèmes évolutifs et tolérants aux pannes, en particulier dans le domaine des applications concurrentes et distribuées. Il a été développé à l'origine par Ericsson à la fin des années 1980 pour créer des systèmes de télécommunications robustes. Les caractéristiques uniques d'Erlang incluent son support pour les processus légers, la concurrence par passage de messages, l'échange de code à chaud, et une forte emphase sur la fiabilité. Aujourd'hui, il est largement utilisé dans des secteurs nécessitant une haute disponibilité et des systèmes distribués, tels que les télécommunications, les applications de messagerie et les systèmes de bases de données.
Erlang a été créé à la fin des années 1980 par Joe Armstrong, Robert Virding et Mike Williams chez Ericsson, principalement pour répondre aux besoins de l'industrie des télécommunications. Le langage a été développé pour faciliter la construction de systèmes à grande échelle, tolérants aux pannes, capables de gérer plusieurs appels et connexions simultanément.
Au début des années 1990, Ericsson a reconnu le potentiel d'Erlang au-delà des télécommunications. En 1998, Erlang a été publié en open source, ce qui a permis à une communauté plus large de développeurs de contribuer à sa croissance. Le mouvement open source a conduit au développement de la machine virtuelle BEAM, qui exécute le code Erlang et a depuis évolué pour supporter d'autres langages.
Erlang est actuellement maintenu par l'équipe Erlang/OTP et dispose d'une communauté dédiée. Le cycle de publication d'Erlang est devenu plus cohérent, avec des mises à jour et des améliorations régulières axées sur la performance, de nouvelles fonctionnalités et une documentation améliorée. Le langage a également inspiré le développement d'Elixir, un langage de programmation moderne qui s'exécute sur la VM Erlang et incorpore de nombreux principes d'Erlang tout en offrant des fonctionnalités supplémentaires.
Erlang est principalement un langage fonctionnel, ce qui signifie que les fonctions sont des citoyens de première classe et peuvent être passées comme des variables.
double(X) -> X * 2.
Les processus légers d'Erlang permettent la création de milliers de processus concurrents sans surcharge significative.
spawn(fun() -> io:format("Bonjour depuis un processus !~n") end).
Les processus en Erlang communiquent par passage de messages, ce qui permet une communication sécurisée sans état partagé.
Pid = spawn(fun() -> receive
{msg, Content} -> io:format("Reçu : ~s~n", [Content])
end end),
Pid ! {msg, "Bonjour !"}.
Erlang utilise la correspondance de modèles, une fonctionnalité puissante qui permet d'écrire un code clair et concis.
match(X) when X > 0 -> io:format("Nombre positif : ~B~n", [X]);
match(X) -> io:format("Nombre non positif : ~B~n", [X]).
Erlang supporte la tolérance aux pannes grâce à sa philosophie "laisser échouer", permettant aux processus d'échouer et d'être redémarrés sans affecter le système.
start_process() ->
spawn(fun() -> crash() end).
Erlang permet aux développeurs de modifier le code dans des systèmes en cours d'exécution sans les arrêter.
%% Ancienne version
-module(example).
-export([hello/0]).
hello() -> io:format("Ancienne Version~n").
%% Nouvelle version
-module(example).
-export([hello/0]).
hello() -> io:format("Nouvelle Version~n").
Les données en Erlang sont immuables, ce qui entraîne moins de bogues et facilite la réflexion sur le code.
List = [1, 2, 3],
NewList = [4 | List].
Erlang dispose de fonctionnalités permettant une distribution facile des processus sur différents nœuds.
net_adm:start() ->
net_adm:ping('other_node@hostname').
Erlang supporte les types d'enregistrements pour créer des types de données structurés.
-record(person, {name, age}).
Person = #person{name="Alice", age=30}.
Erlang permet des compréhensions de listes pour générer et manipuler des listes de manière succincte.
Squares = [X*X || X <- [1,2,3]].
Erlang s'exécute sur la machine virtuelle BEAM, qui est conçue pour exécuter des applications concurrentes et tolérantes aux pannes. BEAM optimise la performance et permet des fonctionnalités comme l'échange de code à chaud.
Il existe plusieurs environnements de développement pour Erlang, avec Emacs et IntelliJ IDEA (avec le plugin Erlang) parmi les plus populaires. D'autres outils notables incluent des éditeurs spécifiques à Erlang comme Erlide.
Pour créer un projet Erlang, on utilise traditionnellement l'outil rebar3
, qui gère les dépendances et les constructions. Par exemple, pour créer un nouveau projet, vous exécuteriez :
rebar3 new app myapp
Ensuite, vous pouvez construire le projet avec :
rebar3 compile
Erlang est largement utilisé dans les télécommunications, les systèmes de messagerie et les applications en temps réel. Parmi les applications notables, on trouve :
Les principales forces d'Erlang résident dans son modèle de concurrence et sa tolérance aux pannes, ce qui le distingue de langages tels que :
La traduction de code vers et depuis Erlang peut être complexe en raison de ses paradigmes uniques. Des outils comme erl2cpp
existent pour certaines traductions, mais il n'y a pas d'outil automatisé répandu pour tous les langages. La traduction manuelle peut impliquer :