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 в реальном времени и начинает его выполнять. Вот как работает макрос:
Создайте новый "класс дополнения" - новую конструкцию языка, которая позволяет добавлять новые объявления к существующим классам.
Прочитайте определение класса
Vehicle
, данное разработчиком, и определите, что у него есть два поля -description
иwheels
.Добавьте новую сигнатуру метода
toJson
в класс дополнения.Заполните тело метода
toJson
, чтобы обработать сериализацию полейdescription
иwheels
.
Всё это происходит без задержек и интегрировано в существующие рабочие процессы разработчиков, такие как горячая перезагрузка, как показано на этом скринкасте:
Долгосрочные цели по макросам
Конечная цель - дать сообществу возможность создавать свои собственные макросы. Это повышает уровень абстракции программирования на 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, посвященную этому релизу, чтобы получить полную информацию о наших совместных усилиях!