Кратко
Двухэтапная трансляция (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 и т.д.). В результате получаем исполняемый файл, готовый для выполнения на конкретной платформе.