字数
863 字
阅读时间
4 分钟
CH-01 计算机系统漫游
CH-03 程序的机器级表示
计算机执行的“机器代码”是字节序列编码的低级操作(处理数据、管理内存、IO与网络等)。
编译器(如GCC C编译器)会依据编程语言规则、目标机器指令集、操作系统惯例,经多阶段生成机器代码。GCC的输出先以汇编代码(机器代码的“文本表示”,能列出程序每条指令)形式存在,再调用汇编器、链接器,最终生成可执行机器代码。本章会聚焦机器代码及其人类可读形式——汇编代码。
2. 高级语言与汇编代码的对比
- 高级语言(如C、Java):屏蔽机器级实现细节,抽象级别高。优势是“开发效率高、更可靠”(编译器的类型检查能发现大量错误,还能保证数据引用/处理的一致性);经现代优化编译器处理后,生成的代码效率“至少与熟练汇编程序员手工编写的代码相当”;且可移植性强(能在多种不同机器上编译执行)。
- 汇编代码:与“特定机器”密切相关,编程时需手动指定低级计算指令,可移植性差。
3. 学习机器/汇编代码的必要性
即使编译器能自动生成汇编代码,“阅读、理解汇编代码”对程序员仍很重要,原因包括:
- 借助编译器的“命令行选项”,可生成汇编代码形式的输出文件。通过阅读这些汇编代码,能理解编译器的优化能力,也能分析代码中隐含的“低效率问题”。
- 调试关键代码时(如第5章会讲的“最大化一段关键代码性能”),常需从“高级语言的源代码”溯源到“编译器生成的汇编代码”,以此理解程序“实际的运行方式”。
- 高级语言的抽象层会“隐藏程序运行时行为”:比如“线程包裹的并发程序”中,线程如何共享/私有数据、在哪访问共享数据(第12章内容),这类信息仅在机器代码级可见;再比如“程序遭受攻击(恶意软件入侵)”,很多攻击利用了“程序存储运行时控制信息的细节漏洞”,要理解漏洞成因与防御方法,也需要机器级表示的知识。
- 程序员对汇编的需求已变化:从“直接用汇编语言编写程序”,转变为“阅读、理解编译器生成的汇编代码”。
简言之,文本从“生成过程”“语言对比”“学习必要性”三个维度,阐释了机器代码、汇编代码与高级语言的关联,强调了“理解机器/汇编代码”对深入把握程序运行、优化与安全的重要性。