旁注: GNU项目
GCC是CNU项目开发出来的许多实用工具之一.GNU项目是理查德·马修·斯托曼(Richard Stallman)在1984年发起的一个免税慈善项目,其雄心勃勃的目标是开发一个完整的类Unix系统(Unix-like,类Unix系统)它的源代码能够不受限制的被修改和传播.GNU项目已经开发出一个包含Unix操作系统的所有主要部件的环境,除了内核,内核是有Linux项目中独立发展而来的. GNU的环境包括了EMACS编辑器(editor),GCC编译器(debugger ),GDB调试器(debugger ),汇编器(assembler ),链接器(linker),处理二进制文件(binaries ,二进制文件)的公用程序(utilities )和其他的组件. GCC编译器(compiler)已经发展到支持许多不同的语言,能够为许多不同的机器语言生成代码.它支持的语言包括C,C++,Fortran,Java,Pascal,Objective-C和Ada.
GNU项目一项非凡的成就也是一项被忽略的成就.现代的开源运动(通常是和Linux关联)思想(intellectual )起源于GNU项目里的自由软件概念(notion)(这里的free是”言论自由”里面的自由之意,而不是”免费啤酒”里面的免费之意).进一步, Linux如此受欢迎很大程度上归功于(owes)GNU工具,其为Linux内核提供了环境.
1.3明白编译系统怎样工作是值得的
一个简单的程序例如hello.c,我们可以依靠它的编译系统(compilation system )去产生正确有效的机器代码. 然而, 这里有几个为什么程序员需要明白编译系统怎样工作的重要原因:
•优化(optimizing )程序的性能(performance). 现代编译器通常是能够生产好代码的复杂工具.作为一个程序员,我们不需要为了写出高效代码知道在编译器内部的工作.然而,为了在我们的C程序中做出好的编码决策,我们确实需要明白一些基本的东西像机器代码(machine-level code)和编译器怎样把不同的C语句(statements )转换成机器代码.例如,switch语句是否总是比if-else语句更高效?函数调用(function calls)会产生多少开销?while循环是否总是比for循环更加高效?指针引用比数组引用更加高效吗?为什么将循环求和的结果放到一个本地变量中,会比将其放到一个通过引用传递过来的参数中,运行会快很多呢?当我们怎样简单的重新排列(rearrange ,重新排列)算数表达式(arithmetic expression )中的括号(parentheses )时我们的函数会跑得更快?
在第3章里,我们将会说明两个相关的机器语言: IA32, 32位的代码在运行Linux的计算机里无处不在,Windows和最近的其他Macintosh操作系统(operating systems,操作系统)和x86-64,一种在最近的微处理器(microprocessors)中发现的64位拓展. 我们描述编译器怎样把不同的C构造翻译成这种机器语言语言.在第5章, 你将学到怎样对C代码进行简单的转化来帮助编译器更好地完成工作.在第6章,你将要学习存储器系统(memory system)的层次结构,C语言编译器怎样在内存里存储数据数组以及你的C程序怎样利用这些知识更加高效的运行(run).
网友评论