Google ha pubblicato la versione del linguaggio di programmazione Dart 2.15, continuando lo sviluppo di una branca profondamente ristrutturata di Dart 2, che si differenzia dalla versione originale del linguaggio Dart per l'uso di una tipizzazione statica forte (i tipi possono essere dedotti automaticamente, quindi l'indicazione dei tipi non è obbligatoria, ma la tipizzazione dinamica non è più utilizzata e il tipo inizialmente calcolato è fissato alla variabile e in seguito viene applicato un controllo di tipo rigoroso).
Caratteristiche del linguaggio Dart:
- Sintassi familiare e semplice da apprendere, naturale per programmatori in JavaScript, C e Java.
- Garantire un avvio rapido e alte prestazioni per tutti i moderni web browser e diversi tipi di ambienti, da dispositivi portatili a potenti server.
- Possibilità di definire classi e interfacce che consentono di utilizzare l'incapsulamento e riutilizzare metodi e dati esistenti.
- L'indicazione dei tipi semplifica il debug e l'individuazione degli errori, rende il codice più chiaro e leggibile, facilitando ulteriormente le modifiche e l'analisi da parte di sviluppatori esterni.
- I tipi supportati includono vari tipi di hash, array e liste, code, tipi numerici e stringhe, tipi per la definizione di date e orari, espressioni regolari (RegExp). È possibile creare tipi personalizzati.
- Per organizzare l'esecuzione parallela, si consiglia di utilizzare classi con l'attributo isolate, il cui codice viene eseguito completamente in uno spazio isolato in un'area di memoria separata, interagendo con il processo principale tramite l'invio di messaggi.
- Supporto per l'utilizzo di librerie che semplificano la manutenzione e il debug di grandi progetti web. Le implementazioni di funzioni di terze parti possono essere collegate come librerie condivise. Le applicazioni possono essere suddivise in parti e lo sviluppo di ciascuna parte può essere assegnato a un team separato di programmatori.
- Un insieme di strumenti pronti per supportare lo sviluppo in Dart, comprese l'implementazione di strumenti di sviluppo dinamici e debug con correzione del codice al volo («edit-and-continue»).
- Per semplificare lo sviluppo in linguaggio Dart, è fornito un SDK, un gestore di pacchetti pub, un analizzatore di codice statico dart_analyzer, una serie di librerie, l'ambiente di sviluppo integrato DartPad e plugin con supporto per Dart per IntelliJ IDEA, WebStorm, Emacs, Sublime Text 2 e Vim.
- Pacchetti aggiuntivi con librerie e utilità sono distribuiti attraverso il repository pub, che conta circa 22.000 pacchetti.
Le principali novità della versione Dart 2.15:
- Sono supportati i mezzi per l'esecuzione rapida e parallela delle operazioni con l'isolamento dei gestori. Nei sistemi multij core, il runtime Dart esegue per impostazione predefinita il codice dell'applicazione su un core della CPU, mentre gli altri core vengono utilizzati per svolgere compiti di sistema, come input/output asincrono, scrittura su file o effettuazione di chiamate di rete. Per le applicazioni che necessitano di eseguire in parallelo i propri gestori, ad esempio per il rendering di animazioni nell'interfaccia, è prevista la possibilità di avviare singoli blocchi di codice (isolate), isolati l'uno dall'altro e eseguiti su altri core della CPU in contemporanea con il thread principale dell'applicazione. Per proteggere dagli errori che si verificano durante l'esecuzione simultanea di codice che lavora su un insieme di dati comune, la condivisione di oggetti mutabili è vietata tra diversi blocchi isolate, e per l'interazione tra i gestori si utilizza un modello basato sulla trasmissione dei messaggi.
In Dart 2.15 è stata introdotta una nuova concezione: i gruppi di isolate, che permettono di organizzare l'accesso condiviso a diverse strutture dati interne negli isolate appartenenti a un unico gruppo. Questo consente di ridurre significativamente l'overhead durante l'interazione tra i gestori all'interno del gruppo. Ad esempio, l'avvio di un ulteriore isolate all'interno di un gruppo esistente avviene 100 volte più velocemente e richiede da 10 a 100 volte meno memoria rispetto all'avvio di un isolate separato, grazie all'eliminazione della necessità di inizializzare le strutture dati del programma.
Nonostante il divieto di condivisione di oggetti modificabili nei blocchi isolate, nei gruppi viene utilizzata una memoria heap condivisa, il che consente di accelerare notevolmente il trasferimento di oggetti da un blocco all'altro senza la necessità di eseguire operazioni di copia ad alta intensità di risorse. Nella nuova versione è anche consentito passare il risultato del gestore quando si chiama Isolate.exit() per trasmettere dati al blocco isolate genitore senza operazioni di copia. Inoltre, è stata ottimizzata la meccanica di trasmissione dei messaggi: messaggi brevi e medi vengono ora elaborati circa 8 volte più velocemente. Tra gli oggetti che possono essere trasferiti tra i blocchi isolate tramite la chiamata SendPort.send(), sono inclusi alcuni tipi di funzioni, chiusure e tracciamenti dello stack.
- Nelle risorse per la creazione di puntatori a singole funzioni in altri oggetti (tear-off) sono stati rimossi i limiti sulla creazione di tali puntatori nel codice dei costruttori, il che può essere utile nella costruzione di interfacce basate sulla libreria Flutter. Ad esempio, per creare un widget Column che include diversi widget Text, è possibile chiamare «.map()» e passare i puntatori al costruttore Text.new dell'oggetto Text: class FruitWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children: [‘Apple’, ‘Orange’].map(Text.new).toList()); } }
- Sono state ampliate le capacità relative all'uso dei puntatori a funzioni. È stata aggiunta la possibilità di applicare metodi generici (generic) e puntatori a funzioni per creare un metodo non generico e un puntatore: T id(T value) => value; var intId = id; // consentito nella versione 2.15 invece di «int Function(int) intId = id;» const fo = id; // puntatore alla funzione id. const c1 = fo;
- Nella libreria dart:core è stato migliorato il supporto per le enumerazioni (enum), ad esempio ora è possibile estrarre il valore stringa da ciascun valore enum tramite il metodo «.name», effettuare la selezione dei valori per nome o eseguire il matching di coppie di valori: enum MyEnum { one, two, three } void main() { print(MyEnum.one.name); // verrà stampato «one». print(MyEnum.values.byName('two') == MyEnum.two); // verrà stampato «true». final map = MyEnum.values.asNameMap(); print(map['three'] == MyEnum.three); // «true». }
- È stata implementata una tecnica per la compressione dei puntatori, permettendo di utilizzare una rappresentazione più compatta dei puntatori in ambienti a 64 bit, qualora per l'indirizzamento sia sufficiente uno spazio di indirizzamento a 32 bit (utilizzando non più di 4 GB di memoria). I test hanno dimostrato che tale ottimizzazione consente di ridurre la dimensione dell'heap di circa il 10%. Nel Flutter SDK, per impostazione predefinita, la nuova modalità è già attivata per Android, mentre nel futuro rilascio è previsto l'inserimento per iOS.
- Nel Dart SDK sono inclusi strumenti per il debug e l'analisi delle prestazioni (DevTools), che in precedenza venivano forniti in un pacchetto separato.
- Nella squadra di «dart pub» e nel repository di pacchetti pub.dev sono stati aggiunti strumenti per monitorare la pubblicazione accidentale di informazioni riservate, come l'inserimento di credenziali per sistemi di integrazione continua e ambienti cloud all'interno di un pacchetto. In caso di rilevamento di tali perdite, l'esecuzione del comando «dart pub publish» sarà interrotta con un messaggio di errore. Se si verifica un falso allarme, è prevista la possibilità di bypassare il controllo attraverso una lista bianca.
- È stata aggiunta la possibilità di ritirare una versione già pubblicata di un pacchetto nel repository pub.dev, ad esempio in caso di errori critici o vulnerabilità. In passato, per tali correzioni si pubblicava una versione correttiva, ma in alcune situazioni è necessario annullare la versione pubblicata e arrestarne la distribuzione (per esempio, se la correzione non è ancora pronta o se è stata pubblicata erroneamente una versione completa al posto di una versione di test). Dopo il ritiro, il pacchetto non sarà più riconosciuto nei comandi «pub get» e «pub upgrade», e nelle installazioni già effettuate, il comando «pub get» restituirà un avviso speciale alla successiva esecuzione.
- È stata aggiunta una protezione contro la vulnerabilità (CVE-2021-22567) causata dall'uso di caratteri unicode nel codice che modificano l'ordine di visualizzazione.
- È stata corretta una vulnerabilità (CVE-2021-22568) che consente di impersonare un altro utente di pub.dev durante la pubblicazione di pacchetti su un server di terze parti che accetta token di accesso oauth2 di pub.dev. Ad esempio, questa vulnerabilità può essere utilizzata per attaccare server di pacchetti interni e aziendali. Gli sviluppatori che pubblicano solo pacchetti su pub.dev non sono colpiti dal problema.
È stato anche presentato un importante aggiornamento del framework per la creazione di interfacce utente Flutter 2.8, considerato un'alternativa a React Native, che consente di rilasciare applicazioni per le piattaforme iOS, Android, Windows, macOS e Linux, a partire da un'unica base di codice, nonché di creare applicazioni da eseguire nei browser. Flutter è alla base dell'interfaccia utente dell'operating system microkernel Fuchsia in fase di sviluppo da Google. Si segnala che negli ultimi sei mesi il numero di applicazioni su Flutter 2 nel Google Play Store è aumentato da 200.000 a 375.000, ovvero quasi il doppio.
La parte principale del codice Flutter è scritta in Dart, mentre il motore runtime per l'esecuzione delle applicazioni è scritto in C++. Durante lo sviluppo delle applicazioni, oltre al linguaggio Dart nativo di Flutter, è possibile utilizzare l'interfaccia Dart Foreign Function per chiamare codice in C/C++. Le elevate prestazioni di esecuzione sono ottenute grazie alla compilazione delle applicazioni in codice macchina per le piattaforme target. In questo modo, il programma non deve essere ricompilato dopo ogni modifica: Dart offre una modalità di hot reload che consente di apportare modifiche all'applicazione in esecuzione e di valutare immediatamente i risultati.
Tra le novità della nuova versione di Flutter, si segnala l'ottimizzazione della velocità di avvio e del consumo di memoria sui dispositivi mobili. È stato semplificato il collegamento delle applicazioni ai servizi backend, come Firebase e Google Cloud. Gli strumenti per l'integrazione con Google Ads sono stati stabilizzati. Migliorata notevolmente la supporto per telecamere e plugin web. Sono stati introdotti nuovi strumenti per semplificare lo sviluppo, come il widget per l'autenticazione con Firebase. Aggiornato il motore Flame, dedicato allo sviluppo di giochi 2D con Flutter.
Fonte: opennet.ru
