一.3 了解编译系统如何工作是大有益处的

        对于像hello.c这样就简单的程序,我们可以依靠编译系统生成正确有效的机器代码。但是,有一些重要的原因促使程序员必须知道编译系统是如何工作的。

  • 优化程序性能。现代编译器都是成熟的工具,通常可以生成很好的代码。作为程序员我们无须为了写出高效代码而去了解编译器的内部工作。但是,为了在C程序中做出好的编码选择,我们确实需要了解一些机器代码以及编译器将不同的C语句转化为机器码的方式。比如,一个switch语句是否总是比一系列的if-else语句高效的多?一个函数调用的开销有多大?while循环比for循环更有效吗?指针引用比数组索引更有效吗?为什么将循环求和的结果放在一个本地变量中,会比将其放在一个通过引用传递过来的参数中,运行起来快很多呢?为什么我们只是简单地重新排列一下算术表达式中的括号就能让函数运行得更快?
            在第三章中,我们将介绍x86-64,最近几代Linux、Macintosh和Windows计算机的机器语言。我们会讲述编译器是怎样将不同的C语言结构翻译成这种机器语言的。在第五章中,你将学习如何通过简单转换C语言代码,帮助编译器更好地完成工作,从而调整C程序的性能。在第六章中,你将学习储存系统的层次结构特性,C语言编译器如何将数组存放在内存中,以及C程序又是如何能够利用这些知识从而更高效地运行。
  • 理解链接时出现的错误。根据我们的经验,一些最令人困扰的程序错误往往都与链接器操作有关,尤其是当你试图构建大型的软件系统时。比如,链接器报告说它无法解析一个引用,这是什么意思?静态变量和全局变量的区别是什么?如果你在不同的C文件中定义了两个名字相同的全局变量会发生什么?静态库和动态库的区别是什么?我们在命令行上排列库的顺序有什么影响?最严重的是,为什么有些链接错误直到运行时才会出现?在第七章中,你将得到这些答案。
  • 避免安全漏洞。多年来,缓冲区溢出错误是造成大多数网络和Internet服务器上安全漏洞的主要原因。存在这些错误是因为很少有程序员能够理解需要限制从不受信任的源接收数据的数量和格式。学习安全编程的第一步就是理解数据和控制信息存储在程序栈上的方式会引起的后果。作为学习汇编语言的一部分,我们将在第三章描述堆栈原理和缓冲区溢出错误。我们还将学习程序员、编译器和操作系统可以用来降低攻击威胁的方法。

写在后:……这本书前面3节,都在画大饼。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值