Перейти к содержимому
Приложение B. Компилятор: как текст программы становится инструкциями процессора

Три переводчика: кто раньше начнёт и кто раньше закончит

Один цикл из шести повторов, три способа перевести его для процессора.

// один цикл, три переводчика

Программе нужно шесть раз повторить один и тот же кусок кода. Процессор понимает только свои инструкции, поэтому текст надо перевести - вопрос лишь в том, когда. Нажимайте «Такт»: слева видно, на что уходит каждый такт, а справа - сколько повторов уже сделано.

Такт 12 / 12

Компиляция

Повторов сделано 6 / 6 дорожка закончила

Переводчик прочитал книгу целиком и отдал готовый перевод. Компилятор переводит весь код заранее, до запуска, и получается исполняемый файл. Так работают C, C++, Go и Rust.

  1. перевод заранее Компилятор читает весь исходный код и разбирает его структуру
  2. перевод заранее Проверяет логику и находит ошибки ещё до запуска
  3. перевод заранее Оптимизирует: убирает лишние вычисления, подбирает удачные инструкции
  4. полезная работа Повтор 1: процессор выполняет готовые инструкции напрямую
  5. полезная работа Повтор 2: посредника между программой и процессором нет
  6. полезная работа Повтор 3
  7. полезная работа Повтор 4
  8. полезная работа Повтор 5
  9. полезная работа Повтор 6

Старт поздний, зато дальше без остановок: 6 повторов за 9 тактов, и перевода в них больше нет. Пользователь запускает уже готовый файл, компилятор своё дело сделал.

Интерпретация

Повторов сделано 6 / 6 дорожка закончила

Переводчик сидит рядом и переводит вслух, страницу за страницей. Интерпретатор выполняет код строка за строкой прямо во время запуска. Так работают Python, PHP и старый JavaScript.

  1. перевод на ходу Интерпретатор читает строку и переводит её
  2. полезная работа Повтор 1 выполнен
  3. перевод на ходу Та же строка переводится заново
  4. полезная работа Повтор 2 выполнен
  5. перевод на ходу И снова перевод
  6. полезная работа Повтор 3 выполнен
  7. перевод на ходу Перевод
  8. полезная работа Повтор 4 выполнен
  9. перевод на ходу Перевод
  10. полезная работа Повтор 5 выполнен
  11. перевод на ходу Перевод
  12. полезная работа Повтор 6 выполнен

Начали сразу, без подготовки, но посредник остался навсегда: 6 повторов за 12 тактов, и половина из них ушла на перевод одного и того же. Зато запустить скрипт можно мгновенно, ничего не собирая.

Компиляция на ходу (JIT)

Повторов сделано 6 / 6 дорожка закончила

Начинает как интерпретатор, но следит, какие участки выполняются часто. Заметив горячий цикл, переводит именно его в машинные инструкции прямо во время работы. Так работают JavaScript в браузере, Java и Python 3.13+.

  1. перевод на ходу Перевод на ходу, как у интерпретатора
  2. полезная работа Повтор 1 выполнен
  3. перевод на ходу Перевод
  4. полезная работа Повтор 2 выполнен
  5. горячий участок Участок признан горячим и скомпилирован в машинные инструкции
  6. полезная работа Повтор 3: уже напрямую, без интерпретатора
  7. полезная работа Повтор 4
  8. полезная работа Повтор 5
  9. полезная работа Повтор 6

Начали почти сразу и закончили не позже остальных: 6 повторов за 9 тактов. Чем длиннее цикл, тем заметнее выигрыш: перевод горячего участка окупается один раз, а пользуются им все следующие повторы.

Такты здесь условные и одинаковой длины - это модель, а не замер. В жизни разбор и оптимизация всей программы занимают куда больше одного шага, перевод строки интерпретатором дешевле полной компиляции, а JIT ещё и решает сам, что считать горячим. Смысл картинки в другом: видно, когда именно тратится время на перевод и сколько раз один и тот же кусок переводится заново.

Интерактив разработан - ремонт компьютеров и ноутбуков в Барановичах. © 2008-2026. Источник: any.by/demo/tri-perevodchika