Static Enough Metaprogramming в Dart

Я — MADTeacher, автор книг по Dart/Flutter/ИИ в программировании и преподаватель. На канале разбираю свежие фичи языка и фреймворка, объясняю, как и когда их применять, и показываю всё на живых примерах кода. Меньше воды — больше практики: от конструкторов и метапрограммирования до производительности, интеропа и тестирования, а также поднимаю тему использования ИИ для разработки программных продуктов. Если хотите понимать Dart и Flutter в эпоху ИИ глубже — вы по адресу.

Dartметапрограммированиеkonst

PR от Славы Егорова по более простой реализации статического метапрограммирования в Dart был прият и теперь красуется в репозитории спецификации языка 🥳

🥲 Почему появилась эта спецификация?

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

Казалось бы - ну и что? Жили же с кодогенерацией без макросов и рефлексии!!! Но она требует отдельной инфраструктуры, усложняет разработку и не всегда удобна. Поэтому потребность в метапрограммировании до сих пор остается 😄

🧩 Новая спецификация предлагает:

  • 👉 Введение аннотации @konst, указывающей компилятору выполнить вычисления на этапе компиляции.
  • 👉 Возможность интроспекции структуры программы прямо во время компиляции.
@konst
final String data = computeData(); // вычислится при компиляции

Говоря более простым языком - разработчики смогут использовать часть Dart-кода, который ранее был невозможен в константных выражениях (циклы, условные операторы, списки и таблицы/карты).

⚡️ Что изменится?

Появятся Const-выражения (привет constexpr из С++):

@konst
final attributes = buildAttributes();

Дженерики смогут компилироваться в конкретные реализации:

void foo<@konst T>(T value) {}

foo(42); // на этапе компиляции создаст конкретную реализацию foo<int>

Циклы будут раскрываться при компиляции:

for (@konst final v in [1, 2, 3]) {
  print(v); // на этапе компиляции развернётся в print(1); print(2); print(3);
}

🎯 Практическое применение

Если фича релизнится, то такие вещи, как JSON-сериализация, генерация метода hashCode и operator==, или автоматическая маршрутизация запросов можно будет реализовать прямо внутри Dart без дополнительного кодогена, что положительно скажется на точке G вашего проекта, т.к. значительно сократится количество файлов "*.g.dart"

mixin DataClass<@konst T> {
  @override
  operator ==(Object? other) {
    if (other is! T) {
      return false;
    }

    final typeInfo = TypeInfo.of<T>();
    for (@konst final field in typeInfo.fields) {
      final value1 = field.getFrom(this as T);
      final value2 = field.getFrom(other);
      if (field.type.isSubtypeOf<List>()) {
        if ((value1 as List).length != (value2 as List).length) {
          return false;
        }
        for (var i = 0; i < value1.length; i++) {
          if (value1[i] != value2[i]) {
            return false;
          }
        }
      } else if (value1 != value2) {
        return false;
      }
    }
    return true;
  }

  @override
  int get hashCode {
    final typeInfo = TypeInfo.of<T>();
    var hash = HashHelpers._seed;
    for (@konst final field in typeInfo.fields) {
      hash = HashHelpers.combine(hash, field.getFrom(this as T).hashCode);
    }
    return HashHelpers.finish(hash);
  }

  Map<String, Object?> toJson() => toJsonImpl<T>(this as T);
}
// Example
class A with DataClass<A> {
  final int a;
  final String b;
  // ...
}

Уже видите профит от этой Static Enough Metaprogramming?

  • 👍 – О, да, детка!!!
  • 👌 – Сомнительно, но Окей
  • 👎 – Отстой! (Не превращайте Dart в C++)
Миниатюра поста с надписью «Что же Dart такого нам готовит?», тёмный фон и круглая фотография автора Станислава Чернышева — обложка анонса фичи.
Обложка анонса новой фичи Dart с фото автора.

Дискуссия

MADTeacher | Станислав Чернышев
Daniil Koliasnikov
До простых смертных докатится через 1.5-2 года ?
Очень хочется верить, что не дольше. По крайней мере Слава не с путыми руками предлагал пулл-реквест фичи, а сделав её экспериментальное MVP: https://github.com/mraleph/sdk/tree/static_enough_reflection/sdk/lib
MADTeacher | Станислав Чернышев
ΔΑΒΙΔ ΔΟΥΛΟΣ ΙΗΣΟΥ ΧΡΙΣΤΟΥ
Станислав, а вы частно преподаете?
Сложно ответить на столь широкий вопрос без дополнительного контекста. Где и что преподаю? Если имеется ввиду в университете - то очень часто, т. к. это сейчас моя основная работа
ΔΑΒΙΔ ΔΟΥΛΟΣ ΙΗΣΟΥ ΧΡΙΣΤΟΥ
MADTeacher | Станислав Чернышев
Сложно ответить на столь широкий вопрос без дополнительного контекста. Где и что преподаю? Если имеется ввиду в университете - то очень часто, т. к. это сейчас моя основная работа
Я имел в виду, занимаетесь ли частным репетиторством?
MADTeacher | Станислав Чернышев
ΔΑΒΙΔ ΔΟΥΛΟΣ ΙΗΣΟΥ ΧΡΙΣΤΟΥ
Я имел в виду, занимаетесь ли частным репетиторством?
Частным - нет. Но иногда запускаю курсы на степике (в основном - Основы разработки на Dart: от юнлинга до падавана, или отдельно по частям) с обратной связью от автора (Основы разработки на Dart: от юнлинга до падавана) , когда можно в процессе обучения написать имеющиеся вопросы и мы их разбираем на ближайшем созвоне. Следующий раз планирую где-то в середине августа
Николай
MADTeacher | Станислав Чернышев
Сложно ответить на столь широкий вопрос без дополнительного контекста. Где и что преподаю? Если имеется ввиду в университете - то очень часто, т. к. это сейчас моя основная работа
ого, а в каком университете преподаете, и какой предмет?
MADTeacher | Станислав Чернышев
Николай
ого, а в каком университете преподаете, и какой предмет?
ГУАП. На бакавриате веду "Алгоритмы и структуры данных" и "Технология программирования", а в магистратуре всякие "Методы объектно-ориентированного проектирования" и тому подобное
TheLastRay (:
Если pr уже приняли, то, получается, в мастере она таки уже релизнулась?
MADTeacher | Станислав Чернышев
TheLastRay (:
Если pr уже приняли, то, получается, в мастере она таки уже релизнулась?
Нет. В лучшем случае в течении 2-х лет релизнится. А если как обычно - придется ждать лет 5
TheLastRay (:
MADTeacher | Станислав Чернышев
Нет. В лучшем случае в течении 2-х лет релизнится. А если как обычно - придется ждать лет 5
а, всё мной прочитан оригинал по ссылке xD Это чисто предложение хыхы
Jackson
MADTeacher | Станислав Чернышев
Нет. В лучшем случае в течении 2-х лет релизнится. А если как обычно - придется ждать лет 5
Через 5 лет, большинству, пишущих сейчас, он будет уже и не нужен - либо вырастут, либо свичнутся;)
Присоединиться к обсуждению →

Читайте так же