Даступныя мова праграмавання Dart 2.15 і фрэймворк Flutter 2.8

Кампанія Google апублікавала рэліз мовы праграмавання Dart 2.15, які працягнуў развіццё кардынальна перапрацаванай галінкі Dart 2, якая адрозніваецца ад першапачатковага варыянту мовы Dart ужываннем моцнай статычнай тыпізацыі (тыпы могуць выводзіцца аўтаматычна, таму ўказанне тыпаў не з'яўляецца абавязковым, але дынамічная тыпізацыя больш не выкарыстоўваецца і вылічаны першапачаткова тып замацоўваецца за зменнай і ў далейшым прымяняецца строгая праверка тыпу).

Асаблівасці мовы Dart:

  • Звыклы і просты для вывучэння сінтаксіс, натуральны для праграмістаў на JavaScript, Сі і Java.
  • Забеспячэнне хуткага запуску і высокай прадукцыйнасці для ўсіх сучасных вэб-браўзэраў і розных тыпаў акружэнняў, ад партатыўных прылад да магутных сервераў.
  • Магчымасць вызначэння класаў і інтэрфейсаў, якія дазваляюць выкарыстоўваць інкапсуляцыі і паўторна выкарыстоўваць існуючыя метады і дадзеныя.
  • Указанне тыпаў дазваляе спрасціць адладку і выяўленне памылак, робіць код больш ясным і чытэльным, спрашчае яго дапрацоўку і аналіз іншымі распрацоўнікамі.
  • Сярод падтрымліваемых тыпаў: розныя віды хэшаў, масіваў і спісаў, чэргі, лікавыя і радковыя тыпы, тыпы для вызначэння даты і часу, рэгулярныя выразы (RegExp). Ёсць магчымасць стварэння сваіх тыпаў.
  • Для арганізацыі раўналежнага выканання прапануецца выкарыстоўваць класы з атрыбутам isolate, код якіх выконваецца цалкам у ізаляванай прасторы ў асобнай вобласці памяці, узаемадзейнічаючы з асноўным працэсам праз адпраўку паведамленняў.
  • Падтрымка выкарыстання бібліятэк, якія спрашчаюць падтрымку і адладку вялікіх вэб-праектаў. Іншыя рэалізацыі функцый могуць падлучацца ў выглядзе падзяляемых бібліятэк. Прыкладанні можна разбіць на часткі і даручыць распрацоўку кожнай з частак асобнай камандзе праграмістаў.
  • Набор гатовых прылад для падтрымкі распрацоўкі на мове Dart, у тым ліку рэалізацыю сродкаў дынамічнай распрацоўкі і адладкі з выпраўленнем кода на лета («edit-and-continue»).
  • Для спрашчэння распрацоўкі на мове Dart пастаўляецца SDK, пакетны мэнэджар pub, статычны аналізатар кода dart_analyzer, набор бібліятэк, інтэграванае асяроддзе распрацоўкі DartPad і плагіны з падтрымкай Dart для IntelliJ IDEA, WebStorm, Emacs, Sublime Text 2 і Vim.
  • Дадатковыя пакеты з бібліятэкамі і ўтылітамі распаўсюджваюцца праз рэпазітар pub, які налічвае каля 22 тысяч пакетаў.

Асноўныя змены ў выпуску Dart 2.15:

  • Прадастаўлены сродкі для хуткага паралельнага выканання задач з ізаляцыяй апрацоўшчыкаў. На шмат'ядравых сістэмах Dart runtime па змаўчанні выконвае код прыкладання на адным ядры CPU, а іншыя ядры прыцягвае для выканання сістэмных задач, такіх як асінхронны ўвод/вывад, запіс у файлы або здзяйсненне сеткавых выклікаў. Для прыкладанняў, якім неабходна раўналежна выконваць свае апрацоўшчыкі, напрыклад, для адмалёўкі анімацыі ў інтэрфейсе, прадугледжана магчымасць запуску асобных блокаў кода (isolate), ізаляваных сябар ад сябра і выкананых на іншых ядрах CPU адначасова з асноўным струменем прыкладання. Для абароны ад памылак, якія ўзнікаюць пры адначасовым выкананні кода, які працуе з адным наборам дадзеных, у розных у isolate-блоках забаронена сумеснае выкарыстанне змяняных аб'ектаў, а для ўзаемадзеяння паміж апрацоўшчыкамі ўжываецца мадэль на аснове перадачы паведамленняў.

    У Dart 2.15 прапанавана новая канцэпцыя – групы ізаляваных блокаў (isolate groups), якая дазваляе арганізаваць сумесны доступ да розных унутраных структур дадзеных у isolate-блоках, якія ўваходзяць у адну групу, што дазваляе значна знізіць накладныя выдаткі пры ўзаемадзеянні апрацоўшчыкаў у групе. Напрыклад, запуск дадатковага isolate-блока ў існуючай групе выконваецца ў 100 разоў хутчэй і патрабуе ў 10-100 разоў менш памяці, чым запуск адасобленага isolate-блока, за кошт выключэння неабходнасці ініцыялізацыі структур дадзеных праграмы.

    Нягледзячы на ​​тое, што ў isolate-блоках у групе па-ранейшаму забаронены сумесны доступ да змяняных аб'ектаў, у групах выкарыстоўваецца агульная heap-памяць, што дазваляе значна паскорыць перадачу аб'ектаў з аднаго блока ў іншы без неабходнасці выканання рэсурсаёмістых аперацый капіявання. У новай версіі таксама дазволена перадаваць вынік працы апрацоўшчыка пры выкліку Isolate.exit() для перадачы даных у бацькоўскі isolate-блок без аперацый капіявання. Акрамя таго праведзена аптымізацыя механізму перадачы паведамленняў - невялікія і сярэднія паведамленні зараз апрацоўваюцца прыблізна ў 8 разоў хутчэй. У лік аб'ектаў, якія можна перадаваць паміж isolate-блокамі пры дапамозе выкліку SendPort.send(), уключаны некаторыя тыпы функцый, замыканні і трасіроўкі стэка.

  • У сродках для стварэння паказальнікаў на асобныя функцыі ў іншых аб'ектах (tear-off) зняты абмежаванні па стварэнні падобных паказальнікаў у кодзе канструктараў, што можа быць карысным пры пабудове інтэрфейсаў на базе бібліятэкі Flutter. Напрыклад, для стварэння віджэта Column, які ўключае некалькі віджэтаў Text, можна выклікаць ".map()" і перадаць паказальнікі ў канструктар Text.new аб'екта Text: class FruitWidget extends StatelessWidget { ['Apple', 'Orange'].map(Text.new).toList()); } }
  • Пашыраны магчымасці, звязаныя з выкарыстаннем паказальнікаў на функцыі. Дададзена магчымасць прымяняць абагульненыя (generic) метады і паказальнікі функцый для стварэння не-generic метаду і паказальніка: T id (T value) => value; var intId = id ; // дазволена ў версіі 2.15 замест "int Function(int) intId = id;" const fo = id; // паказальнік на функцыю id. const c1 = fo ;
  • У бібліятэцы dart:core палепшана падтрымка пералічэнняў (enum), напрыклад, зараз можна выводзіць радковае значэнне з кожнага значэння enum пры дапамозе метаду ".name", ажыццяўляць выбарку значэнняў па імені або выконваць супастаўленне пар значэнняў: enum MyEnum { one, two, three } void main() { print(MyEnum.one.name); // будзе выведзена "one". print(MyEnum.values.byName('two') == MyEnum.two); // будзе выведзена "true". final map = MyEnum.values.asNameMap(); print(map['three'] == MyEnum.three); // "true". }
  • Рэалізавана тэхніка сціску паказальнікаў, якая дазваляе выкарыстоўваць больш кампактнае ўяўленне паказальнікаў у 64-разрадных асяродках, калі для адрасавання дастаткова 32-разраднай адраснай прасторы (выкарыстоўваецца не больш за 4 ГБ памяці). Тэсты паказалі, што такая аптымізацыя дае магчымасць скараціць памер кучы прыблізна на 10%. Ва Flutter SDK па змаўчанні новы рэжым ужо актываваны для Android, а ў будучыні выпуску запланаваны для ўключэння для iOS.
  • У склад Dart SDK уключаны прылады для адладкі і аналізу прадукцыйнасці (DevTools), якія раней пастаўляліся ў асобным пакеце.
  • У каманду «dart pub» і рэпазітары пакетаў pub.dev дададзеныя сродкі для адсочвання выпадковай публікацыі канфідэнцыйнай інфармацыі, напрыклад, пакіданне ўнутры пакета ўліковых дадзеных для сістэм бесперапыннай інтэграцыі і хмарных асяродкаў. У выпадку выяўленне падобных уцечак выкананне каманды "dart pub publish" будзе перапынена з паведамленнем пра памылку. У выпадку, калі мела месца ілжывае спрацоўванне прадастаўлена магчымасць абыходу праверкі праз белы спіс.
  • У рэпазітар pub.dev дададзена магчымасць адклікання ўжо апублікаванай версіі пакета, напрыклад, у выпадку выяўлення небяспечных памылак або ўразлівасцяў. Раней для падобных выпраўленняў практыкавалася публікацыя следам якая карэктуе версіі, але ў некаторых сітуацыях патрабуецца менавіта адмяніць які адбыўся выпуск і экстрана спыніць яго наступнае распаўсюджванне (напрыклад, калі выпраўленні яшчэ не гатова або калі па памылцы замест тэставай версіі быў апублікаваны паўнавартасны выпуск). Пасля адклікання пакет перастае вызначацца ў камандах "pub get" і "pub upgrade", а на ўжо ўсталявалі яго сістэмах пры чарговым выкананні "pub get" выдаецца спецыяльнае папярэджанне.
  • Дададзена абарона ад уразлівасці (CVE-2021-22567), выкліканай ужываннем у кодзе unicode-знакаў, якія змяняюць парадак адлюстравання.
  • Ухіленая ўразлівасць (CVE-2021-22568), якая дазваляе выдаць сябе за іншага карыстача pub.dev пры публікацыі пакетаў на іншы сервер, які прымае oauth2-токены доступу pub.dev. Напрыклад, уразлівасць можа прымяняцца для нападу на ўнутраныя і карпаратыўныя серверы пакетаў. Распрацоўнікаў, якія размяшчаюць пакеты толькі на pub.dev, праблема не закранае.

Адначасова прадстаўлены значны рэліз фрэймворка пабудовы інтэрфейсу карыстача Flutter 2.8, які разглядаецца як альтэрнатыва React Native і дазваляе на аснове адной кодавай базы выпускаць прыкладанні для платформаў iOS, Android, Windows, macOS і Linux, а таксама ствараць прыкладанні для запуску ў браўзэрах. На аснове Flutter пабудавана карыстацкая абалонка якая развіваецца ў Google мікраядзернай аперацыйнай сістэмы Fuchsia. Адзначаецца, што за апошнія шэсць месяцаў колькасць прыкладанняў на Flutter 2 у Google Play Store павялічылася з 200 тысяч да 375 тысяч, г.зн. амаль у два разы.

Асноўная частка кода Flutter рэалізаваная на мове Dart, а runtime-рухавічок для выканання прыкладанняў напісаны на C++. Пры распрацоўцы прыкладанняў, апроч роднай для Flutter мовы Dart, можна выкарыстоўваць інтэрфейс Dart Foreign Function для выкліку кода на C/C++. Высокая прадукцыйнасць выканання дасягаецца дзякуючы кампіляцыі прыкладанняў у машынны код для мэтавых платформ. Пры гэтым праграму не трэба перакампіляваць пасля кожнай змены — Dart дае рэжым гарачай перазагрузкі, які дазваляе ўносіць змены ў працуючае прыкладанне і адразу ацэньваць вынік.

З змен у новым выпуску Flutter адзначаецца правядзенне аптымізацыі хуткасці запуску і спажыванні памяці на мабільных прыладах. Спрошчана падлучэнне прыкладанняў да бэкэнд-сэрвісаў, такім як Firebase і Google Cloud. Стабілізаваны інструменты для інтэграцыі з Google Ads. Значна палепшана падтрымка камер і web-плагінаў. Прапанаваны новыя сродкі для спрашчэння распрацоўкі, напрыклад, дададзены віджэт для аўтэнтыфікацыі з выкарыстаннем Firebase. Абноўлены рухавічок Flame, прызначаны на распрацоўкі 2D-гульняў з выкарыстаннем Flutter.

Крыніца: opennet.ru

Дадаць каментар