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