[Перевод] Вышел Dart 3.4

Dart 3.4 вышел сегодня! Это выпуск, демонстрирующий совместные усилия команд Dart и Flutter в посте Flutter 3.22 / Dart 3.4 / IO24, так что не забудьте ознакомиться с полной информацией там. В этом посте мы представляем нашу поддержку WebAssembly, а затем подробно расскажем об одной из основных задач для языка Dart в этом году: макросы.

Коротко, что нового:

  • Обновление для WebAssembly;

  • макрос JsonCodebale в предварительной версии;

  • исправлено более 50% ошибок анализатора;

  • улучшено согласование анализа типов условных выражений;

  • из библиотеки dart: cli удалены неполные и противоречивые инструменты;

  • устранено несколько недостатков для улучшения новой библиотеки.dart: js_interop.

Обновления WebAssembly

Сегодня мы рады объявить, что полная поддержка WebAssembly (Wasm) доступна для веб-приложений Flutter в последней стабильной версии Flutter 3.22!

Это были многолетние инвестиции в Dart & Flutter. Если вы следили за развитием событий, вы видели наши постепенные разработки:

  • Стандартизация предложения WasmGC,

  • Добавление нового бэкэнда компилятора Dart для генерации кода WasmGC

  • Обновление наших предложений по взаимодействию с Интернетом и JavaScript для лучшей поддержки Wasm.

Мы продолжим инвестировать в WebAssembly. Наше следующее усилие обеспечит полную поддержку Wasm в чистых приложениях Dart и дополнит несколько недостающих функций (например, отложенную загрузку). Комплексный инструментарий для компиляции Wasm в Dart все еще находится в стадии разработки, но вы можете попробовать предварительную версию в стабильной версии уже сейчас, выполнив некоторые временные шаги. Позже мы также надеемся поддержать Wasm в Dart за пределами JS-сред, например, в стандартных средах выполнения Wasm, таких, как wasmtime и Wasmer.

4f76266e0cf81b82bdd306cf77c41b6b.jpegЮрий Петров, руководитель отдела разработки на Flutter

Как разработчик, я чрезвычайно рад видеть, что полная поддержка WebAssembly наконец-то доступна для веб-приложений Flutter. Это огромный шаг вперёд для улучшения производительности и гибкости наших приложений. Я надеюсь, что писать приложения для Web на Flutter станет обычным делом. Ну, а мы обязательно попробуем внедрить и протестировать это в наших проектах.

Макросы Dart: повышение уровня абстракции разработки

Мы вложили много лет в разработку системы макросов Dart. Чтобы улучшить процесс разработки в Dart, макросы предоставляют решение метапрограммирования, такое, как генерация кода. Это решение встроено в язык Dart, чтобы обеспечить разработчикам максимальную производительность, эффективность и продуктивность разработки. Теперь мы готовы предложить предварительный обзор этого опыта!

Давней болью для разработчиков Dart был тривиальный, но утомительный шаблон сериализации и десериализации данных JSON. Создание многоразового, достаточно мощного решения является непростой задачей в Dart, поскольку Dart не поддерживает отражение во время выполнения из соображений производительности. В качестве альтернативы мы использовали решения для генерации кода, такие как JsonSerializable. Они зависят от внешних инструментов, которые запускаются до самого кода, что усложняет работу разработчика.

Сегодня мы объявляем о предварительной версии радикально нового подхода к сериализации и десериализации JSON: макроса JsonCodable.

Макрос — это тип кода, который генерирует дополнительный код путем анализа другого кода во время компиляции. Например, вот класс Vehicle с примененным новым макросом JsonCodable:

@JsonCodable()
class Vehicle {
  final String description;
  final int wheels;
  Vehicle(this.description, this.wheels);
}
void main() {
  final jsonString = Vehicle('bicycle', 2).toJson();
  print('Vehicle serialized: $jsonString');
}

Итак, как это работает? Откуда взялся toJson() метод (и сопутствующий fromJson() конструктор)?

Это экспериментальная реализация нашей новой системы макросов, призванная упростить работу разработчиков. Когда компилятор Dart видит @JsonCodable()аннотацию, он немедленно находит определение макроса JsonCodable в реальном времени и начинает его выполнять. Это приводит к тому, что макрос:

  1. Создает новый «augmentation class»; новая языковая конструкция, позволяющая добавлять новые объявления к существующим классам.

  2. Считывает определение класса, данное разработчиком,  Vehicle⁣, чтобы определить, что он имеет два поля descriptionи wheels.

  3. Добавляет новую toJsonсигнатуру метода в класс расширения.

  4. Заполняет тело метода toJsonдля обработки сериализации полей description и wheels.

Все это происходит немедленно. Интегрированный интерфейс поддерживает существующие рабочие процессы разработчиков, такие как горячая перезагрузка, как показано в этом скринкасте:

Долгосрочные цели для Макросов

Конечная цель — дать сообществу возможность создавать свои собственные макросы. Это повышает уровень абстракции программирования на Dart. Возьмем, к примеру, классы данных,  функцию языка Dart,  получившую наибольшее количество голосов. Мы рассматривали возможность добавления встроенной поддержки классов данных в Dart, но узнали, что мнения существенно разошлись относительно того, что должна поддерживать такая конструкция, чтобы самим устанавливать стандарты. Должны ли быть поля immutable? Должен ли он поддерживать равенство? Как насчет hashCode? Может быть,  toStringтоже? Мы пришли к выводу, что поддержка макросистемы будет лучшим подходом. Сообщество может создавать свои собственные абстракции, обеспечивая более масштабируемые эксперименты и разнообразие.

Разработка и внедрение такой мощной макросистемы — это серьезная задача. Мы полны решимости сделать это таким образом, чтобы не оказывать негативного влияния на производительность основных сценариев использования Dart-разработчиками, таких, как помощь и завершение кода, анализ кода и горячая перезагрузка. Имея это в виду, мы применяем поэтапный подход:

  • В сегодняшнем выпуске мы делаем предварительную версию одного макроса,  JsonCodableчтобы пользователи могли начать знакомиться с опытом использования макроса разработчиками.

  • Если развертывание этого макроса пройдет успешно, мы надеемся перевести макрос JSON в стабильную версию в более позднем выпуске.

  • Параллельно мы работаем над завершением проектирования и реализации базовой макросистемы. Как только мы почувствуем уверенность в его производительности и стабильности, конечной целью станет предоставление сообществу разработчиков Dart возможности определять свои собственные макросы.

Для завершения этих этапов предстоит еще много работы. А пока вы можете прочитать документацию, чтобы узнать больше о системе макросов Dart, и опробовать предварительную версию макроса JsonCodable уже сегодня.

dfc8cc273e665c0373fe9e645e66fed7.jpegЮрий Петров, руководитель отдела разработки на Flutter

Все мы ждем Макросы, я очень жду. Мне как и многим разработчикам со временем и опытом становится понятно, что генерация кода реализованная с помощью freezed или json_serializable мягко говоря не совсем оптимальная. Макросы должны решить эту проблему. Понятно, что многие ждали простых Data классов, как например в Kotlin. Но комментарии разработчиков по поводу этого довольно аргументированы. В принципе, если система макросов будет работать так как задумывалось разработчиками, то отдельные Data классы будут не нужны. Как только разработчики научатся и примут макросы, я уверен, что они будут очень классным инструментом. Макросы введены как экспериментальная функция, и требует версии языка 3.5.0–152 и выше. Надеюсь, с выходом стабильной версии языка 3.5, макросы будут введены как стандартный инструмент.

Другие улучшения

Как всегда, этот выпуск содержит все постоянные разработки, направленные на создание наилучшей версии Dart. В этом выпуске мы внесли следующие улучшения:

  • Исправлено более 50% ошибок завершения кода анализатора. (Пожалуйста, продолжайте сообщать о проблемах !)

  • Улучшено согласование анализа типов условных выражений, выражений if-null и выражений переключения со спецификацией языка (журнал изменений).

  • Из библиотеки dart:cli удалены неполные и противоречивые инструменты для погашения технического долга в виртуальной машине Dart.

  • Устранено несколько недостатков для улучшения новой библиотеки.dart:js_interop

Чтобы узнать полную историю,  ознакомьтесь с журналом изменений ! Не забудьте прочитать совместную публикацию в блоге Dart и Flutter для этого выпуска, чтобы узнать полную историю наших совместных усилий!

Habrahabr.ru прочитано 6363 раза