Erlang (langage)
Erlang est un langage de programmation, supportant plusieurs paradigmes : concurrent, temps réel, distribué. Son cœur séquentiel est un langage fonctionnel à évaluation stricte, affectation unique, au typage dynamique fort. Sa couche concurrente est fondée sur le modèle d'acteur. Il possède des fonctionnalités de tolérance aux pannes et de mise à jour du code à chaud, permettant le développement d'applications à très haute disponibilité. Erlang est conçu pour s'exécuter sur une machine virtuelle spécifique appelée BEAM. Il a été créé par Ericsson, qui l'utilise dans plusieurs de ses produits, tels que le commutateur ATM AXD 301. Initialement propriétaire, il est publié sous licence Open Source depuis 1998. Il est également utilisé par d'autres entreprises développant des logiciels liés aux réseaux de télécommunications, comme T-Mobile, Nortel ou encore plus récemment WhatsApp pour de la messagerie instantanée. Le nom « Erlang » fait référence au mathématicien Agner Erlang, tout en faisant figure de mot valise de l’expression Ericsson Language. ExemplesComme tous les langages fonctionnels, Erlang repose beaucoup sur la récursivité. En Erlang, la fonction factorielle peut s'écrire sous une forme récursive, comme suit : -module(fact). % le nom du fichier est fact.erl (fichier et module doivent porter le même nom)
-export([fac/1]). % exporte (publiquement) la fonction fac, d'arité 1 (un seul argument)
fac(0) -> 1; % cas de base : notez le point-virgule qui signifie « ou »
fac(N) when N > 0 -> N*fac(N-1). % cœur récursif : quand N vaut 1, alors fac(N-1) retourne 1,
% la récursion s'arrête et N * 1 est retourné comme résultat
où Une version utilisant la récursion terminale, avec un accumulateur : -module(tail_fact).
-export([tail_fact/1]).
tail_fact(N) -> tail_fact(N,1). % interface publique : délègue à l'implémentation tail_fact/2
tail_fact(0,Acc) -> Acc; % cas de base : si N vaut 0, on retourne l'accumulateur
tail_fact(N,Acc) when N > 0 -> tail_fact(N-1,N*Acc). % cœur récursif : contrairement au cas récursif simple,
% où la valeur de fac() est multipliée à N et doit être
% conservée en mémoire, ici tail_fact() est « seule »,
% l'accumulateur Acc permettant de passer à l'itération
% suivante sans conserver les N-1 valeurs de tail_fact()
% précédentes en mémoire (le cas de base gère le retour final)
L'algorithme de tri Quicksort avec une implémentation également récursive peut s'écrire sous cette forme en Erlang (de nombreuses variantes existent) : %% quicksort:qsort(List)
%% Trie une liste d'éléments
-module(quicksort).
-export([qsort/1]).
qsort([]) -> [];
qsort([Pivot|Reste]) ->
qsort([ X || X <- Reste, X < Pivot]) ++ [Pivot] ++ qsort([ Y || Y <- Reste, Y >= Pivot]).
Le code fait des appels récursifs à la fonction Fonctionnalités notablesLe partage de données par passage de messageContrairement aux processus légers (threads) dans des langages classiques tels Java ou C, les processus Erlang ne partagent pas de mémoire pour communiquer, ce qui permet d'éviter les problèmes liés à la synchronisation. La transmission d'informations se fait uniquement par passage de messages. La primitive qui permet l'envoi d'un message est send, exprimée par La syntaxe est la suivante : Pid ! Message dans lequel À la différence d'autres langages concurrents comme Ada, l'envoi et la réception d'un message sont asynchrones en Erlang. Du point de vue de l'émetteur, l'envoi est instantané quel que soit l'état du destinataire. Le message est simplement remis dans la boîte aux lettres de ce dernier qui pourra le consommer au moment voulu. Cette propriété permet de découpler temporellement l'émetteur du receveur et ainsi de maximiser le niveau de concurrence dans le système tout en restant tolérant à la latence introduite par la communication dans un système distribué. Gestion explicite du tempsDu fait de ses origines comme outil logiciel de télécommunications, Erlang permet la définition de contraintes de temps réel souple (soft real time), c'est-à-dire l'exécution d'une action à l'intérieur d'un temps déterminé. Erlang incorpore la gestion du temps dans la primitive de réception de message receive, dont la syntaxe est la suivante : receive
Message1 ->
Action1;
Message2 ->
Action2
after
Timeout ->
ActionTimeOut
end
Le processus qui exécute le code ci-dessus attendra au plus, la valeur de l'expression La programmation distribuée à base de nœud et de processusLes processus Erlang s'exécutent dans une machine virtuelle. Plusieurs machines virtuelles possiblement situées sur différents ordinateurs peuvent être connectées entre elles et former les nœuds d'un système distribué. La communication entre processus localisés sur des nœuds différents utilise les mêmes primitives et possède la même sémantique que pour la communication entre processus du même nœud. Du point de vue du programmeur, la localisation d'un processus est transparente. Les connexions entre nœuds sont dynamiques. Un nœud peut joindre et quitter le système (ou en être isolé par une panne) à n'importe quel moment. Cette caractéristique autorise la tolérance aux pannes par redondance et la montée en charge d'une application par ajout de nouveaux nœuds. La richesse de l'environnementBâties sur le langage, les bibliothèques Open Telecom Platform (OTP) offrent des fonctionnalités de distribution des traitements et de supervision des nœuds avancées, ainsi qu'une base de données répartie. L'accent est mis sur la tolérance aux pannes puisque le couple Erlang/OTP permet entre autres de :
Notes et références
AnnexesArticles connexes
Liens externes
|