程序员视角的计算机系统 1.3 要理解编译系统是如何工作的
对于简单的程序例如hello.c 我们能够依赖编译系统来生成正确的和有效率的机器代码。然而
还有一些其它的重要原因来说明为什么程序员需要理解编译系统是如何工作的。
优化程序性能
现代的编译器是复杂的工具,通常能生成好代码。作为程序员,我们不需要知道编译器的
内部工作原理,然而为了做好的编码决策,我们的确需要对机器级代码有一个基本的理解
以及编译器是如何翻译不同的C语言语句到机器代码的。例如一个分支 语句总是比一个条件语句
的序列更有效率吗? 一个函数调用引起了多少额外的开销?一个循环比另一个循环更有效率吗?
指针引用比数组索引更有效率吗?如果我们的求和操作用一个局部变量代替一个引用传入的参数,
为什么我们的循环运行的更快了?当我们简单地重排一个算术表达式中的括号时,一个函数如何
能够运行得更快?
在第三章中我们将介绍两种相关的机器语言:IA32和x86-64.在第五章中,你将学习如何调优你的
C语言的程序的性能,这是通过简单地转换C语言的代码让编译器更好地做它的工作。在第六章中,
你将学习内存系统的层级本性,C编译器如何 在内存中存储数据数组,你的C程序如何利用这个知识
来运行得更快。
理解链接时的错误
一些最诡异的编程错误与链接器的操作相关,尤其是当你试图构建一个庞大的软件系统时。
例如,当一个链接器报告它不能解决一个引用时,这意味着什么呢?
一个静态变量和一个全局变量之间的区别是什么呢?
如果在不同的C文件中你使用相同的名称定义了两个全局变量会发生什么情况呢?
一个静态的代码库与一个动态的代码库之间的区别是什么呢?
为什么链接器会在意我们在命令行上列出的代码库的顺序呢?
最可怕的是,为什么一些链接器相关的错误直到运行时才出现呢?
在第七章中,你将学习到这些类型的问题的答案。
避免安全漏洞
许多年来,在网络上和互联网的服务器上安全漏洞的大部分与缓冲区溢出漏洞相关。
这些漏洞的存在是因为很少有程序员理解严格限制数据的数量和形式的需求,这种数据
来自于非信息的数据源。在学习安全编程的第一步是理解在程序栈中的存储的控制信息和
数据的结果。我们在第三章中覆盖了栈的规则 和缓冲区溢出漏洞,作为汇编语言学习的一部分。
我们也学习程序员,编译器和操作系统使用的来减少攻击的威胁的方法。