Какие виды компиляции ты знаешь в контексте Flutter/Dart?

«Какие виды компиляции ты знаешь в контексте Flutter/Dart?» — вопрос из категории Сборка и компиляция, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В экосистеме Flutter/Dart я работаю со следующими видами компиляции, которые напрямую влияют на цикл разработки и производительность приложения:

  1. JIT (Just-in-Time, компиляция на лету)

    • Используется в: режиме разработки (flutter run).
    • Цель: максимальная скорость итераций.
    • Особенности:
      • Позволяет Hot Reload — инжектировать изменения в коде в работающее приложение за секунды, сохраняя состояние.
      • Dart-код компилируется в промежуточный байт-код, который выполняется виртуальной машиной Dart (Dart VM).
  2. AOT (Ahead-of-Time, заблаговременная компиляция)

    • Используется в: релизных сборках (flutter build apk/ios/web --release).
    • Цель: максимальная производительность и минимальный размер.
    • Особенности:
      • Код компилируется в нативный машинный код (ARM, x64) для мобильных платформ или в оптимизированный JavaScript для веба.
      • Исключает накладные расходы Dart VM, приложение запускается быстрее.
  3. Компиляция в JavaScript (dart2js / dart2wasm)

    • Используется для: веб-таргета (flutter build web).
    • Особенности:
      • dart2js: Транспилирует Dart-код в оптимизированный JavaScript.
      • dart2wasm (экспериментально): Компилирует Dart в WebAssembly для потенциально лучшей производительности.

Практический пример: Один и тот же код компилируется по-разному.

// Этот код будет интерпретироваться Dart VM в режиме разработки (JIT)
// и скомпилирован в нативный бинарник для продакшена (AOT).
void main() => runApp(const MyApp());

Выбор режима компиляции — ключевой фактор в балансе между скоростью разработки и финальным качеством приложения.