JavaScript — это интерпретируемый или компилируемый язык?

«JavaScript — это интерпретируемый или компилируемый язык?» — вопрос из категории Other, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Современный JavaScript использует оба подхода. Его нельзя однозначно отнести только к одной категории.

Исторически и концептуально JavaScript считается интерпретируемым языком, так как:

  • Исходный код выполняется «на лету», без явного этапа компиляции в отдельный бинарный файл.
  • Он обладает динамической типизацией и возможностью eval().

На практике все современные движки (V8 в Chrome/Node.js, SpiderMonkey в Firefox) используют JIT-компиляцию (Just-In-Time).

Как работает JIT-компиляция в V8:

  1. Интерпретатор (Ignition): Быстро запускает код, генерируя байт-код. Это даёт быстрый старт.
  2. Оптимизирующий компилятор (TurboFan): «Нагретый» (часто выполняемый) код компилируется в высокооптимизированный машинный код.
  3. Деоптимизация: Если предположения компилятора нарушаются (например, изменился тип переменной), код возвращается к интерпретации.
// Этот код будет интерпретирован, а затем, вероятно, скомпилирован JIT.
function calculateSum(a, b) {
  return a + b; // Типы a и b могут меняться, что влияет на оптимизацию.
}
console.log(calculateSum(5, 3)); // 8
console.log(calculateSum("Hello", " World")); // "Hello World"

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