Sono disponibili il linguaggio di programmazione Dart 2.15 e il framework Flutter 2.8

Google ha pubblicato il rilascio del linguaggio di programmazione Dart 2.15, che continua lo sviluppo di un ramo radicalmente riprogettato di Dart 2, che differisce dalla versione originale del linguaggio Dart per l'uso di una forte digitazione statica (i tipi possono essere dedotti automaticamente, quindi non è necessario specificare i tipi, ma la tipizzazione dinamica non viene più utilizzata e inizialmente calcolato il tipo viene assegnato alla variabile e successivamente viene applicato un controllo rigoroso del tipo).

Caratteristiche del linguaggio Dart:

  • Sintassi familiare e facile da apprendere, naturale per i programmatori JavaScript, C e Java.
  • Garantisce avvio rapido e prestazioni elevate per tutti i browser Web moderni e vari tipi di ambienti, dai dispositivi portatili ai server potenti.
  • La capacità di definire classi e interfacce che consentono l'incapsulamento e il riutilizzo di metodi e dati esistenti.
  • La specifica dei tipi semplifica il debug e l'identificazione degli errori, rende il codice più chiaro e leggibile e ne semplifica la modifica e l'analisi da parte di sviluppatori di terze parti.
  • I tipi supportati includono: vari tipi di hash, matrici ed elenchi, code, tipi numerici e di stringa, tipi per determinare data e ora, espressioni regolari (RegExp). È possibile creare i propri tipi.
  • Per organizzare l'esecuzione parallela, si propone di utilizzare classi con l'attributo isolate, il cui codice viene eseguito interamente in uno spazio isolato in un'area di memoria separata, interagendo con il processo principale inviando messaggi.
  • Supporto per l'utilizzo di librerie che semplificano il supporto e il debug di progetti web di grandi dimensioni. È possibile includere implementazioni di funzioni di terze parti sotto forma di librerie condivise. Le applicazioni possono essere divise in parti e affidare lo sviluppo di ciascuna parte a un team separato di programmatori.
  • Una serie di strumenti già pronti per supportare lo sviluppo nel linguaggio Dart, inclusa l'implementazione di strumenti di sviluppo dinamico e debug con correzione del codice al volo (“modifica e continua”).
  • Per semplificare lo sviluppo nel linguaggio Dart, viene fornito con un SDK, un pub gestore pacchetti, un analizzatore di codice statico dart_analyzer, un set di librerie, un ambiente di sviluppo integrato DartPad e plugin abilitati 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 contiene circa 22mila pacchetti.

Principali modifiche nella versione Dart 2.15:

  • Fornisce strumenti per l'esecuzione parallela rapida di attività con isolamento dei gestori. Sui sistemi multi-core, il runtime Dart per impostazione predefinita esegue il codice dell'applicazione su un core della CPU e utilizza altri core per eseguire attività di sistema come I/O asincrono, scrittura su file o esecuzione di chiamate di rete. Per le applicazioni che necessitano di eseguire i propri gestori in parallelo, ad esempio, per eseguire il rendering dell'animazione nell'interfaccia, è possibile lanciare blocchi di codice separati (isolati), isolati l'uno dall'altro ed eseguiti su altri core della CPU contemporaneamente al thread principale dell'applicazione . Per proteggersi dagli errori che si verificano durante l'esecuzione simultanea di codice che funziona con lo stesso set di dati, è vietata la condivisione di oggetti mutabili in diversi blocchi isolati e viene utilizzato un modello di passaggio di messaggi per l'interazione tra i gestori.

    Dart 2.15 introduce un nuovo concetto: gruppi di blocchi isolati (gruppi isolati), che consente di organizzare l'accesso condiviso a varie strutture di dati interne in blocchi isolati che fanno parte dello stesso gruppo, il che può ridurre significativamente il sovraccarico durante l'interazione tra gestori in un gruppo . Ad esempio, il lancio di un blocco isolato aggiuntivo in un gruppo esistente è 100 volte più veloce e richiede 10-100 volte meno memoria rispetto al lancio di un blocco isolato separato, grazie all'eliminazione della necessità di inizializzare le strutture dei dati del programma.

    Nonostante il fatto che i blocchi isolati in un gruppo impediscano ancora l'accesso condiviso a oggetti mutabili, i gruppi utilizzano una memoria heap condivisa, che può accelerare significativamente il trasferimento di oggetti da un blocco a un altro senza la necessità di eseguire operazioni di copia ad alta intensità di risorse. La nuova versione consente inoltre di passare il risultato del gestore quando si chiama Isolate.exit() per trasferire i dati al blocco isolato padre senza copiare operazioni. Inoltre, il meccanismo di trasmissione dei messaggi è stato ottimizzato: i messaggi piccoli e medi vengono ora elaborati circa 8 volte più velocemente. Gli oggetti che possono essere passati tra isolati utilizzando la chiamata SendPort.send() includono alcuni tipi di funzioni, chiusure e analisi dello stack.

  • Negli strumenti per la creazione di puntatori a singole funzioni in altri oggetti (tear-off), sono state rimosse le restrizioni sulla creazione di puntatori simili nel codice del costruttore, il che può essere utile quando si creano interfacce basate sulla libreria Flutter. Ad esempio, per creare un widget Colonna che includa più widget Testo, puoi chiamare ".map()" e passare puntatori al costruttore Text.new dell'oggetto Testo: class FruitWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Colonna( figli: ['Apple', 'Orange'].map(Text.new).toList()); } }
  • Le possibilità legate all'uso dei puntatori a funzione sono state ampliate. Aggiunta la possibilità di utilizzare metodi generici e puntatori a funzione per creare un metodo e puntatore non generico: T id (valore T) => valore; var intId = id ; // consentito nella versione 2.15 invece di "int Function(int) intId = id;" const fo = id; // puntatore all'id della funzione. cost c1 = fo ;
  • La libreria dart:core ha migliorato il supporto per le enumerazioni, ad esempio ora puoi generare un valore stringa da ciascun valore enum utilizzando il metodo ".name", selezionare valori per nome o abbinare coppie di valori: enum MyEnum { one , due, tre } void main() { print(MyEnum.one.name); // Verrà stampato "uno". print(MyEnum.values.byName('due') == MyEnum.two); // Verrà stampato "true". mappa finale = MyEnum.values.asNameMap(); print(map['tre'] == MioEnum.tre); // "VERO". }
  • È stata implementata una tecnica di compressione dei puntatori che consente l'utilizzo di una rappresentazione più compatta dei puntatori in ambienti a 64 bit se per l'indirizzamento è sufficiente uno spazio indirizzi a 32 bit (non vengono utilizzati più di 4 GB di memoria). I test hanno dimostrato che tale ottimizzazione consente di ridurre la dimensione dell'heap di circa il 10%. Nell'SDK Flutter, la nuova modalità è già abilitata per Android per impostazione predefinita e si prevede che sarà abilitata per iOS in una versione futura.
  • Dart SDK include strumenti per il debug e l'analisi delle prestazioni (DevTools), che in precedenza venivano forniti in un pacchetto separato.
  • Sono stati aggiunti strumenti al comando “dart pub” e ai repository del pacchetto pub.dev per tracciare la pubblicazione accidentale di informazioni riservate, ad esempio lasciando le credenziali per i sistemi di integrazione continua e gli ambienti cloud all'interno del pacchetto. Se vengono rilevate tali perdite, l'esecuzione del comando “dart pubpublish” verrà interrotta con un messaggio di errore. Nel caso si verificasse un falso positivo è possibile bypassare il controllo tramite una white list.
  • Nel repository pub.dev è stata aggiunta la possibilità di revocare una versione già pubblicata di un pacchetto, ad esempio se vengono scoperti errori o vulnerabilità pericolose. In precedenza, per tali correzioni, la pratica era quella di pubblicare una versione correttiva, ma in alcune situazioni è necessario annullare la versione esistente e interromperne urgentemente l'ulteriore distribuzione (ad esempio, se la correzione non è ancora pronta o se è stata rilasciata una versione completa pubblicata per errore invece di una versione di prova). Dopo la revoca, il pacchetto non viene più identificato nei comandi “pub get” e “pub upgrade” e, sui sistemi che lo hanno già installato, viene emesso un avviso speciale alla successiva esecuzione di “pub get”.
  • Aggiunta protezione contro una vulnerabilità (CVE-2021-22567) causata dall'uso di caratteri unicode nel codice che modificano l'ordine di visualizzazione.
  • Risolta una vulnerabilità (CVE-2021-22568) che consente di impersonare un altro utente pub.dev durante la pubblicazione di pacchetti su un server di terze parti che accetta token di accesso pub.dev oauth2. Ad esempio, la vulnerabilità potrebbe essere utilizzata per attaccare i server di pacchetti interni e aziendali. Gli sviluppatori che ospitano pacchetti solo su pub.dev non sono interessati da questo problema.

Contestualmente è stato presentato un significativo rilascio del framework di interfaccia utente Flutter 2.8, che viene considerato alternativo a React Native e consente, sulla base di un'unica codebase, di rilasciare applicazioni per iOS, Android, Windows, macOS e Piattaforme Linux, oltre a creare applicazioni da eseguire nei browser. Sulla base di Flutter è costruita una shell personalizzata per il sistema operativo microkernel Fuchsia sviluppato da Google. Va notato che negli ultimi sei mesi il numero di applicazioni Flutter 2 nel Google Play Store è aumentato da 200mila a 375mila, ovvero quasi due volte.

La parte principale del codice Flutter è implementata nel linguaggio Dart e il motore runtime per l'esecuzione delle applicazioni è scritto in C++. Durante lo sviluppo di applicazioni, oltre al linguaggio Dart nativo di Flutter, puoi utilizzare l'interfaccia Dart Foreign Function per chiamare il codice C/C++. Si ottengono prestazioni di esecuzione elevate compilando le applicazioni in codice nativo per le piattaforme di destinazione. In questo caso, non è necessario ricompilare il programma dopo ogni modifica: Dart fornisce una modalità di ricaricamento a caldo che consente di apportare modifiche all'applicazione in esecuzione e valutare immediatamente il risultato.

Tra le modifiche nella nuova versione di Flutter si segnala l'ottimizzazione della velocità di lancio e del consumo di memoria sui dispositivi mobili. È più semplice connettere le app ai servizi backend come Firebase e Google Cloud. Gli strumenti per l'integrazione con Google Ads sono stati stabilizzati. Il supporto per fotocamere e plug-in Web è stato notevolmente migliorato. Sono stati proposti nuovi strumenti per semplificare lo sviluppo, ad esempio è stato aggiunto un widget per l'autenticazione tramite Firebase. Il motore Flame, progettato per lo sviluppo di giochi 2D utilizzando Flutter, è stato aggiornato.

Fonte: opennet.ru

Aggiungi un commento