典型的编译过程分为以下主要阶段(按顺序):
-
词法分析(Lexical Analysis)
-
将源代码字符流转换为 Token 序列(如标识符、关键字、运算符等)。
-
工具:词法分析器(Lexer 或 Scanner)。
-
-
语法分析(Syntax Analysis)
-
根据语法规则(如上下文无关文法),将 Token 序列转换为 Parse Tree 或 抽象语法树(AST)。
-
检查代码是否符合语法规则(例如括号是否匹配、语句结构是否正确)。
-
-
语义分析(Semantic Analysis)
-
检查代码的语义正确性(如类型匹配、变量声明、作用域规则)。
-
构建符号表(Symbol Table)记录变量、函数等信息。
-
-
中间代码生成(Intermediate Code Generation)
-
将 AST 转换为与平台无关的中间表示(如三地址码、四元式、LLVM IR 等)。
-
-
代码优化(Code Optimization)
-
对中间代码进行优化,提高效率(如删除冗余代码、常量折叠、循环优化)。
-
-
目标代码生成(Target Code Generation)
-
将优化后的中间代码转换为目标机器代码(如汇编语言或二进制指令)。
-
用做饭的例子:
-
词法分析:准备食材(切菜、分装)。
-
语法分析:检查菜谱步骤顺序是否正确。
-
语义分析:确保食材用量合理(比如不放“5kg盐”)。
-
中间代码生成:把菜谱翻译成通用步骤(比如“大火炒2分钟”)。
-
代码优化:优化做菜步骤(避免重复加热)。
-
目标代码生成:根据厨房设备生成具体操作(用电磁炉还是煤气灶)。
补充说明
-
符号表管理和错误处理 贯穿整个编译过程。
-
Parse Tree 是语法分析阶段的直接产物,而 AST(抽象语法树) 是其简化版本,通常由语义分析阶段进一步处理。
-
实际编译器的实现可能合并或拆分某些阶段(例如,语法和语义分析可能部分重叠)。