Google ha pubblicato la versione 2.14 del linguaggio di programmazione Dart, continuando lo sviluppo di una versione completamente rielaborata di Dart 2, che si distingue dall'originale per l'uso di un forte sistema di tipi statici (i tipi possono essere dedotti automaticamente, quindi l'indicazione dei tipi non è obbligatoria, ma la tipizzazione dinamica non è più utilizzata e il tipo inizialmente dedotto viene assegnato alla variabile e successivamente applicato un rigoroso controllo dei tipi).
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 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 un'operazione aritmetica, funzionando senza considerare il bit di segno (lo shift avviene senza distinzione tra numeri positivi e negativi).
- Rimosso il limite sugli argomenti di tipo che impedivano l'uso di tipi generali di funzioni come argomento di tipo. Ad esempio, ora è possibile indicare: late List<T Function(T)> idFunctions; var callback = [(T value) => value]; late S Function<S extends T Function(T)>(S) f;
- Consentita l'indicazione di argomenti con tipi nelle annotazioni, come @Deprecated. Ad esempio, ora si può specificare: @TypeHelper(42, "Il significato")
- Nella libreria standard (core), sono stati aggiunti i metodi statici hash, hashAll e hashAllUnordered alla classe Object. Nella classe DateTime è migliorata la gestione del tempo locale nella conversione dell'ora tra ora legale e ora solare non pari a un'ora (ad esempio, in Australia viene utilizzato uno spostamento di 30 minuti). Nel pacchetto ffi è stata aggiunta la supporto per il meccanismo di allocazione della memoria arena, che libera automaticamente le risorse. Nel pacchetto ffigen è stata aggiunta la possibilità di generare definizioni di tipi Dart typedef dal linguaggio C.
- I 250 pacchetti più popolari del repository pub.dev e il 94% dei top-1000 sono stati tradotti per utilizzare la modalità di sicurezza dei valori «Null» (null safety), che permette di evitare crash causati dal tentativo di utilizzare variabili il cui valore non è definito e impostato su «Null». Questa modalità implica che le variabili non possono avere valori indefiniti, a meno che non venga loro esplicitamente assegnato il valore null. In questa modalità i tipi di variabili sono rigorosamente considerati, permettendo al compilatore di applicare ottimizzazioni aggiuntive. La corrispondenza dei tipi viene controllata in fase di compilazione; ad esempio, nel caso in cui si tenti di assegnare il valore «Null» a una variabile di tipo che non consente uno stato indefinito, come «int», verrà generato un errore.
- Sono stati proposti set uniformi di regole per l'analizzatore di codice (linter), che garantiscono il supporto simultaneo per il controllo delle conformità alle raccomandazioni stilistiche per Dart e il framework Flutter. Per motivi storici, le regole di formattazione per Flutter e Dart differivano; inoltre, per Dart esistevano due set di regole — quello pedante di Google e le regole della comunità di sviluppatori Dart. Con Dart 2.14 è stato introdotto un nuovo set comune di regole per il linter, che sarà applicato per impostazione predefinita nei nuovi progetti Dart e nel Flutter SDK. Il set include regole di base (pacchetto lints/core.yaml), regole aggiuntive consigliate (lints/recommended.yaml) e raccomandazioni specifiche per Flutter (flutter_lints/flutter.yaml). Gli utenti delle regole pedanti sono invitati a passare a un nuovo stile di codifica, basato sulle raccomandazioni della documentazione di Dart.
- Nel formatter sono state apportate ottimizzazioni al formato dei blocchi di codice cascata, che consentono di migliorare sensibilmente le prestazioni di formattazione ed evitare interpretazioni ambigue della pertinenza 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 durante la formattazione ora si separa: var result = errorState ? foo : bad ..doIt();
- Nel SDK è stato aggiunto il supporto per i processori Apple M1 (Silicon), che include sia la possibilità di eseguire Dart VM, strumenti e componenti SDK su sistemi con processori 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 esclusi dalla pubblicazione del pacchetto nel repository pub.dev. Le impostazioni specificate non sovrappongono l'elenco di esclusione «.gitignore» (in alcune situazioni, in pub.dev è necessario non trasferire file che sono necessari in Git, ad esempio, script interni utilizzati in fase di sviluppo).
- È stato effettuato un lavoro per migliorare le prestazioni del team «dart test», che ora non richiede la ricompilazione dei test dopo aver modificato il pubspec, se il numero di versione non è cambiato.
- È stata interrotta la supporto per la compilazione in modalità compatibilità con ECMAScript 5 (questa modifica comporterà la perdita di compatibilità con il browser IE11).
- Sono state dichiarate obsolete alcune utility separate come stagehand, dartfmt e dart2native, sostituite da comandi integrati richiamabili tramite l'utility dart.
- È stato declassato il meccanismo delle VM Native Extensions. Per chiamare codice nativo da codice Dart, è consigliato utilizzare il nuovo interfaccia Dart FFI (Foreign Function Interface).
In contemporanea, è stata presentata una significativa release del framework per la costruzione di interfacce utente Flutter 2.5, considerata un'alternativa a React Native, che consente di rilasciare applicazioni per le piattaforme iOS, Android, Windows, macOS e Linux, nonché di creare applicazioni per l'esecuzione nei browser. Su Flutter è costruita l'interfaccia utente del sistema operativo a microkernel Fuchsia in fase di sviluppo da Google.
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.
Principali cambiamenti in Flutter 2.5:
- Sono state apportate significative ottimizzazioni delle prestazioni. Sulle piattaforme iOS e macOS è stata implementata la precompilazione degli shader per l'API grafica Metal. È stata aumentata l'efficienza del processamento degli eventi asincroni. Risolto il problema dei ritardi durante il rilascio della memoria da parte del garbage collector per le immagini non utilizzate (ad esempio, durante la riproduzione di un GIF animato di 20 secondi, il numero di operazioni di garbage collection è stato ridotto da 400 a 4). I ritardi nella trasmissione dei messaggi tra Dart e Objective-C/Swift (iOS) o Java/Kotlin (Android) sono stati ridotti fino al 50%. È stata aggiunta la supporto per la compilazione nativa sui sistemi basati su chip Apple Silicon.

- Per la piattaforma Android è stata stabilita la supporto per il funzionamento delle applicazioni in modalità fullscreen. È continuata l'implementazione del concetto di design "Material You", presentato come una versione del Material Design di nuova generazione. È stato aggiunto un nuovo stato MaterialState.scrolledUnder, implementata la visualizzazione dinamica delle barre di scorrimento durante il cambio delle dimensioni e proposto un nuovo interface per la visualizzazione dei banner di notifiche.
- Sono state ampliate significativamente le funzionalità del plugin per la gestione della fotocamera, che ora include strumenti per il controllo dell'autofocus, dell'esposizione, del flash, dello zoom, della riduzione del rumore e della risoluzione.
- Migliorati gli strumenti per gli sviluppatori (DevTools), che ora offrono una modalità di ispezione dei widget aggiornata, oltre a strumenti per identificare ritardi nel rendering e monitorare la compilazione degli shader.

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


