Какие виды компиляции поддерживает Dart?

Ответ

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

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

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

    • Назначение: Используется для релизных сборок (flutter build apk/ios --release).
    • Преимущества: Код компилируется в оптимизированный нативный машинный код (ARM, x64) до запуска приложения. Это обеспечивает максимальную производительность, быстрый запуск и минимальный размер.
    • Как работает: Исходный Dart-код транслируется в нативные инструкции для целевой платформы (iOS, Android).

Ключевое отличие для разработчика: JIT — для скорости итераций, AOT — для скорости выполнения. При сборке для веба (flutter build web) Dart-код транскомпилируется в JavaScript с помощью dart2js.

Ответ 18+ 🔞

А, ну это, блядь, классика! Сидишь такой, пишешь свой Flutter-код, а потом раз — и приложение тормозит как мартышлюшка после новогоднего стола. А всё потому, что не понимаешь, какого хуя там под капотом происходит с компиляцией. Сейчас разжую.

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

Первый способ — JIT (Just-In-Time, или «щас-щас, на коленке скомпилирую»). Это твой лучший друг, когда ты в режиме разработки, то есть просто запускаешь flutter run. Весь смысл этого цирка в том, чтобы ты не сдох от скуки. Ты нажал r в консоли — и бац, интерфейс обновился быстрее, чем ты успел сказать «ёперный театр». Это и есть та самая волшебная горячая перезагрузка (Hot Reload), без которой жизнь — говно. Как это работает? Ну, код сначала в какой-то промежуточный байт-код превращают, а потом, прямо пока приложение бегает, Dart VM (это такая виртуальная машинка) его в нативный машинный код переводит, да ещё и по ходу дела может переоптимизировать, если видит, что ты где-то накосячил. Для отладки — просто песня, можно везде залезть, всё посмотреть. Но за такую магию платишь производительностью — в этом режиме приложение жрёт память и работает не так шустро, как могло бы. Но для разработки — да похуй, главное — скорость.

Второй способ — AOT (Ahead-Of-Time, или «всё сделаю заранее, чтоб потом не париться»). А вот это уже серьёзно. Когда ты уже всё написал, протестил и хочешь выкатить своё творение в продакшн, ты делаешь flutter build apk --release. И тут начинается магия наоборот. Весь твой Dart-код заранее, ещё до того как пользователь ткнет в иконку, компилируется в чистый, оптимизированный нативный машинный код (под ARM или x64). Никаких виртуальных машинок, никаких «компиляций на лету». Результат? Приложение запускается моментально, работает как швейцарские часы, и размер у него меньше. Это и есть та самая релизная сборка, которую ты качаешь из App Store или Google Play. Без этого — доверия ебать ноль, никто твой лагающий костыль ставить не будет.

А если для веба? Тут своя история. Когда делаешь flutter build web, Dart-код не в нативный код превращается, а транскомпилируется в JavaScript через инструмент dart2js. Потому что браузер, чувак, другого языка пока не понимает, хоть ты тресни. Так что для веба — это отдельная песня, но принцип тот же: для разработки — одна скорость и возможности, для прода — другая, оптимизированная под смерть.

Короче, вывод простой, как хуй с горы: Пока кодишь — JIT, чтобы можно было быстро пробовать, ошибаться и материться. Когда всё готово — AOT, чтобы пользователи не охуели от тормозов и не пошли лесом. Всё гениальное — просто.