⚙️ 什么是软件编译?
Source: Dev.to
在一般计算中,编译是将高级编程语言(人类可读的,如 C++、Rust 或 Java)翻译成低级语言(如机器码或字节码)的过程,这些语言是计算机处理器能够实际执行的。
可以把编译器想象成一个高度复杂的翻译器,它把用英文写成的书转换成一系列机器人可以用来重新创建该书的数学坐标。
🛠️ 编译的阶段
编译不是一步完成的,它是一个由特定转换组成的流水线。
1. 🔍 词法分析(Scanner)
编译器逐字符读取源代码,并将其划分为记号(关键字、运算符、标识符)。它还会去除注释和空白字符。
示例
x = 5 + 3;
会被分解成记号……
2. 🌳 语法分析(Parsing)
编译器检查记号是否符合语言的语法规则。它会创建解析树或**抽象语法树(AST)**来表示逻辑结构。
错误检查:这里会捕获“缺少分号”或“括号不匹配”等错误。
3. 🧠 语义分析
编译器检查“意义”错误。它确保变量在使用前已声明,并且不会尝试执行不可能的操作,例如把字符串与整数相加。
4. ⚙️ 中间代码生成
编译器生成一个简化的、与机器无关的代码版本。这使得在最终翻译之前更容易对代码进行优化。
5. 🚀 代码优化
编译器寻找让程序运行得更快或更小的方法,而不改变其行为。
示例
x = 2 + 2;
优化器会把它替换为 x = 4,这样计算机在运行时就不必执行加法操作。
6. 📠 代码生成
最后阶段,将中间代码转换为机器码(针对特定 CPU,如 x86 或 ARM)或字节码。
🎓 小结
✅ 什么是编译?
- 将高级代码翻译为机器级代码。
- 在程序运行之前一次性完成。
- 生成一个独立的可执行文件(例如
.exe)。
CPU 只能理解二进制(高/低电压)。人类无法高效地直接编写二进制,因此编译器在人的逻辑与硬件执行之间架起了桥梁。
❌ 编译不是
- “编译在执行时逐行进行。”——那是解释(例如 Python、JavaScript)。
- “编译等同于调试。”——调试是寻找错误的行为;编译是过程,它常常会揭示错误。
🧠 编译器 vs. 解释器
使用**“翻译器 vs. 解释器”**的记忆法:
- 编译器 = 在你阅读之前把整本书全部翻译的翻译者(后期阅读更快,但前期需要时间)。
- 解释器 = 站在你旁边实时翻译每句话的现场解释者(完成速度慢,但可以立即开始)。
⚠️ 编译 vs. 链接
- 编译把你的源代码转换为目标代码(半成品)。
- 链接将目标代码与其他库合并,生成最终的可执行文件(完整的拼图)。