Компания Google публикува новата версия на програмисткия език Dart 2.15, продължавайки развитието на значително преработената клонка Dart 2, която се различава от оригиналната версия на езика Dart с прилагането на силна статична типизация (типовете могат да се извеждат автоматично, следователно указанието на типовете не е задължително, но динамичната типизация вече не се използва и оригиналният изведен тип се закрепва за променливата и по-късно се прилага строга проверка на типа).
Характеристики на езика Dart:
- Привичен и лесен за изучаване синтаксис, естествен за програмисти на JavaScript, C и 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 { @override Widget build(BuildContext context) { return Column( children: [‘Apple’, ‘Orange’].map(Text.new).toList()); } }
- Разширени са възможностите, свързани с употребата на указатели към функции. Добавена е възможността да се прилагат обобщени (generic) методи и указатели към функции за създаване на не-generic метод и указател: T id<T>(T value) => value; var intId = id<int>; // разрешено в версия 2.15 вместо «int Function(int) intId = id;» const fo = id; // указател на функция id. const c1 = fo<int>;
- В библиотеката 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 е изградена потребителската обвивка на микроядерната операционна система Fuchsia, разработвана от Google. Отбелязва се, че през последните шест месеца броят на приложенията на 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
