Extension Types: zero-cost абстракция без груза болячек C++

По мере погружения в Dart складывается впечатление, что язык сознательно эволюционирует в сторону "удобного C" — сохраняя безопасность и читаемость, но заимствуя мощные низкоуровневые концепции. Особенно это заметно по таким фичам, как extension types, которые изначально даже назывались inline class — явная отсылка к C. Однако Dart не копирует подход слепо, а переосмысляет его, избегая классических проблем плюсов.

Такими темпами в недалеком будущем Dart вполне сможеть конкурировать с C# и Java в enterprise-нише 😁 Ему уже сейчас (почти) хватает для этого возможностей — осталось развить идею с shared memory multithreading и, конечно же, экосистему инструментов.

Что не так с C? Ключевая проблема C — неконтролируемые накладные расходы. Например, inline — это лишь подсказка компилятору, а не гарантия подстановки кода. Если функция помечена как inline, но компилятор решит не встраивать её, вы получите:

  • Рост бинарника из-за дублирования кода (если инлайнинг сработал агрессивно).
  • Накладные расходы на вызов (если инлайнинг не сработал).

Как Dart решает эту проблему? Extension types — это статическая надстройка над типами. Они:

1. Не создают runtime-оберток — работают только на этапе компиляции. 2. Не требуют инлайнинга — методы компилируются один раз, но вызов остаётся оптимизированным (без vtable). 3. Гарантируют zero-cost — нет лишних аллокаций или косвенных вызовов.

Пример: `extension type Meter(int value) { Meter operator +(Meter other) => Meter(value + other.value); }

void main() { var a = Meter(10); var b = Meter(20); var c = a + b; // Вызов operator + не инлайнится, а остается вызовом метода. }

В бинарнике будет лишь один скомпилированный метод +, а не его подстановка в каждом месте использования.

Не "инлайн", а "умная статика". Dart избегает слепого копирования C++:

  • Нет неопределённости (как с inline в C++).
  • Нет дублирования кода — методы не встраиваются, а вызываются напрямую. От этого размер билда страдает минимально.
  • Безопасность — компилятор контролирует типы, а runtime не страдает.

Итог: это не "инлайн", а логичное развитие идеи — минимальные расходы без хака компилятора. Классно, что Dart развивает идеи C++, оставаясь при этом высокоуровневым языком.`