GCC强大背后
2010-11-24 21:37 wwang 阅读(16788) 评论(32) 编辑 收藏 举报前记: 经常浏览博客园的同学应该会觉得本文有标题党之嫌,这个标题的句式来自于MiloYip大牛的大作《C++强大背后》,在此,向Milo兄致意。
GCC,全称GNU Compiler Collection,是一套GNU开发的编译器环境,它的创始人便是大名鼎鼎的Richard.M.Stallman。最初GCC刚开始开发时,它还叫做GNU C Compiler,随着开发的深入,GCC很快得到了扩展,不仅可以支持C语言,还可以处理C++,Pascal,Object-C,Java以及Ada等其他语言。目前,GCC不仅是GNU的官方编译器,也成为编译和创建其他操作系统的编译器,包括BSD家族以及MAC OS X等。另外,GCC也是跨平台交叉编译的首选,它不仅支持Intel的x86系列,同时也支持MIPS,ARM,PowerPC,SPARC等等处理器。可以这么说,即使GCC不是世界上效率最高的编译器,它也一定是世界上最全面的编译器。
1. GCC简介
gcc hello.c -o hello
cpp hello.c > hello.i
gcc -S hello.i
as hello.s -o hello.o
ld -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i686-linux-gnu/4.4.5/crtbegin.o -L/usr/lib/gcc/i686-linux-gnu/4.4.5 hello.o -lgcc -lgcc_eh -lc /usr/lib/gcc/i686-linux-gnu/4.4.5/crtend.o /usr/lib/crtn.o -o hello
2. GCC强大的背后
学过编译原理这门课程的同学对下面这副图应该很熟悉,这是经典的编译流程。
GCC作为经典的编译器,自然也是遵循这个教科书流程(实际GCC的处理更复杂点,但本质上是一样的)。我们先简化一下上面这幅图,以中间代码为分界,前面的词法分析、语法分析、语义分析我们把它称之为前端处理,后面的优化和目标代码生成我们称之为后端处理。
试想一下,是否可以为不同的高级语言单独写一个前端,然后为不同的处理器架构单独写一个后端呢?
GCC基本上也是这么实现的,不过不要误会,并没有一个统一的gcc执行程序能够处理如此多的前端和后端,每个语言的编译器都是一个独立的程序(如C语言的编译器是gcc,C++的编译器是g++),而不同的后端也要对应不同的可执行程序。你可以下载单独的一份GCC源代码,通过不同的configure来生成自己需要的编译器。
而且,编译器的实现也比上图要复杂的多,前端的主要功能是产生一个可供后端处理的语法树,而语法树结构实际上很难与处理器架构脱钩,这些都是编译器应用中需要解决的问题。
GCC强大的真正原因是什么?是因为它支持了众多的前端和后端吗?这些都不过是一个表象而已。GCC是一款真正自由的编译器,我们可以随时把代码拿过来修改以实现自己需要的功能。如果你的硬件平台增加了一些指令,而普通的编译器并不能产生这些指令怎么办?在GCC后端添加这些指令吧。如果你觉得C语言用的不太顺手,想给它添加一些功能怎么办?修改GCC的前端吧。因为有了GCC,我们才拥有这些自由,以及迅速实现自己想法的能力,而这些才是GCC强大背后的基础。
2010年1月份的时候,Google的Go语言前端被允许进入GCC编译器家族,GCC更加强大了。
3. GCC的多样性
3.1 PC开发
Linux
MAC OS X
Windows
DOS
3.2 嵌入式开发
Android
iOS
MeeGo/Symbian
作者:wwang
出处:http://www.cnblogs.com/wwang
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
--------懒人评论(请勿重复点击)--------