← 前一天目录后一天 →

每日科普 · 2026-09-20 周日

考研 408 × 求职面试

知识点 · 编译原理 · 基础

编译程序的总体结构与工作流程

编译程序就像把高级语言“翻译”成机器能执行的目标代码的流水线。核心流程通常分六步: 1. 词法分析:把字符流切成单词符号(token),如标识符、常量、运算符。 2. 语法分析:按语法规则把 token 组织成语法树,检查结构是否正确。 3. 语义分析:检查类型、作用域、声明等语义,建立或更新符号表。 4. 中间代码生成:生成三地址码等中间表示,便于优化和移植。 5. 优化:对中间代码做等价变换,提高时间和空间效率。 6. 目标代码生成:生成汇编或机器指令,并进行寄存器分配。 另外,符号表管理和错误处理贯穿全过程。一般把词法、语法、语义、中间代码生成称为前端,优化和目标代码生成称为后端;前端更依赖源语言,后端更依赖目标机器。

每日一题 · 编译原理

编译程序的总体结构与工作流程

在编译程序的典型工作流程中,下列阶段顺序正确的是( )。A. 词法分析→语法分析→语义分析→中间代码生成→优化→目标代码生成 B. 词法分析→语义分析→语法分析→优化→中间代码生成→目标代码生成 C. 语法分析→词法分析→语义分析→目标代码生成→优化→中间代码生成 D. 语义分析→词法分析→语法分析→中间代码生成→目标代码生成→优化

解析

选 A。编译前端先由词法分析把字符流切成 token,再由语法分析构建语法结构,随后语义分析检查类型、作用域等。之后生成中间代码,进行优化,最后生成目标代码。符号表和错误处理贯穿各阶段。B、C、D 都把分析或生成顺序打乱,尤其优化通常在中间代码后进行,不是最后补做。

面试小贴士 · 编译原理

编译程序的总体结构与工作流程

面试常问:编译有哪些阶段?各阶段输入输出?前后端如何划分?答题按“源程序→词法→语法→语义→中间代码→优化→目标代码”,并强调符号表与错误处理贯穿。易错:混淆词法和语法,漏掉语义分析/符号表,误以为优化在目标代码之后。

代码实现 · C

代码示例

#include <stdio.h>
#include <ctype.h>

int main() {
    char src[] = "sum = a + 10;"; // 源程序
    printf("源程序: %s\n", src);
    printf("阶段1 词法分析: "); // 只演示第一阶段
    for (int i = 0; src[i]; ) {
        if (isspace((unsigned char)src[i])) { i++; continue; }
        if (isalpha((unsigned char)src[i])) { // 标识符
            while (isalnum((unsigned char)src[i])) putchar(src[i++]);
            printf("(标识符) ");
        } else if (isdigit((unsigned char)src[i])) { // 整数
            while (isdigit((unsigned char)src[i])) putchar(src[i++]);
            printf("(整数) ");
        } else { // 运算符或界符
            printf("%c(符号) ", src[i++]);
        }
    }
    printf("\n阶段2-6: 语法分析、语义分析、中间代码、优化、目标代码\n");
    return 0;
}
← 前一天目录后一天 →