Google har udgivet version 2.15 af programmeringssproget Dart, som fortsætter udviklingen af den fundamentalt omarbejdede gren af Dart 2, der adskiller sig fra den oprindelige version ved at bruge stærk statisk typisering (typer kan automatisk udledes, så det er ikke nødvendigt at angive typer, men dynamisk typisering anvendes ikke længere, og den oprindeligt udledte type knyttes til variablen og anvendes derefter til streng typekontrol).
Funktioner ved Dart-sproget:
- En velkendt og letlæselig syntaks, som er naturlig for programmører med erfaring i JavaScript, C og Java.
- Sikrer hurtig opstart og høj ydeevne for alle moderne webbrowsere og forskellige typer miljøer, fra mobile enheder til kraftfulde. servere.
- Mulighed for at definere klasser og interfaces, som muliggør inkapsling og genbrug af eksisterende metoder og data.
- Angivelse af typer letter fejlfinding og fejlidentifikation, gør koden mere klar og læsbar, og letter videreudvikling og analyse af tredjeparter.
- Blandt de understøttede typer er: forskellige typer hashes, arrays og lister, queues, numeriske og strenge typer, typer til dato og tid, regulære udtryk (RegExp). Der er mulighed for at oprette egne typer.
- Til at organisere parallel udførelse anbefales det at bruge klasser med attributten isolate, hvis kode udføres fuldstændigt i et isoleret rum i et separat hukommelsesområde, og interagerer med hovedprocessen ved at sende beskeder.
- Understøttelse af brug af biblioteker, der letter vedligeholdelse og debugging af store webprojekter. Tredjepartsimplementeringer af funktioner kan tilsluttes som delte biblioteker. Applikationer kan opdeles i dele, og udviklingen af hver del kan overdrages til et separat hold af programmører.
- Et sæt færdige værktøjer til støtte for udvikling i Dart-sproget, inklusive implementering af værktøjer til dynamisk udvikling og debugging med rettelser af kode i realtid ("edit-and-continue").
- For easier development in the Dart language, an SDK is provided, along with the package manager pub, the static code analyzer dart_analyzer, a set of libraries, the integrated development environment DartPad, and Dart support plugins for IntelliJ IDEA, WebStorm, Emacs, Sublime Text 2, and Vim.
- Yderligere pakker med biblioteker og værktøjer distribueres via pub-repositoriet, der omfatter cirka 22.000 pakker.
De vigtigste ændringer i Dart 2.15:
- Der er blevet introduceret værktøjer til hurtig parallell udførelse af opgaver med isolation af behandlere. På flerkernede systemer kører Dart runtime som standard applikationskoden på en CPU-kerne, mens de andre kerner bruges til udførelse af systemopgaver såsom asynkron input/output, skrivning til filer eller udførelse af netværksanmodninger. For applikationer, der har brug for at køre deres behandlere parallelt, for eksempel til at tegne animationer i brugergrænsefladen, er der mulighed for at køre separate kodeblokke (isolate), som er isolerede fra hinanden og udføres på andre CPU-kerner samtidig med hovedtråden af applikationen. For at beskytte mod fejl, der opstår ved samtidig udførelse af kode, der arbejder med et fælles datasæt, er fælles brug af ændrende objekter forbudt i forskellige isolate-blokke, og kommunikationen mellem behandlerne foregår via en meddelelsesoverførselsmodel.
Dart 2.15 introducerer et nyt koncept — grupper af isolerede blokke (isolate groups), der gør det muligt at organisere fælles adgang til forskellige interne datalagringsstrukturer i de isolerede blokke, der tilhører en enkelt gruppe, hvilket væsentligt reducerer overhead ved interaktion mellem behandlere i gruppen. For eksempel udføres opstart af en ekstra isolate-blok i en eksisterende gruppe 100 gange hurtigere og kræver 10-100 gange mindre hukommelse end opstart af en separat isolate-blok, fordi det eliminerer behovet for at initialisere programmets datalagringsstrukturer.
Selvom det stadig er forbudt at dele ændrede objekter i isolate-blokke, benytter grupper fælles heap-hukommelse, hvilket signifikant fremskynder overførslen af objekter fra en blok til en anden uden behov for ressourcekrævende kopioperationer. Den nye version tillader også at transmittere resultatet af en handler ved kald af Isolate.exit() for at overføre data til den overordnede isolate-blok uden kopioperationer. Derudover er mekanismen til meddelelsesoverførsel optimeret — små og mellemstore meddelelser behandles nu cirka otte gange hurtigere. Der er blevet tilføjet visse funktions- og lukkeobjekttyper, der nu kan overføres mellem isolate-blokke ved hjælp af SendPort.send().
- I værktøjerne til at oprette pegepunkter til individuelle funktioner i andre objekter (tear-off) er begrænsningerne for oprettelsen af sådanne pegepunkter i konstruktionskode blevet fjernet, hvilket kan være nyttigt ved opbygning af grænseflader baseret på Flutter-biblioteket. For eksempel, for at oprette et Column-widget, der inkluderer flere Text-widgets, kan man kalde '.map()' og overføre pegepunkter i Text.new konstruktøren for objektet Text: class FruitWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children: [‘Apple’, ‘Orange’].map(Text.new).toList()); } }
- Mulighederne for brugen af funktionspegepunkter er blevet udvidet. Der er tilføjet mulighed for at anvende generiske metoder og funktionspegepunkter til at oprette en ikke-generisk metode og pegepunkt: T id(T value) => value; var intId = id; // tilladt i version 2.15 i stedet for 'int Function(int) intId = id;' const fo = id; // pegepunkter til funktionen id. const c1 = fo;
- I dart:core-biblioteket er understøttelsen af enums blevet forbedret, for eksempel kan man nu få den strenge værdi ud fra hver enum-værdi ved hjælp af '.name'-metoden, udføre valg af værdier efter navn eller foretage værdi-par matchning: enum MyEnum { one, two, three } void main() { print(MyEnum.one.name); // vil udskrive 'one'. print(MyEnum.values.byName(‘two’) == MyEnum.two); // vil udskrive 'true'. final map = MyEnum.values.asNameMap(); print(map[‘three’] == MyEnum.three); // 'true'. }
- Teknikken til komprimering af pegere er blevet implementeret, hvilket muliggør en mere kompakt repræsentation af pegere i 64-bit omgivelser, hvis 32-bit adresseområde er tilstrækkeligt til adressering (bruger ikke mere end 4 GB hukommelse). Tests har vist, at en sådan optimering gør det muligt at reducere bunke størrelsen med cirka 10%. I Flutter SDK er den nye tilstand som standard aktiveret for Android, og i en fremtidig udgivelse er det planlagt til at blive aktiveret for iOS.
- Dart SDK inkluderer værktøjer til fejlfinding og præstationsanalyse (DevTools), som tidligere blev leveret i en separat pakke.
- I 'dart pub'-kommandoen og pakkeopbevaringen pub.dev er værktøjer blevet tilføjet til at overvåge utilsigtet offentliggørelse af fortrolige oplysninger, såsom at efterlade adgangsoplysninger til kontinuerlig integrationssystemer og cloudmiljøer inde i en pakke. Hvis sådanne lækager opdages, vil udførelsen af kommandoen 'dart pub publish' blive afbrudt med en fejlmeddelelse. I tilfælde af falsk alarm er der mulighed for at omgå kontrol gennem en hvidliste.
- Muligheden for at tilbagekalde en allerede offentliggjort version af en pakke er blevet tilføjet til pub.dev-depotet, for eksempel ved opdagelse af alvorlige fejl eller sårbarheder. Tidligere var det praksis at offentliggøre en korrigerende version bagefter, men i nogle situationer er det nødvendigt at annullere den udgivelse, der allerede har fundet sted, og hurtigt stoppe dens videre distribution (for eksempel hvis rettelserne endnu ikke er klar, eller hvis en fuld version utilsigtet er blevet offentliggjort i stedet for en testversion). Efter tilbagekaldelsen vil pakken ikke længere blive identifiziert i 'pub get' og 'pub upgrade' kommandoerne, og på systemer, der allerede har installeret den, vil der blive givet en særlig advarsel ved næste udførelse af 'pub get'.
- Der er tilføjet beskyttelse mod sårbarheden (CVE-2021-22567) forårsaget af brugen af unicode-tegn i koden, der ændrer visningsrækkefølgen.
- Sårbarheden (CVE-2021-22568) er blevet løst, hvilket gjorde det muligt at udgive sig for en anden bruger på pub.dev ved offentliggørelse af pakker på en tredjepartsserver, der accepterer oauth2-adgangstokens fra pub.dev. For eksempel kan sårbarheden anvendes til angreb på interne og virksomheders pakke-servere. Problemet påvirker ikke udviklere, der kun hoster pakker på pub.dev.
Samtidig blev en betydelig udgave af brugergrænseflade-rammen Flutter 2.8 præsenteret, som betragtes som et alternativ til React Native og gør det muligt at udgive applikationer til iOS, Android, Windows, macOS og Linux baseret på én kodebase, samt at skabe applikationer til kørsel i browsere. På baggrund af Flutter er den brugerdefinerede grænseflade for Googles mikrokerne operativsystem Fuchsia blevet udviklet. Det bemærkes, at antallet af applikationer på Flutter 2 i Google Play Butik er steget fra 200.000 til 375.000 i de sidste seks måneder, dvs. næsten det dobbelte.
Den primære del af Flutter-koden er implementeret på Dart-sproget, mens runtime-motoren til at køre applikationer er skrevet i C++. Ved udvikling af applikationer kan man ud over det native Dart-sprog anvende Dart Foreign Function Interface til at kalde C/C++-kode. Høj ydeevne opnås ved at kompilere applikationer til maskinkode for de målrettede platforme. Programmet behøver ikke at blive genkompileret efter hver ændring — Dart tilbyder en hot reload-tilstand, der gør det muligt at foretage ændringer i den kørende applikation og straks evaluere resultatet.
Blandt ændringerne i den nye version af Flutter fremhæves optimeringen af opstartshastighed og hukommelsesforbrug på mobile enheder. Tilslutningen af applikationer til backend-tjenester som Firebase og Google Cloud er blevet forenklet. Værktøjer til integration med Google Ads er blevet stabiliseret. Støtten til kameraer og web-plugins er betydeligt forbedret. Nye værktøjer er blevet tilbudt for at forenkle udviklingen, f.eks. er der tilføjet en widget til autentificering ved hjælp af Firebase. Flame-motoren til udvikling af 2D-spil ved hjælp af Flutter er blevet opdateret.
Kilde: opennet.ru
