# Erlang

* Aquest article tracta sobre el llenguatge de programació. Vegeu-ne altres significats a «Erlang (desambiguació)».
Erlang és un llenguatge de programació concurrent i un sistema d'execució (en anglès runtime) que inclou una màquina virtual (BEAM, acrònim de "Bogdan/Björn's Erlang Abstract Machine") i biblioteques (OTP: "Open Telephony Platform"). El subsistema seqüencial és un llenguatge de programació funcional amb tipus dinàmics i avaluació estricta. El subsistema concurrent segueix el Model d'Actors.
Erlang era originalment un llenguatge de la casa Ericsson per ésser usat en equips de comunicació, però va ser editat com a codi obert el 1998.
Ericsson va posar al llenguatge el nom d'Erlang com a tribut a Agner Krarup Erlang matemàtic danès pioner en l'estudi de xarxes de telecomunicacions (que també dona el seu nom a una mesura d'ús de la xarxa) i també per la coincidència amb "Ericsson language".
El compilador erlc per defecte genera codi intermedi amb extensió .beam perquè el runtime l'interpreti. Però hi ha d'altres formats i opcions.
Existeix un compilador HiPE (High performace Erlang compiler) desenvolupat per la Universitat d'Uppsala i actualment integrat en la distribució de codi obert. Per utilitzar-lo cal afegir el paràmetre [native] a l'ordre de compilació.
Hi ha un compilador a codi Scheme anomenat EToS.
Existeix també una distribució aprimada "Stand-alone Erlang" que genera executables i no codi intermedi (requereix instal·lar des de l'usuari "joe").

## El llenguatge seqüencial

El llenguatge utilitza una sintaxi similar a la del Prolog. S'estructura en una seqüència de clàusules cadascuna de les quals s'acaba en un . punt. Les clàusules no declaratives consten d'objectius alternatius (separats per ; punt i coma) basats en l'èxit de l'encaix de patrons (pattern matching). Cadascuna de les alternatives pot constar d'un seguit d'objectius en seqüència (separats per , comes).
Resumint i remarcant: A la fi d'una instrucció, la coma (operador de conjunció) indica seqüència, el punt i coma (operador de disjunció) introdueix alternativa (per ex. un altre cas d'encaix de patrons), i el punt indica final de clàusula (per ex. final d'una definició de funció).
Una funció s'identifica pel nom i el nombre de paràmetres (aritat) com ara "func/2". Dues funcions poden fer servir el mateix nom si tenen un nombre de paràmetres (aritat) diferent. S'acostuma a fer servir el mateix nom, per exemple quan cal definir una funció subordinada recursiva afegint un acumulador als paràmetres.
Les variables (assignables una sola vegada) comencen amb majúscula, les constants (dites àtoms) en minúscula o entre apòstrofs si contenen caràcters no alfanumèrics.
Les claus rectangulars [ ] indiquen llista, les arquejades { } indiquen tupla.
Els paràmetres formals no usats en una descripció de funció cal prefixar-los amb un caràcter de subratllat _ altrament mostra un missatge d'"Atenció variable no usada".
Avaluador d'expressions i documentació introductòria aquí.
Exemple de programació (fitxer "fact.erl"):
Compilació i execució a l'avaluador d'expressions (cònsola werl (cas de windows) o comanda erl (unix, windows)):

## El subsistema concurrent

El llenguatge incorpora un sistema de creació de processos en el propi runtime independent del propi del sistema operatiu, així com un sistema de comunicació entre ells.
Per la comunicació entre ordinadors cal obrir el port 4369 del tallafocs per a TCP i UDP.
* la funció spawn(Mòdul, Funció, Args) crea un nou procés executant la funció especificada i retorna el PID (identificador) del procés creat.
* la funció self retorna el PID propi.
* el símbol ! indica enviar. La construcció PID_destí ! {msg_id, Dades} envia dades al procés de destinació.
* la construcció receive posa el procés en espera de recepció:
Un node és una instància del runtime de Erlang en un ordinador (host) determinat. La comunicació es pot establir entre diversos nodes del mateix o de diferents sistemes via TCP/IP.
Un exemple:
Per provar-ho en una mateixa màquina o en dues màq. de la mateixa xarxa local engegarem dues finestres de comandes des del directori del fitxer "tut19.erl". En una escriurem la comanda
En l'altra
i ja en veureu el resultat. Per provar-ho en dues màquines de xarxes diferents cal fer servir l'opció -name en comptes de -sname i posar-hi el nom qualificat del host (nom d'internet, com ara host.domini.tld).

## Vegeu també

* Erlang (unitat)

## Referències

* ↑ 8.5 What implementations of the Erlang Virtual Machine are there?(anglès)
* ↑ Joe Armstrong, Bjarne Däcker, Thomas Lindgren, Håkan Millroth. «Open-source Erlang - White Paper». Arxivat de l'original el 2011-10-25. [Consulta: 31 juliol 2011].
* ↑ Erlang/OTP Released as Open Source(anglès)
* ↑ Erlang.com - Què és un Erlang (anglès)
* ↑ Erlang, the mathematician?(anglès)
* ↑ Formats i opcions de compilació Arxivat 2007-04-27 a Wayback Machine. (anglès)
* ↑ Compilador HiPE Arxivat 2007-04-22 a Wayback Machine. (anglès)
* ↑ Erlang.se - Tot allò que voldrieu saber sobre HiPE ... Arxivat 2007-05-08 a Wayback Machine. (anglès)
* ↑ Compilador EToS Arxivat 2007-04-25 a Wayback Machine. (anglès)
* ↑ Stand-alone Erlang (anglès)
* ↑ The Erlang Shell(anglès)
* ↑ Erlang distribuït amb SSL a través de tallafocs Arxivat 2007-07-26 a Wayback Machine. (anglès)
* ↑ Distribució Erlang a través de tallafocs (anglès)

## Enllaços externs

* Erlang.org - Web oficial per al codi obert i documentació (anglès)
* Web de Joe Armstrong, un dels dissenyadors de Erlang
* High-Performance Erlang (anglès)