За последние пару лет мы вложили немало времени и ресурсов на прототипирование макросов. К сожалению, всякий раз, когда мы преодолевали одно серьезное техническое препятствие, всплывало еще несколько новых. В настоящий момент, мы не видим, чтобы макросы в ближайшее время приблизились к той функциональности, которую мы были бы готовы выпустить, с тем качеством и developer-time performance, которые мы бы хотели получить.
Рассмотрев альтернативные издержки, в частности тех функций, которые мы бы могли предоставить сообществу взамен, мы приняли трудное решение прекратить работу над макросами.
Кратко о ситуации
Мы считаем, что Dart предлагает уникальное сочетание сильных сторон, таких как (1) AOT-компиляция и производительность, характерные для статических языков, и (2) быстрый цикл разработки (вроде возможности горячей перезагрузки с сохранением состояния), характерный для динамических языков. По мере развития Dart, мы тщательно оценивали изменения в языке по обоим пунктам.
Мощное метапрограммирование, основанное на богатой интроспекции, всегда было вызовом в таком контексте. Интроспекция времени выполнения (например, рефлексия) затрудняет выполнение tree-shaking оптимизаций, которые позволяют нам генерировать более компактные бинарные файлы. В свою очередь, статическая интроспекция (например, макросы) может принимать несколько форм. Большинство языков используют синтаксический подход, с ограниченной статической рефлексией на уровне синтаксиса. Мы не считали, что этого достаточно для достижения наших целей. Вместо этого, мы стремились создать систему макросов, которая бы поддерживала глубокую семантическую интроспекцию времени компиляции. К сожалению, оказалось, что семантическая интроспекция приводила к большим затратам времени компиляции, что затрудняло возможность сохранять горячую перезагрузку горячей.
Мы пришли к выводу, что нам просто еще слишком далеко до выпуска макросов с требуемым developer-time performance. Наша текущая реализация приводит к регрессу как работы с кодом (имеются в виду такие вещи, как статический анализ и автодополнение), так и инкрементальной компиляции (имеется в виду первый шаг горячей перезагрузки), и мы не уверены, что сможем надлежащим образом решить эти проблемы в разумные сроки.
Что дальше
Мы решили сосредоточиться на других функциях, в поставке которых мы более уверены.
Одно из направлений, в которое мы инвестируем — это улучшение поддержки данных в Dart. Это самая запрашиваемая issue в трекерах Dart и Flutter. Фактически, нашей основной мотивацией для макросов было обеспечение лучшей работы с данными, их сериализации и десериализации. Мы по-прежнему будем стремиться к улучшению работы с данными, но сейчас мы намерены добиться этого с помощью более специализированных функций языка.
Еще одно направление, в которое мы инвестируем — улучшение времени сборки и генерации кода в целом. Мы уже наметили некоторые улучшения для build_runner. Также, мы планируем выпустить augmentations, которые мы прототипировали в рамках макросов. Мы считаем, что эта функциональность имеет ценность сама по себе и она может улучшить существующую генерацию кода, так что мы намерены выпустить ее отдельно.
Мы понимаем, что эта новость многих разочарует. Мы по-прежнему заинтересованы в исследовании метапрограммирования в долгосрочной перспективе, поскольку у него есть ряд потенциальных областей применения, помимо работы с данными. Тем не менее, мы также хотим ясно дать понять нашему сообществу, что мы не планируем выпускать макросы в обозримом будущем.
Мы хотели бы поблагодарить всех, кто попробовал макросы, кто оставлял отзывы и вносил свой вклад непосредственно через PR. Этот вклад и энергия будут способствовать нашей дальнейшей работе. Мы в восторге от улучшений, которые мы можем предложить в этом году.
Автор: henox