[Перевод] Анонс Dart 3.4

Анонс Dart 3.4

Анонс Dart 3.4

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

Обновления WebAssembly

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

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

  • Стандартизация WasmGC,

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

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

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

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

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

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

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

Макрос — это тип кода, который генерирует дополнительный код путем интроспекции другого кода во время компиляции. Например, вот Dart-класс 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. Создайте новый «класс дополнения» — новую конструкцию языка, которая позволяет добавлять новые объявления к существующим классам.

  2. Прочитайте определение класса Vehicle, данное разработчиком, и определите, что у него есть два поля — description  и wheels.

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

  4. Заполните тело метода toJson, чтобы обработать сериализацию полей description и wheels.

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

Скринкаст, демонстрирующий опыт использования макроса: изначально автодополнения кода toJson не существует, но после добавления @JsonCodable в класс, автодополнение toJson появляется сразу.

Скринкаст, демонстрирующий опыт использования макроса: изначально автодополнения кода toJson не существует, но после добавления @JsonCodable в класс, автодополнение toJson появляется сразу.

Долгосрочные цели по макросам

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

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

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

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

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

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

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

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

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

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

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

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

Загляните в Changelog, чтобы узнать всю историю! Не забудьте прочитать совместную запись в блоге Dart и Flutter, посвященную этому релизу, чтобы получить полную информацию о наших совместных усилиях!

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