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++, оставаясь при этом высокоуровневым языком.`