# Elixir (linguaggio di programmazione)

Elixir è un linguaggio di programmazione funzionale, concorrente, il cui codice compilato viene interpretato dalla macchina virtuale Erlang (BEAM). Utilizza quest'ultima proprio per fornire applicazioni distribuite, fault-tolerant e (near) real-time, ma anche per estenderla verso il supporto della meta-programmazione attraverso macro, polimorfismo e protocolli.

## Storia

Il creatore del linguaggio di programmazione Elixir è José Valim. Il linguaggio di programmazione è un progetto R&D di Plataformatec. Lo scopo è quello di consentire una maggiore estensibilità e produttività della VM Erlang, preservando al contempo la compatibilità con gli strumenti e l'ecosistema stesso di Erlang.
La nascita di Elixir è stata motivata dal fatto che la capacità di calcolo dei processori è in continuo aumento, il che ha dato luogo ai processori a core multipli, e che l'ecosistema Erlang, compresa la sua macchina virtuale, sfrutta appieno questo tipo di architettura multi-processore, così che un programma in esecuzione può essere suddiviso in una serie di micro processi paralleli. Elixir è nato per superare le carenze di Erlang su alcuni paradigmi e per rendere disponibili taluni approcci di programmazione non ammessi da Erlang, come la meta-programmazione ed il polimorfismo.

## Aspetti tecnici

Elixir dispone di un sistema di gestione dei pacchetti, di macro, di uno strumento che automatizza lo sviluppo facile da usare e del sistema di codifica Unicode. Dato che Elixir è un linguaggio che viene eseguito sulla macchina virtuale Erlang, ottiene tutti i vantaggi forniti dalla maturità della VM e può usare le librerie Erlang esistenti, senza penalizzare le performance. Al contrario di Erlang, Elixir dispone dell'operatore pipe. La sintassi di Elixir, al contrario di quella di Erlang, risulta più familiare agli sviluppatori Ruby.

## Caratteristiche

* Un linguaggio che viene compilato in bytecode per la macchina virtuale Erlang (BEAM)
* Tutto è un'espressione
* Perfetta integrazione con il linguaggio di programmazione Erlang: nessuna penalità verso le chiamate di funzione Erlang (e vice versa)
* Meta-programmazione che prevede la manipolazione diretta dell'albero sintattico
* Supporto per la documentazione attraverso docstring in stile Python; il linguaggio di markup usato come standard de facto è il markdown
* Polimorfismo attraverso un meccanismo chiamato protocols. Enumerable è un esempio di protocollo ed è ispirato ai riduttori Clojure Così come avviene in Clojure, i protocolli forniscono un meccanismo di collegamento dinamico detto dynamic dispatch. Tuttavia, ciò non va confuso con il collegamento multiplo, anche detto multiple dispatch.
* Architettura shared-nothing attraverso lo scambio di messaggi (Actor model)
* Enfasi sulla ricorsione e le funzioni di ordine superiore piuttosto che side-effects e cicli.
* Collezioni pigre ed asincrone con i flussi
* Pattern matching
* Supporto Unicode e stringhe UTF-8

## Esempi

I seguenti esempi possono essere eseguiti in una shell IEx (acronimo di Interactive Elixir) oppure possono essere salvati in un file ed essere eseguiti dalla linea di comando, digitando elixir <filename>.
Hello world - Stampa sullo standard output della stringa di caratteri Hello world:
Operazioni sulle liste - Degli elementi appartenenti alla lista originale si selezionano solo quelli dispari (ottenuti laddove il resto della loro divisione per 2 è uguale ad 1) e si crea un elenco contenente questi elementi al quadrato.
Pattern Matching
Moduli
Invocazione di codice nativo Erlang - Esempio di utilizzo di una libreria di Erlang (la libreria è inet_res); al momento della stesura di questo paragrafo l'indirizzo IP dell'host a cui punta l'URL fornito come parametro d'ingresso al metodo (quello della sezione polacca di Wikipedia) era 91.198.174.192

## Progetti Elixir degni di nota

* Mix è uno strumento di automazione dello sviluppo che fornisce attività per la creazione, la compilazione e il test di progetti Elixir, la gestione delle sue dipendenze e altro ancora.
* Phoenix è un framework di sviluppo web scritto in Elixir che implementa il pattern Model-view-controller (MVC) lato server.