← 前一天目录后一天 →

每日科普 · 2026-10-06 周二

考研 408 × 求职面试

知识点 · 编译原理 · 基础

编译前端与后端的分工及中间表示的作用

编译前端负责理解源程序:词法分析、语法分析、语义分析,并生成中间表示(IR)。编译后端负责面向目标机器:优化、指令选择、寄存器分配、生成汇编或机器码。 1. 前端关注“源代码对不对、是什么意思”。 2. 后端关注“目标机器怎么高效执行”。 3. IR 是桥梁:比源码更规整,比机器码更抽象,便于做公共优化和跨平台移植。 常见 IR 有三地址码、控制流图、LLVM IR 等。例如同一份三地址码可交给 x86 或 ARM 后端;新增语言主要写前端,新增 CPU 主要写后端。注意边界并非绝对:前端可能做少量优化,后端也可能做与机器无关优化。

每日一题 · 编译原理

编译前端与后端的分工及中间表示的作用

下列关于编译前端、后端及中间表示的说法,正确的是? A. 前端直接生成机器码,后端只做词法分析 B. IR 只用于前端,不能用于优化 C. 前端生成 IR,后端可基于 IR 做优化并生成目标代码,便于多语言和多目标支持 D. 后端与源语言强相关,前端与目标机器强相关

解析

选 C。前端负责词法、语法、语义分析并生成 IR;后端面向目标机,做优化、指令选择、寄存器分配和代码生成。IR 作为桥梁,与源语言和目标机都保持一定距离,便于公共优化和移植。A 说反,B 错,D 也反了。

面试小贴士 · 编译原理

编译前端与后端的分工及中间表示的作用

面试常问:为什么要 IR?前后端如何划分?答:前端=分析+生成 IR,后端=优化+目标码;IR 解耦语言与机器。易错:说前端完全与机器无关、后端完全与语言无关,或把优化只归后端;要提公共优化和可移植性。

代码实现 · C++

代码示例

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

struct Instr { string op, arg1, arg2, res; };

int main() {
    // 前端:将 (a+b)*c 生成为三地址码 IR
    vector<Instr> ir = {
        {"+", "a", "b", "t1"},
        {"*", "t1", "c", "t2"}
    };
    unordered_map<string,int> env = {{"a",2},{"b",3},{"c",4}};
    // 后端:基于 IR 做简单求值(真实后端会生成目标代码)
    for (auto &in : ir) {
        int v1 = env[in.arg1], v2 = env[in.arg2];
        if (in.op == "+") env[in.res] = v1 + v2;
        else if (in.op == "*") env[in.res] = v1 * v2;
    }
    cout << "result=" << env["t2"] << endl; // 20
}
← 前一天目录后一天 →