Dart (originariamente chiamato Dash[1]) è un linguaggio di programmazione sviluppato da Google. È stato presentato alla conferenza "GOTO Aarhus 2011" dal 10 al 12 ottobre 2011[2]. Lo scopo di Dart è quello di sostituire JavaScript come lingua franca per lo sviluppo web sulla piattaforma "web aperto"[3].
Il compilatore Dart permette di scrivere programmi sia per il web che per desktop e server, attraverso l'uso di due diverse piattaforme:
Dart Native: Per i dispositivi (smartphone, desktop, server, and altro), Dart Native include sia la Dart VM con una compilazione JIT (just-in-time) e un compilatore AOT (ahead-of-time) per la produzione di codice eseguibile.
Dart Web: Per il web, Dart Web include sia un compilatore per lo sviluppo (dartdevc) che uno per la produzione (dart2js).
L'intento di Dart è quello di risolvere i problemi di JavaScript (che, secondo il memo interno trapelato,[3] non possono essere risolti con l'evoluzione del linguaggio) offrendo al tempo stesso migliori prestazioni, la possibilità di sviluppare più facilmente strumenti utili alla gestione di progetti di grandi dimensioni e migliori funzionalità legate alla sicurezza[1]. Gli ingegneri di Google stanno sviluppando un IDE basato sul cloud chiamato Brightly, che potrebbe essere la prima applicazione sviluppata con Dart. Google offrirà un cross-compilatore che compila il linguaggio Dart in ECMAScript 3 al volo, per compatibilità con browser privi del supporto nativo per Dart. Ci sarà anche uno strumento per convertire il codice delle chiusuretipizzate in linguaggio Dart.[4]
La VM Dart ed il cross-compilatore Dart dovevano essere disponibili e integrati nel browser Chrome già nel tardo 2011[1] ma Google stessa nel 2017 rinuncia all'integrazione con il browser data la forte opposizione esercitata dai maggiori concorrenti per la standardizzazione del linguaggio[5].
Per funzionare nei browser web tradizionali, Dart si affida a un compilatore da sorgente a sorgente per JavaScript. Secondo il sito del progetto, Dart è stato "progettato per essere strumenti di sviluppo facili da scrivere, adatto allo sviluppo di app moderne e capace di implementazioni ad alte prestazioni"[6]. Quando si esegue il codice Dart in un browser Web, il codice viene precompilato in JavaScript utilizzando il compilatore dart2js. Compilato come JavaScript, il codice Dart è compatibile con tutti i principali browser senza bisogno che i browser adottino Dart. Attraverso l'ottimizzazione dell'output JavaScript compilato per evitare controlli e operazioni costosi, il codice scritto in Dart può, in alcuni casi, essere eseguito più velocemente del codice equivalente scritto a mano utilizzando gli idiomi JavaScript[7].
Indipendente, autonomo
Il kit di sviluppo software (SDK) Dart viene fornito con una macchina virtuale Dart autonoma, che consente l'esecuzione del codice Dart in un ambiente di interfaccia della riga di comando. Poiché gli strumenti del linguaggio inclusi in Dart SDK sono scritti principalmente in Dart, la Dart VM autonoma è una parte fondamentale dell'SDK. Questi strumenti includono il compilatore dart2js e un gestore di pacchetti chiamato pub. Dart viene fornito con una libreria standard completa che consente agli utenti di scrivere app di sistema completamente funzionanti, come i server Web personalizzati[8].
Compilato in anticipo
Il codice Dart può essere compilato AOT (Ahead of Time) in codice macchina (set di istruzioni nativi). Le app create con Flutter, un SDK per app per dispositivi mobili scritto in Dart, vengono distribuite negli app store come codice Dart compilato AOT[9].
Nativo
Logo di FlutterDart 2.6 con compilatore dart2native per compilare in codice eseguibile nativo autonomo. Prima di Dart 2.6, questa funzione mostrava questa funzionalità solo su dispositivi mobili iOS e Android tramite Flutter[10].
Per ottenere la concorrenza, Dart utilizza gli isolates, che sono workers indipendenti che non condividono la memoria, ma utilizzano invece il passaggio dei messaggi. Questo è simile ai processi di Erlang. Ogni programma Dart utilizza almeno un isolate, che è il principale.
Gli isolates sono supportati solo su piattaforme native, mentre su piattaforma web Dart sfrutta i Web Workers per ottenere funzionalità simili[11]
Le istantanee (snapshots) sono una parte fondamentale della macchina virtuale Dart. Le istantanee sono file che archiviano oggetti e altri dati di runtime[12].
Istantanee dello script
I programmi DART possono essere compilati in file snapshot. Questi file contengono tutto il codice del programma e le dipendenze preimpostate e pronte per l'esecuzione. Ciò consente partenze veloci.
Istantanee complete
Le librerie di base di Dart possono essere compilate in un file snapshot che consente il caricamento rapido delle librerie. La maggior parte delle distribuzioni standard della macchina virtuale Dart principale dispone di un'istantanea predefinita per le librerie principali che viene caricata in fase di esecuzione.
Istantanee di oggetti
Dart è un linguaggio molto asincrono. Poiché si tratta di workers che passano messaggi, è necessario un modo per serializzare un messaggio. Questa operazione viene eseguita utilizzando un'istantanea, generata da un determinato oggetto, quindi trasferita a un altro isolato per la deserializzazione.