Кратко

Двухэтапная трансляция (two-stage translation) - это процесс преобразования исходного кода сначала в промежуточное представление, а затем из этого представления в окончательный машинный код.


Преимущества двухэтапной трансляции

  • Портируемость: Промежуточное представление может быть использовано для генерации машинного кода для разных архитектур.
  • Оптимизация: Оптимизации могут быть применены на уровне промежуточного представления, что может быть более эффективно.
  • Упрощение компилятора: Разделение процесса компиляции на два этапа упрощает разработку и отладку компилятора.

Пример

Этап 0: код

// Пример программы на C
int add(int a, int b) {
    return a + b;
}
 
int main() {
    int result = add(5, 3);
    return result;
}

Этап 1: Трансляция в промежуточное представление (например, LLVM IR)

; Function: add
define i32 @add(i32 %a, i32 %b) {
entry:
  %sum = add i32 %a, %b
  ret i32 %sum
}
 
; Function: main
define i32 @main() {
entry:
  %result = call i32 @add(i32 5, i32 3)
  ret i32 %result
}

Этап 2: Трансляция из промежуточного представления в машинный код

Промежуточное представление далее транслируется в машинный код, который зависит от целевой архитектуры (например, x86, ARM и т.д.). В результате получаем исполняемый файл, готовый для выполнения на конкретной платформе.