GCC强大背后 最初GCC刚开始开发时它还叫做GNU C Compiler随着开发的深入GCC很快得到了扩展不仅可以支持C语言还可以处理CPascalObject-CJava以及Ada等其他语言。目前GCC不仅是GNU的官方编译器也成为编译和创建其他操作系统的编译器包括BSD家族以及MAC OS X等。另外GCC也是跨平台交叉编译的首选它不仅支持Intel的x86系列同时也支持MIPSARMPowerPCSPARC等等处理器。可以这么说即使GCC不是世界上效率最高的编译器它也一定是世界上最全面的编译器。1. GCC简介我们先回到一个常识性的问题什么是编译器呢简单地说编译器可以看作是一个语言翻译器。就像把中文翻译成英语一样编译器可以把高级语言翻译成计算机能够执行的机器语言。这样看来GCC可以算得上是一个精通多国语言的高级翻译官了。最简单的GCC使用指令如下所示gcc hello.c -o helloGCC接受hello.c作为输入最后产生目标可执行代码hello。这个简单的流程实际上经历了很多步骤如下图所示虽然我们只用了一条命令就完成了编译但实际上gcc命令依次呼叫了cppgcc自己gas以及ld来进行完整的编译流程最后生成最终的可执行文件hello。下面我们看一下分解动作cpp hello.c hello.igcc -S hello.ias hello.s -o hello.old -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看完这些步骤有没有晕头转向的感觉呢对于普通的用户来说还是让GCC帮我们做这些事情比较好。对于如何学习使用GCC可以参考GCC官方的手册如果大家觉得官方的手册太罗嗦我这里推荐一本GCC的入门书籍《An Introduction to GCC》这本书详尽的介绍了GCC的使用方法内容浅显易懂很适合初学者。2. GCC强大的背后学过编译原理这门课程的同学对下面这副图应该很熟悉这是经典的编译流程。GCC作为经典的编译器自然也是遵循这个教科书流程实际GCC的处理更复杂点但本质上是一样的。我们先简化一下上面这幅图以中间代码为分界前面的词法分析、语法分析、语义分析我们把它称之为前端处理后面的优化和目标代码生成我们称之为后端处理。试想一下是否可以为不同的高级语言单独写一个前端然后为不同的处理器架构单独写一个后端呢GCC基本上也是这么实现的不过不要误会并没有一个统一的gcc执行程序能够处理如此多的前端和后端每个语言的编译器都是一个独立的程序如C语言的编译器是gccC的编译器是g而不同的后端也要对应不同的可执行程序。你可以下载单独的一份GCC源代码通过不同的configure来生成自己需要的编译器。而且编译器的实现也比上图要复杂的多前端的主要功能是产生一个可供后端处理的语法树而语法树结构实际上很难与处理器架构脱钩这些都是编译器应用中需要解决的问题。GCC强大的真正原因是什么是因为它支持了众多的前端和后端吗这些都不过是一个表象而已。GCC是一款真正自由的编译器我们可以随时把代码拿过来修改以实现自己需要的功能。如果你的硬件平台增加了一些指令而普通的编译器并不能产生这些指令怎么办在GCC后端添加这些指令吧。如果你觉得C语言用的不太顺手想给它添加一些功能怎么办修改GCC的前端吧。因为有了GCC我们才拥有这些自由以及迅速实现自己想法的能力而这些才是GCC强大背后的基础。2010年1月份的时候Google的Go语言前端被允许进入GCC编译器家族GCC更加强大了。3. GCC的多样性GCC因为其灵活性被应用到了很多领域和系统从PC上的开发到嵌入式开发都可以见到GCC的影子。3.1 PC开发我们先看看PC。MAC自从投入Intel的怀抱是否也可以看作是一种PC呢LinuxLinux系统应该是GCC的主战场但也是最没必要去说的一个系统除了GCC难道我们还有更好的选择吗Linux内核、Apache服务器、MySQL数据库等等一系列伟大的作品都是通过GCC来构建的GCC可以说是GNU/Linux系统的基石。MAC OS XMAC OS X也是GCC的重度用户其应用程序开发环境Cocoa就是使用的GCC所以在MAC OS X下开发也是离不开GCC的。Windows现在在Windows下开发C/C程序一般都是用微软的编译器当年的Borland已经成为传说。但是如果你不想付钱的话也可以考虑Windows下的GCC。在Windows下体验GCC最常用的有两种方式一是在Cygwin下使用GCC另外一种是使用MinGW。Cygwin是一个自由软件的集合最初由Cygnus Solutions开发目的是在Windows系统上运行类Unix的软件。通过Cygwin编译的程序可以在Windows上运行但必须使用cygwin.dll。MinGW(Minimalist GNU for Windows)是将GNU开发工具移植到Windows平台的产物包括一系列头文件、库和可执行文件用MinGW开发的程序不需要额外的第三方DLL就可以直接在Windows上运行。Nokia的图形开发包QT在Windows下就是调用MinGW来编译的。DOS在DOS系统下也是可以用GCC的国内的DOS开发者可能更熟悉Turbo C或者Open WatcomGCC的DOS版本DJGPP其实也是32位DOS程序开发的主流环境之一。最初DJGPP的发起人DJ Delorie曾经询问过Richard StallmanFSF是否考虑过把GCC移植到MS-DOS下当时Richard的回答是GCC太庞大而MS-DOS只不过是个16位的操作系统所以官方并没有考虑这件事。DJ Delorie并没有因此而退缩最终给我们带来了这个优秀的开发平台。DJGPP刚开始开发时叫做djgcc在引入了C之后改为现在这个名字DJs GNU Programming Platform。3.2 嵌入式开发对于嵌入式开发领域来说因为开发板的能力限制是无法运行编译环境的这样就需要在PC上通过交叉编译来生成目标可执行程序GCC的高度灵活性在嵌入式开发上发挥了极大的作用。Android看看当今最火的移动平台Android就是完全用GCC来构建的请注意这里指的不是Android应用程序Android下的应用程序是运行在Dalvik虚拟机上的Java程序。iOS