Компания Google опубликовала релиз языка программирования Dart 2.14, в котором продолжено развитие кардинально переработанной ветки Dart 2, переориентированной на разработку для Web и мобильных систем и оптимизированной для создания компонентов, выполняемых на стороне клиента. Dart 2 отличается от изначального варианта языка Dart применением сильной статической типизации (типы могут выводиться автоматически, поэтому указание типов не является обязательным, но динамическая типизация больше не используется и вычисленный изначально тип закрепляется за переменной и в дальнейшем применяется строгая проверка типа).
Особенности языка Dart:
- Привычный и простой для изучения синтаксис, естественный для программистов на JavaScript, Си и Java.
- Обеспечение быстрого запуска и высокой производительности для всех современных web-браузеров и различных типов окружений, от портативных устройств до мощных серверов.
- Возможность определения классов и интерфейсов, позволяющих использовать инкапсуляцию и повторно использовать существующие методы и данные.
- Указание типов позволяет упростить отладку и выявление ошибок, делает код более ясным и читаемым, упрощает его доработку и анализ сторонними разработчиками.
- Среди поддерживаемых типов: различные виды хэшей, массивов и списков, очереди, числовые и строковые типы, типы для определения даты и времени, регулярные выражения (RegExp). Имеется возможность создания своих типов.
- Для организации параллельного выполнения предлагается использовать классы с атрибутом isolate, код которых выполняется полностью в изолированном пространстве в отдельной области памяти, взаимодействуя с основным процессом через отправку сообщений.
- Поддержка использования библиотек, упрощающих поддержку и отладку больших web-проектов. Сторонние реализации функций могут подключаться в виде разделяемых библиотек. Приложения можно разбить на части и поручить разработку каждой из частей отдельной команде программистов.
- Набор готовых инструментов для поддержки разработки на языке Dart, включая реализацию средств динамической разработки и отладки с исправлением кода на лету (“edit-and-continue”).
- Для упрощения разработки на языке Dart поставляется SDK, пакетный менеджер pub, статический анализатор кода dart_analyzer, набор библиотек, интегрированная среда разработки DartPad и плагины с поддержкой Dart для IntelliJ IDEA, WebStorm, Emacs, Sublime Text 2 и Vim.
- Дополнительные пакеты с библиотеками и утилитами распространяются через репозиторий pub, который насчитывает более 10 тысяч пакетов.
Основные изменения в выпуске Dart 2.14:
- Добавлен новый оператор тройного сдвига (>>>), который в отлисие от оператора “>>” выполняет не арифметический, а логический сдвиг, работающий без учёта знакового бита (сдвиг совершается без разделения на положительные и отрицательные числа).
- Снято ограничение на аргументы типа, не позволявшие использовать общие типы функций в качестве аргумента с типом. Например, сейчас можно указывать: late List(T)> idFunctions; var callback = [(T value) => value]; late S Function(T)>(S) f;
- Разрешено указание аргументов с типами в аннотациях, таких как @Deprecated. Например, теперь можно указывать: @TypeHelper(42, “The meaning”)
- В стандартную библиотеку (dart:core) в класс Object добавлены статические методы hash, hashAll и hashAllUnordered. В классе DateTime улучшена обработка локального времени при переводе часов между летним и зимним временем не кратным одному часу (например, в Австралии используется смещение на 30 минут). В пакет ffi добавлена поддержка механизма выделения памяти arena, автоматически высвобождающего ресурсы. В пакет ffigen добавлена возможность генерации typedef-определений типов Dart из языка C.
- 250 самых популярных пакетов из репозитория pub.dev и 94% из top-1000 переведены на применение режима безопасного использования значения “Null” (null safety), который позволят избежать крахов, вызванных попытками использования переменных, значение которых не определено и выставлено в “Null”. Режим подразумевает, что переменные не могут иметь неопределённые значения, если им явно не присваивается значение null. В режиме строго учитываются типы переменных, что позволяет компилятору применять дополнительные оптимизации. Соответствие типов проверяется на этапе компиляции, например, в случае попытки присвоения значения “Null” переменной с типом, не подразумевающим неопределённое состояние, таким как “int”, будет выведена ошибка.
- Предложены унифицированные наборы правил для анализатора кода (linter), обеспечивающие одновременную поддержку проверки следования рекомендациям по стилю оформления кода для Dart и фреймворка Flutter. По историческим причинам правила оформления кода для Flutter и Dart отличались, кроме того для Dart в обиходе находилось два набора правил – педантичные от Google и правила от сообщества разработчиков Dart. В Dart 2.14 представлен новый общий набор правил для linter, который решено применять по умолчанию в новых проектах Dart и во Flutter SDK. Набор включает в себя базовые правила
(пакет lints/core.yaml), рекомендованные дополнительные правила (lints/recommended.yaml) и специфичные для Flutter рекомендации (flutter_lints/flutter.yaml). Пользователям педантичных правил рекомендовано перейти на использование нового стиля кодирования,
основанного на рекомендациях из документации Dart. - В formatter внесены оптимизации в форматирование каскадных блоков кода, позволяющие заметно повысить производительность форматирования и избежать неоднозначной трактовки принадлежности элементов выражения. Например, вызов “..doIt” в выражении “var result = errorState ? foo : bad..doIt()” касается не условной части блока “bad” а всего выражения, поэтому при форматировании теперь разделяется: var result = errorState ? foo : bad ..doIt();
- В SDK добавлена поддержка процессоров Apple M1 (Silicon), подразумевающая как возможность запуска Dart VM, утилит и компонентов SDK на системах с процессором Apple Silicon, так и поддержку компиляции исполняемых файлов для указанных чипов.
- В команду “dart pub” добавлена поддержка нового служебного файла “.pubignore” в котором можно определить список файлов, которые будут пропущены при публикации пакета в репозитории pub.dev, не пересекающийся со списком игнорирования “.gitignore” (в некоторых ситуациях в pub.dev требуется не передавать файлы, которые нужны в Git, например, внутренние скрипты, применяемые при разработке).
- Проведена работа по повышению производительности команды “dart test”, которая теперь не требует повторной компиляции тестов после изменения pubspec, если номер версии не поменялся.
- Прекращена поддержка компиляции в режиме совместимости с ECMAScript 5 (изменение приведёт к потере совместимости с браузером IE11).
- Объявлены устаревшими отдельные утилиты stagehand, dartfmt и dart2native, на смену которым пришли встроенные команды, вызываемые через утилиту dart.
- Переведён в разряд устаревших механизм VM Native Extensions. Для вызова нативного кода из кода на языке Dart рекомендовано использовать новый интерфейс Dart FFI (Foreign Function Interface).
Одновременно представлен значительный релиз фреймворка построения интерфейса пользователя Flutter 2.5, который рассматривается как альтернатива React Native и позволяет на основе одной кодовой базы выпускать приложения для платформ iOS, Android, Windows, macOS и Linux, а также приложения для запуска в браузерах. На основе Flutter построена пользовательская оболочка развиваемой в Google микроядерной операционной системы Fuchsia.
Основная часть кода Flutter реализована на языке Dart, а runtime-движок для выполнения приложений написан на C++. При разработке приложений, помимо родного для Flutter языка Dart, можно использовать интерфейс Dart Foreign Function для вызова кода на C/C++. Высокая производительность выполнения достигается благодаря компиляции приложений в машинный код для целевых платформ. При этом программу не нужно перекомпилировать после каждого изменения – Dart предоставляет режим горячей перезагрузки, позволяющий вносить изменения в работающее приложение и сразу оценивать результат.
Основные изменения во Flutter 2.5:
- Внесены значительные оптимизации производительности. На платформах iOS и macOS реализована предкомпиляция шейдеров для графического API Metal. Повышена эффективность обработки асинхронных событий. Решена проблема с задержками во время высвобождения сборщиком мусора памяти от неиспользуемых изображений (например, во время воспроизведения 20-секундного анимированного GIF число операций сборки мусора снижено с 400 до 4. До 50% cнижены задержки при передаче сообщений между Dart и Objective-C/Swift (iOS) или Java/Kotlin (Android). Добавлена поддержка родной сборки для систем на базе чипа Apple Silicon.
- Для платформы Android налажена поддержка работы приложений в полноэкранном режиме. Продолжена реализация концепции оформления “Material You”, преподносимой как вариант Material Design следующего поколения. Добавлено новое состояние MaterialState.scrolledUnder, реализовано динамическое отображение полос прокрутки при изменении размера и предложен новый интерфейс для отображения баннеров с уведомлениями.
- Значительно расширены возможности плагина для работы с камерой, в котором появились средства для управления автофокусом, экспозицией, вспышкой, увеличением, подавлением шумов и разрешением.
- Улучшены инструменты для разработчиков (DevTools), в которых появился обновлённый режим инспектирования виджетов, а также предоставлены средства для выявления задержек при отрисовке и отслеживания компиляции шейдеров.
- Улучшены плагины для Visual Studio Code и IntelliJ/Android Studio.