Elm (linguaggio di programmazione)

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
Elm
linguaggio di programmazione
AutoreEvan Czaplicki
Data di origine2012
Ultima versione0.19.1 (ottobre 2019)
Utilizzogenerazione pagine Web dinamiche
Paradigmiprogrammazione funzionale
Tipizzazioneforte, statica, inferita
Estensioni comuni.elm
Influenzato daHaskell, Standard ML, OCaml, F#
Implementazione di riferimento
LinguaInglese
LicenzaPermissiva (Revised BSD) [1]
Sito webelm-lang.org/

Elm è un linguaggio di programmazione domain-specific per creare interfacce utente grafiche di tipo declarativo basate su browser web. Elm è puramente funzionale, ed è sviluppato dando priorità all'usabilità, alle prestazioni, e alla robustezza. Sostiene di evitare praticamente qualunque eccezione in fase di esecuzione [2], grazie alle verifiche statiche del compilatore Elm.

Storia[modifica | modifica wikitesto]

Elm è stato progettato inizialmente da Evan Czaplicki come progetto di tesi nel 2012.[3] I primo rilascio di Elm era accompagnato da molti esempi e da un editor online che rendeva facile provare il linguaggio in un browser Web.[4] Evan Czaplicki è entrato a far parte di Prezi nel 2013 per lavorare su Elm,[5] e nel 2016 si è spostato in NoRedInk come ingegnere Open Source, dando inoltre vita alla Elm Software Foundation.[6]

L'implementazione iniziale del compilatore Elm genera codice HTML, CSS, e JavaScript.[7] L'insieme di strumenti di base si è continuato a espandere, e adesso comprende un interprete interattivo,[8] un gestore di pacchetti,[9] un debugger che consente viaggi nel tempo,[10] e degli installatori per Mac e Windows.[11] Inoltre, Elm ha un ecosistema di librerie create dalla comunità di utenti.[12]

Caratteristiche[modifica | modifica wikitesto]

Elm ha un insieme piccolo ma espressivo di costrutti linguistici, tra cui espressioni `if`, espressioni `let`, espressioni `case`, funzioni anonime, e interpolazioni di lista.[13][14] Le caratteristiche chiave comprendono l'immutabilità, la tipizzazione statica, e l'interoperabilità con HTML, CSS, e JavaScript.

Immutabilità[modifica | modifica wikitesto]

Tutti i valori in Elm sono immutabili, cioè nessun valore può essere modificato dopo che è stato creato. Elm usa strutture dati persistenti per implementare le sue librerie Array, Dict, e Set.[15]

Tipizzazione statica[modifica | modifica wikitesto]

Elm è tipizzato staticamente. Ogni definizione in Elm può ricevere un'annotazione di tipo che descrive la forma esatta del valore. Tra i tipi ci sono:

  • tipi primitivi come interi e stringhe
  • strutture dati di base come liste, ennuple, e record estendibili
  • tipi personalizzati, chiamati `unioni taggate` che consentono di costruire tipi interamente nuovi [16]

Elm supporta anche la completa inferenza di tipo, così che il compilatore possa verificare che un programma sia type-safe anche senza annotazioni di tipo.

Sistema di moduli[modifica | modifica wikitesto]

Elm ha un sistema di moduli che consente ai programmatori di suddividere il loro codice in parti più piccole, chiamate "moduli". I programmatori possono importare ed esportare simboli, rendendo possibile nascondere i dettagli implementativi che non sono necessari agli altri moduli. I moduli formano la base del sito Web della libreria della comunità di Elm, la Elm Public Library.

Interoperabilità con HTML, CSS, e JavaScript[modifica | modifica wikitesto]

Elm usa un'astrazione chiamata "porte" per comunicare con JavaScript.[17] Consente ai valori di fluire dentro e fuori da programmi Elm, rendendo possibile comunicare fra Elm e JavaScript.

Elm ha una libreria chiamata "elm-html", che i programmatori possono usare per specificare codice HTML e CSS dall'interno di Elm.[18] Usa un approccio al DOM virtuale per rendere efficienti gli aggiornamenti.[19]

Limitazioni[modifica | modifica wikitesto]

Diversamente da Haskell, Elm non supporta i tipi di livello superiore, e quindi non può fornire astrazioni generiche per molte operazioni comuni.[20] Per esempio, non ci sono funzioni generiche map, apply, fold, né filter. Invece, tali nomi si usano prefissi dal nome del modulo in cui sono definiti, come per List.map e Dict.map.

Strumenti[modifica | modifica wikitesto]

Codice di esempio[modifica | modifica wikitesto]

-- Questo è un commento su una sola riga

{- Questo è un commento su più righe.
   Può estendersi su molte righe.
-}

{- I commenti su più righe possono essere {- annidati -} -}

-- Qui definiamo un valore chiamato ''saluti''. Il tipo viene inferito essere String.
saluti =
    "Hello World!"

-- È meglio aggiungere annotazioni di tipo alle dichiarazioni di primo livello.
ciao : String
ciao =
    "Ehilà."

-- Le funzioni si dichiarano allo stesso modo, con gli argomenti che seguono il nome della funzione.
aggiungi x y =
    x + y

-- Ancora, è meglio aggiungere le annotazioni di tipo.
ipotenusa : Float -> Float -> Float
ipotenusa a b =
    sqrt (a^2 + b^2)

-- Le espressioni `if` si usano per fare diramazioni in base a valori
valoreAssoluto : Int -> Int
valoreAssoluto numero =
    if numero < 0 then -numero else numero

-- I record si usano per tenere valori in campi aventi un nome
libro : { titolo:String, autore:String, pagine:Int }
libro =
    { titolo = "Steppenwolf"
    , autore = "Hesse"
    , pagine = 237 
    }

-- Possiamo creare tipi completamente nuovi usando la parola-chiave `type`.
-- Il seguente valore rappresenta un albero binario.
type Albero a
    = Vuoto
    | Nodo a (Albero a) (Albero a)

-- È possibile ispezionare questi tipi usando espressioni `case`.
profondita : Albero a -> Int
profondita albero =
    case albero of
      Vuoto -> 0
      Nodo valore sinistra destra ->
          1 + max (profondita sinistra) (profondita destra)

Note[modifica | modifica wikitesto]

  1. ^ https://github.com/evancz/Elm/blob/master/LICENSE
  2. ^ Elm home page, su elm-lang.org.
  3. ^ Elm: Concurrent FRP for Functional GUIs
  4. ^ Elm's Online Editor, su elm-lang.org. URL consultato il 4 gennaio 2017 (archiviato dall'url originale il 21 maggio 2017).
  5. ^ Elm joins Prezi, su elm-lang.org. URL consultato il 1º maggio 2019 (archiviato dall'url originale il 24 maggio 2015).
  6. ^ New Adventures for Elm
  7. ^ Elm compiler source code
  8. ^ Elm REPL announcement, su elm-lang.org. URL consultato il 1º maggio 2019 (archiviato dall'url originale il 31 maggio 2015).
  9. ^ Elm Package Manager announcement, su elm-lang.org. URL consultato il 1º maggio 2019 (archiviato dall'url originale il 13 marzo 2016).
  10. ^ Elm's Time-Traveling Debugger, su debug.elm-lang.org. URL consultato il 4 gennaio 2017 (archiviato dall'url originale il 3 maggio 2017).
  11. ^ Elm Platform
  12. ^ Elm Public Libraries Archiviato l'11 febbraio 2015 in Internet Archive.
  13. ^ The Syntax of Elm, su elm-lang.org. URL consultato il 1º maggio 2019 (archiviato dall'url originale il 13 marzo 2016).
  14. ^ About Elm Archiviato il 30 agosto 2017 in Internet Archive. Elm features
  15. ^ Elm Standard Libraries
  16. ^ Model The Problem, su Elm. URL consultato il 4 maggio 2016 (archiviato dall'url originale il 9 maggio 2016).
  17. ^ Ports, su elm-lang.org. URL consultato il 4 gennaio 2017 (archiviato dall'url originale il 13 marzo 2016).
  18. ^ elm-html documentation
  19. ^ Blazing Fast Html, su elm-lang.org. URL consultato il 1º maggio 2019 (archiviato dall'url originale il 13 marzo 2016).
  20. ^ Higher-Kinded types Not Expressible? #396, su github.com/elm-lang/elm-compiler. URL consultato il 6 marzo 2015.

Collegamenti esterni[modifica | modifica wikitesto]