L'azienda Google ha pubblicato la versione del linguaggio di programmazione Dart 2.14, che porta avanti lo sviluppo di una branca profondamente rielaborata di Dart 2, la quale si distingue dalla versione originale del linguaggio Dart per l'uso di una rigorosa tipizzazione statica (i tipi possono essere dedotti automaticamente, quindi la specifica dei tipi non è obbligatoria, ma la tipizzazione dinamica non è più utilizzata e il tipo inizialmente calcolato è assegnato alla variabile, con un controllo dei tipi rigoroso in seguito).
Caratteristiche del linguaggio Dart:
- Una sintassi familiare e semplice da apprendere, naturale per i programmatori di JavaScript, C e Java.
- Assicurare un avvio rapido e alte prestazioni per tutti i moderni browser web e vari tipi di ambienti, da dispositivi portatili a potenti server.
- La possibilità di definire classi e interfacce, consentendo di utilizzare l'incapsulamento e riutilizzare metodi e dati esistenti.
- La specificazione dei tipi facilita il debug e l'identificazione degli errori, rende il codice più chiaro e leggibile, semplifica le modifiche e l'analisi da parte di altri sviluppatori.
- Tra i tipi supportati: diverse varietà di hash, array e liste, code, tipi numerici e stringhe, tipi per la definizione di data e ora, 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'uso di librerie, che semplificano la manutenzione e il debug di grandi progetti web. 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 di programmatori separato.
- Un insieme di strumenti pronti per supportare lo sviluppo nel linguaggio Dart, inclusa l'implementazione di strumenti per lo sviluppo e il debug dinamico con correzione del codice al volo («edit-and-continue»).
- Per semplificare lo sviluppo nel linguaggio Dart, è fornito un SDK, un gestore pacchetti pub, un analizzatore statico del codice dart_analyzer, un insieme di librerie, un ambiente di sviluppo integrato DartPad e plugin con supporto Dart per IntelliJ IDEA, WebStorm, Emacs, Sublime Text 2 e Vim.
- Pacchetti aggiuntivi con librerie e utilità vengono distribuiti tramite il repository pub, che conta oltre 20.000 pacchetti.
Le principali novità della versione Dart 2.14:
- È stato aggiunto un nuovo operatore di shift triplo (>>>), che a differenza dell'operatore «>>» esegue uno shift logico invece di uno aritmetico, che funziona senza tenere conto del bit di segno (lo shift viene effettuato senza distinzione tra numeri positivi e negativi).
- Rimosso il vincolo sugli argomenti di tipo che non consentiva di utilizzare tipi generici di funzioni come argomento di tipo. Adesso è possibile indicare: late List<T Function<T>(T)> idFunctions; var callback = [<T>(T value) => value]; late S Function<S extends T Function<T>(T)>(S) f;
- È consentito specificare argomenti con tipi nelle annotazioni, come @Deprecated. Ad esempio, ora è possibile indicare: @TypeHelper<int>(42, «Il significato»)
- Nella libreria standard (core) è stata aggiunta alla classe Object i metodi statici hash, hashAll e hashAllUnordered. Nella classe DateTime è stato migliorato il trattamento dell'ora locale durante la transizione tra l'ora legale e l'ora solare non multipla di un'ora (ad esempio, in Australia viene usato uno spostamento di 30 minuti). Nel pacchetto ffi è stata aggiunta la supporto per il meccanismo di allocazione della memoria all'interno dell'arena, che libera automaticamente le risorse. Nel pacchetto ffigen è stata aggiunta la possibilità di generare definizioni typedef di tipi Dart dal linguaggio C.
- I 250 pacchetti più popolari del repository pub.dev e il 94% dei top-1000 sono stati convertiti per l'uso della modalità di sicurezza sui valori «Null» (null safety), che consente di evitare crash causati da tentativi di utilizzare variabili il cui valore non è definito e impostato su «Null». La modalità implica che le variabili non possono avere valori indeterminati, a meno che non venga assegnato esplicitamente un valore null. In modalità severa vengono considerati i tipi delle variabili, permettendo al compilatore di applicare ottimizzazioni aggiuntive. La corrispondenza dei tipi viene verificata in fase di compilazione; ad esempio, nel caso di un tentativo di assegnare il valore «Null» a una variabile con un tipo che non prevede uno stato indeterminato, come «int», verrà generato un errore.
- Sono stati proposti set di regole unificate per l'analizzatore di codice (linter), che garantiscono un supporto simultaneo per la verifica della conformità alle raccomandazioni sullo stile di codifica per Dart e il framework Flutter. Per motivi storici, le regole di formattazione del codice per Flutter e Dart erano diverse, inoltre per Dart esistevano due set di regole: quelle pedanti di Google e le regole della comunità di sviluppatori Dart. In Dart 2.14 è stato presentato un nuovo set comune di regole per il linter, che sarà applicato come predefinito nei nuovi progetti Dart e nel Flutter SDK. Il set include regole di base (pacchetto lints/cor.yaml), regole aggiuntive raccomandate (lints/recommended.yaml) e raccomandazioni specifiche per Flutter (flutter_lints/flutter.yaml). Si consiglia agli utenti delle regole pedanti di passare a un nuovo stile di codifica, basato sulle raccomandazioni della documentazione Dart.
- Nel formatter sono state apportate ottimizzazioni al formato dei blocchi di codice a cascata, consentendo di aumentare notevolmente le prestazioni di formattazione e di evitare ambiguità nell'interpretazione dell'appartenenza degli elementi dell'espressione. Ad esempio, la chiamata «..doIt» nell'espressione «var result = errorState ? foo : bad..doIt()» riguarda non la parte condizionale del blocco «bad», ma l'intera espressione, quindi nella formattazione ora si separa: var result = errorState ? foo : bad ..doIt();
- Nell'SDK è stato aggiunto il supporto per i processori Apple M1 (Silicon), il che implica sia la possibilità di eseguire il Dart VM, le utility e i componenti dell'SDK su sistemi con processore Apple Silicon, sia il supporto per la compilazione di file eseguibili per i suddetti chip.
- Nel comando «dart pub» è stata aggiunta la supporto per il nuovo file di servizio «.pubignore», che consente di definire un elenco di file che saranno ignorati durante la pubblicazione del pacchetto nel repository pub.dev. Le impostazioni specificate non si sovrappongono all'elenco di esclusione «.gitignore» (in alcune situazioni su pub.dev è necessario non inviare file che servono in Git, come script interni utilizzati durante lo sviluppo).
- È stato effettuato un lavoro per migliorare le prestazioni del comando «dart test», che ora non richiede la ricompilazione dei test dopo una modifica del pubspec, se il numero di versione non è cambiato.
- È stata interrotta la supporto per la compilazione in modalità compatibilità con ECMAScript 5 (la modifica comporterà la perdita di compatibilità con il browser IE11).
- Sono state dichiarate obsolete alcune utility come stagehand, dartfmt e dart2native, sostituite da comandi integrati richiamabili tramite l'utility dart.
- Il meccanismo delle VM Native Extensions è stato spostato nel settore delle tecnologie obsolete. Per richiamare codice nativo da codice scritto in Dart, si raccomanda di utilizzare il nuovo interfaccia Dart FFI (Foreign Function Interface).
È stato contemporaneamente presentato un importante rilascio del framework per la costruzione di interfacce utente Flutter 2.5, considerato un'alternativa a React Native, che consente di rilasciare applicazioni per le piattaforme iOS, Android, Windows, macOS e Linux, utilizzando una sola base di codice, oltre a creare applicazioni per l'esecuzione nei browser. Flutter è alla base dell'interfaccia utente del sistema operativo microkernel Fuchsia in sviluppo presso Google.
La maggior parte del codice Flutter è scritta in Dart, mentre il motore runtime per l'esecuzione delle applicazioni è sviluppato in C++. Nello sviluppo delle applicazioni, oltre al linguaggio Dart nativo di Flutter, è possibile utilizzare l'interfaccia Dart Foreign Function per richiamare codice in C/C++. Le elevate prestazioni di esecuzione sono ottenute grazie alla compilazione delle applicazioni in codice macchina per le piattaforme di destinazione. Non è necessario ricompilare il programma dopo ogni modifica: Dart offre una modalità di hot reload che consente di apportare modifiche all'applicazione in esecuzione e di valutare immediatamente il risultato.
Principali cambiamenti in Flutter 2.5:
- Sono state introdotte significative ottimizzazioni delle prestazioni. Sulle piattaforme iOS e macOS è stata implementata la precompilazione degli shader per l'API grafica Metal. È stata aumentata l'efficienza nella gestione degli eventi asincroni. È stato risolto un problema di ritardi durante il rilascio della memoria non utilizzata da parte del garbage collector (ad esempio, durante la riproduzione di un GIF animato di 20 secondi, il numero di operazioni del garbage collector è stato ridotto da 400 a 4). Le latenze nella comunicazione tra Dart e Objective-C/Swift (iOS) o Java/Kotlin (Android) sono state ridotte fino al 50%. È stato aggiunto il supporto alla compilazione nativa per i sistemi basati su chip Apple Silicon.

- Per la piattaforma Android è stata attivata la supporto per l'esecuzione delle applicazioni in modalità schermo intero. Continua l'implementazione del concetto di design "Material You", presentato come una variante di Material Design di nuova generazione. Aggiunto un nuovo stato MaterialState.scrolledUnder, implementata la visualizzazione dinamica delle barre di scorrimento in base alle dimensioni e proposto un nuovo'interfaccia per visualizzare i banner di notifica.
- Ampliate notevolmente le funzionalità del plugin per la fotocamera, che ora include strumenti per gestire l'autofocus, l'esposizione, il flash, lo zoom, la riduzione del rumore e la risoluzione.
- Migliorati gli strumenti per sviluppatori (DevTools), con una modalità di ispezione dei widget aggiornata, oltre a strumenti per identificare i ritardi nel rendering e monitorare la compilazione degli shader.

- Migliorati i plugin per Visual Studio Code e IntelliJ/Android Studio.
Fonte: opennet.ru


