itmo_conspects

Лекция 5. Компилятор в виртуальной машине

Интерпретатор проще реализовать, чем компилятор. Он исполняет исходный код построчно, без предварительного преобразования в машинный код

Главное преимущество - портируемость: один и тот же исходный код может выполняться на разных устройствах, если для каждой платформы есть интерпретатор

Недостаток интерпретации — низкая скорость выполнения, поскольку анализ и исполнение происходят во время работы программы

Чтобы ускорить выполнение, придумали JIT-компиляцию (Just-In-Time) - гибридный подход, который совмещает интерпретацию и компиляцию

JIT-компилятор во время исполнения анализирует программу и определяет, какие участки кода выполняются чаще всего (так называемые “горячие” участки)

Эти участки компилируются в машинный код на лету, чтобы повысить производительность. При этом редко исполняемые части кода остаются интерпретируемыми, что экономит время и память.

Примеры сред, использующих JIT:


Процесс компиляции делится на три основные стадии:

  1. Front-end представляет из себя:

    • Лексический анализ (tokenization)
    • Синтаксический анализ (парсинг, построение AST)
    • Семантический анализ (проверка типов, области видимости и так далее)
  2. Middle-end:

    • Преобразует код в промежуточное представление (IR, Intermediate Representation)
    • Выполняет оптимизации, не зависящие от платформы (например, удаление мертвого кода, свертка констант, упрощение выражений)
  3. Back-end

    • Преобразует IR в машинный код для конкретной архитектуры
    • Применяет платформозависимые оптимизации (например, размещение регистров, инструкции SIMD)

Промежуточное представление - это форма кода, удобная для анализа и преобразования. Хорошее промежуточное представление обладает следующими свойствами:

Примеры IR:

SSA - особое представление промежуточного кода, где каждая переменная имеет только одно место присваивания. Если в коде встречаются ветвления, то значения объединяются через специальные фи-функции (φ-functions)

Преимущества SSA: упрощение анализа потока данных, повышение эффективности оптимизаций, облегчение удаления ненужных переменных