La strada per Dart 3: un linguaggio completamente valido e null safe
Negli ultimi quattro anni, abbiamo trasformato Dart in un linguaggio veloce, portatile e moderno. La nostra prossima versione, Dart 3, completa il viaggio verso un linguaggio null safe completamente valido . Come ultimo passaggio di questo viaggio, stiamo rimuovendo diversi artefatti storici del linguaggio Dart e dell'SDK, inclusa la rimozione del supporto per l'esecuzione senza una solida sicurezza nulla . Ciò semplifica l'apprendimento di Dart e ci consente di evolvere Dart SDK per supportare nuove funzionalità con maggiore velocità. Per conoscere i principali cambiamenti in Dart 3 e come preparare al meglio le tue app e i tuoi pacchetti, continua a leggere!
Perché suonare la sicurezza nulla?
Molti linguaggi di programmazione moderni supportano la null safety (nota anche come void safety ). Ciò evita problemi di dereferenziazione nulla, che Tony Hoare ha coniato un errore da un miliardo di dollari: "Ciò ha portato a innumerevoli errori, vulnerabilità e arresti anomali del sistema, che hanno probabilmente causato un miliardo di dollari di dolore e danni negli ultimi quarant'anni" ( Hoare 2009 ). Per risolvere questo problema, linguaggi come Swift, C# e Kotlin supportano un sistema di tipi in cui è possibile dichiarare variabili non nulle ( non possono mai contenere un valore nullo) o nullable(può contenere un valore o null). Questo sistema di tipi può essere combinato con l'analisi statica per rilevare qualsiasi assegnazione di null a variabili non annullabili. Il supporto di sicurezza null nel linguaggio Dart utilizza un modello simile, rendendo le variabili non annullabili per impostazione predefinita e consentendo valori null solo quando dichiarati in modo esplicito.
Facendo un ulteriore passo avanti, Dart introduce una solida sicurezza nulla in un linguaggio esistente . Un sistema audio garantisce che una variabile non annullabile non contenga mai un valore nullo. Durante la pianificazione iniziale di Dart Null Safety, abbiamo esplorato questo argomento e i compromessi che avevano preso altri linguaggi. Il design di Swift includeva solidità fin dall'inizio. TypeScript è intrinsecamente malsano, poiché il suo sistema di tipi sottostante consente di visualizzare qualsiasi oggetto come qualsiasi tipo statico. Come puoi vedere in questo esempio TypeScript , possiamo assegnare un valore nullo a una variabile non nulla. Sia per ragioni ergonomiche che per evitare la migrazione di tutto il codice esistente, C# presenta diverse eccezioniai loro assegni nulli. Kotlin ha diverse eccezioni sbagliate , in parte a causa del suo obiettivo di interagire con Java. Come puoi vedere in questo esempio di Kotlin, i tipi generici possono attivare casi in cui i valori null possono fluire in un elenco dichiarato come contenente elementi non null.
Per Dart, abbiamo scelto la strada della solida sicurezza nulla. Ciò ha comportato un compromesso. In alcuni casi, ciò ha reso la migrazione alla sicurezza null un po' più costosa, ma si traduce in un sistema di tipo audio con completa fiducia nelle annotazioni di tipo non null. Possiamo ottimizzare l'implementazione nei nostri compilatori e runtime in base all'aspetto di nullability del sistema di tipi. Sappiamo esattamente quando una variabile non è nulla . Pensiamo che questi fossero i giusti compromessi per Dart.
In Dart 3, tutto il codice Dart utilizzerà una solida sicurezza nulla
Problema di tracciamento: SDK n. 49530 .
Sono passati tre anni da quando abbiamo introdotto la sicurezza null nel linguaggio Dart in Dart 2.12 . Come accennato nella sezione precedente, riconosciamo l'impatto necessario per migrare i pacchetti e le app Dart esistenti. Per agevolare la migrazione, Dart ha supportato l'esecuzione del codice dell'app in tre modi. Può essere eseguito senza sicurezza nulla, in modalità mista con sicurezza nulla parziale o con sicurezza nulla completa del suono. La piena sicurezza del suono nullo si verifica quando il 100% del codice, incluse tutte le dipendenze, è stato migrato. Ciò ha dato agli sviluppatori di Dart il tempo di migrare il codice esistente un passo alla volta. Tuttavia, avere il supporto per diverse modalità ha aggiunto sovraccarico e complessità.
Innanzitutto, gli sviluppatori di Dart devono essere a conoscenza di tutte e tre le modalità. Ogni volta che leggi un pezzo di codice Dart, devi controllare la versione della lingua per vedere se i tipi sono non null per impostazione predefinita, nullable per impostazione predefinita o una loro combinazione.
In secondo luogo, il supporto di tutte e tre le modalità nei nostri compilatori e runtime rallenta l'evoluzione di Dart SDK. Questo supporto aumenta il costo e la complessità dell'aggiunta di nuove funzionalità.
In Dart 3, sound null safety sarà, come accennato e annunciato in precedenza, l' unica modalità supportata . I file Pubspec con un vincolo SDK con un limite inferiore inferiore a 2,12 smetteranno di risolversi in Dart 3 e versioni successive. Qualsiasi codice sorgente contenente marcatori di lingua fallirà quando si imposta il vincolo su un valore inferiore a 2.12 (ad esempio // @dart=2.9).
Dalla nostra telemetria, riteniamo che circa l'85% di tutte le esecuzioni di flutter run utilizzi una solida sicurezza nulla in questo momento. Se disponi di app o pacchetti nel restante 15%, esegui la migrazione prima della spedizione di Dart 3, che è prevista per la metà del 2023.
Comprendiamo che le migrazioni di codebase di grandi dimensioni possono richiedere del tempo. Crediamo che troverai che la migrazione vale lo sforzo. BMW ha recentemente migrato la sua principale app MyBMW, un'app molto grande creata da un team di circa 300 sviluppatori:
“Sebbene la migrazione alla sicurezza nulla non sia stata certamente facile per una base di codice su larga scala come l'app MyBMW, gli strumenti di Google ci hanno fornito un grande aiuto nel processo di migrazione. Dopo aver completato la migrazione, ci piace avere una base di codice meno soggetta a errori.", Christian Schmid, BMW AG
Per ulteriori informazioni sulla migrazione, guarda il seguente video o consulta la guida alla migrazione .
Ultime modifiche alla lingua e all'API
Oltre alla modifica della sicurezza nulla, stiamo apportando alcune altre modifiche per rimuovere gli artefatti storici nel linguaggio Dart e nelle API della libreria principale. Queste modifiche includono la rimozione delle API della libreria di base interrotte ( #49529 ), la rimozione di una sintassi storica per i valori dei parametri predefiniti ( #2357 ) e la richiesta che i tear-off siano espliciti ( #2399 ).
Riteniamo che queste modifiche abbiano un impatto ridotto sul codice migrato per utilizzare la sicurezza null. Quando rilasceremo la prima build alfa di Dart 3, sarai in grado di testare rapidamente se una di queste piccole modifiche sostanziali si applica ai tuoi pacchetti o alle tue app.
Nuove funzionalità e capacità di Dart 3
Si prevede inoltre che Dart 3 conterrà una serie di nuove funzionalità, tra cui una migliore interoperabilità con altri linguaggi di programmazione e nuove funzionalità linguistiche. Parleremo molto di più di questo argomento al nostro prossimo grande evento, Flutter Forward , il 25 gennaio 2023.
Diamo un'anteprima di una caratteristica della lingua, chiamata pattern . I pattern rendono il linguaggio Dart molto più espressivo, aggiungono il supporto per dati più strutturati e consentono uno stile più funzionale con tipi di dati algebrici.
Il codice seguente mostra un esempio di utilizzo di più valori restituiti su una funzione, insieme alla possibilità di destrutturarli in singole variabili:
Condivideremo molti altri dettagli su questa nuova funzionalità all'inizio del prossimo anno. Per vedere un'anteprima, puoi controllare le specifiche della lingua
Oltre il dardo 3
Lavoriamo su una moltitudine di potenziali nuove funzionalità in parallelo, passando dall'ideazione alla sperimentazione fino al potenziale lancio. Di conseguenza, alcuni lavori in corso saranno completati dopo Dart 3.
Innanzitutto, come accennato l'anno scorso , stiamo lavorando al supporto per la compilazione del codice Dart in WebAssembly ( Wasm ). Wasm consente alle app Web Flutter di funzionare come codice nativo completo nei browser. Questa è una grande impresa, richiede lavoro, oltre all'aggiornamento dei compilatori Dart. Richiede la collaborazione con il W3C e i fornitori di browser per l'aggiunta del supporto per le lingue Garbage Collected in Wasm tramite l' estensione WasmGC .
In secondo luogo, stiamo lavorando sulle macro . Questi abilitano la metaprogrammazione statica . Questo potente meccanismo consente a un pezzo di codice (una macro) di modificare ed estendere il codice sorgente di un programma durante la compilazione del programma. Ad esempio, questo può ridurre il boilerplate necessario per deserializzare JSON o per creare classi di dati.
Dovresti aspettarti queste funzionalità e altre interessanti dopo Dart 3.
La strada per Dart 3
Come accennato nelle sezioni precedenti, se non hai eseguito la migrazione a una solida sicurezza nulla, questo è il primo passaggio. Ti consigliamo di farlo ora!
Successivamente, Dart 3 verrà implementato in una serie di pietre miliari. Le nostre attuali aspettative ruotano intorno a queste date:
- Intorno a gennaio/febbraio 2023 : rilascio di Dart 3 alpha. Si concentra sull'abilitazione dei primi test di compatibilità di Dart 3. Prevediamo che sarai in grado di eseguire l'analisi statica (
dart analyze/flutter analyze). Il nostro obiettivo è che qualsiasi app o pacchetto che superi l'analisi statica con Dart 3 alpha supporti Dart 3 stable. - Intorno a marzo/aprile 2023 : rilascio di Dart 3 beta. Questa versione presenta in anteprima le nuove funzioni di Dart 3. Puoi usarlo per sperimentare le nuove funzioni e fornire feedback su problemi o suggerimenti per miglioramenti.
- Verso la metà del 2023 : rilascio stabile di Dart 3. Sound null safety diventa l'unica modalità supportata.
Il rilascio di Dart 3 è previsto per il lancio intorno alla metà del 2023. Conterrà diverse modifiche importanti, principalmente l'interruzione dell'esecuzione senza un suono nullo di sicurezza. Ci auguriamo di avere una build alfa di Dart 3 pronta intorno a gennaio o febbraio 2023, che puoi utilizzare per i test di compatibilità di Dart 3.
Per preparare le tue app:
- Completa tutte le migrazioni di sicurezza nulle in sospeso
- Verifica che il codice non utilizzi API obsolete
- Corri
dart fix.

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































