GCC(GNU Compiler Collection,GNU编译器套装)是一套由GNU开发的
编程语言编译器,是
自由软件的一部分,以GPL及LGPL许可证发行。GCC支持多种编程语言、操作系统和计算机系统结构,包括C、
C++、
Fortran、Pascal、
Objective-C、Java、Ada和Go等。GCC编译器已经被移植到比其他编译器更多的平台和
指令集架构上,并被广泛部署在开发自由和
专有软件的工具中。GCC还可用于许多嵌入式系统,包括基于ARM和Power ISA的芯片。GCC不仅是GNU操作系统的官方编译器,还是许多类UNIX系统和
Linux发行版的标准编译器。GCC原本只能处理
c语言,但后来也支持了C++语言,以及其他语言的前端。GCC编译器支持OpenMP和OpenACC规范。GCC原本用C开发,后来转向了C++。GCC在
自由软件的发展中发挥了重要作用,不仅是一个工具,还是一个典例。
正文
GCC 原名为 GNU C 语言编译器,因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。之后也变得可处理
Fortran、Pascal、
Objective-C、Java, 以及 Ada与其他语言。
概观
GCC是由
理查德·斯托曼在1985年开始的。他首先扩增一个旧有的编译器,使它能编译C,这个编译器一开始是以Pastel语言所写的。Pastel是一个不可移植的Pascal语言特殊版,这个编译器也只能编译Pastel语言。为了让
自由软件有一个编译器,后来此编译器由
理查德·斯托曼和Len Tower在1987年以
c语言重写并成为GNU专案的编译器。GCC的建立者由
自由软件基金会直接管理。
在1997年,一群不满GCC缓慢且封闭的创作环境者,组织了一个名为EGCS〈Experimental/Enhanced GNU
编译器 System〉的专案,此专案汇整了数项实验性的分支进入某个GCC专案的分支中。EGCS比起GCC的建构环境更有活力,且EGCS最终也在1999年四月成为GCC的官方版本。
GCC目前由世界各地不同的数个程序设计师小组维护。它是移植到
中央处理器架构以及操作系统最多的编译器。
由于GCC已成为GNU系统的官方编译器(包括GNU/Linux家族),它也成为编译与建立其他操作系统的主要编译器,包括BSD家族、Mac OS X、NeXTSTEP与BeOS。
GCC通常是跨平台软件的编译器首选。有别于一般局限于特定系统与执行环境的编译器,GCC在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。
目前支持的语言
以2006年5月24日释出的4.1.1版为准,本编译器版本可处理下列语言:
Fortran前端在4.0版之前是G77,此前端仅支援Fortran 77。在本版本中,G77被废弃而采用更新的G
Fortran,因为此前端支援Fortran 95。
下列前端依然存在:
支援的处理器架构
GCC目前支援下列处理器架构(以4.1版为准):
较不知名的处理器架构也在官方释出版本中支援:
由FSF个别维护的GCC处理器架构:
当GCC需要移植到一个新平台上,通常使用此平台固有的语言来撰写其初始阶段。
结构
GCC的外部接口长得像一个标准的
unix编译器。使用者在命令列下键入gcc之程序名,以及一些命令参数,以便决定每个输入档案使用的个别语言编译器,并为输出程序码使用适合此硬件平台的组合语言编译器,并且选择性地执行连结器以制造可执行的程序。
每个语言编译器都是独立程序,此程序可处理输入的原始码,并输出组合语言码。全部的语言编译器都拥有共通的中介架构:一个前端解析符合此语言的原始码,并产生一抽象语法树,以及一翻译此语法树成为GCC的暂存器转换语言〈RTL〉的后端。编译器
最优化与静态程序码解析技术(例如FORTIFY_SOURCE,一个试图发现
缓冲区溢位〈
缓冲器 overflow〉的编译器)在此阶段应用于程序码上。最后,适用于此硬件架构的组合语言程序码以Jack Davidson与Chris Fraser发明的算法产出。
几乎全部的GCC都由C写成,除了Ada前端大部分以Ada写成。
前端接口
前端的功能在于产生一个可让后端处理之语法树。此语法解析器是手写之递回语法解析器。
直到最近,程序的语法树结构尚无法与欲产出的处理器架构脱钩。而语法树的规则有时在不同的语言前端也不一样,有些前端会提供它们特别的语法树规则。
在2005年,两种与语言脱钩的新型态语法树纳入GCC中。它们称为GENERIC与GIMPLE。语法解析变成产生与语言相关的暂时语法树,再将它们转成GENERIC。之后再使用"gimplifier"技术降低GENERIC的复杂结构,成为一较简单的静态唯一形式(Static Single Assignment form,SSA)基础的GIMPLE形式。此形式是一个与语言和处理器架构脱钩的全域最佳化通用语言,适用于大多数的现代
编程语言。
中介接口
一般编译器作者会将语法树的最佳化放在前端,但其实此步骤并不看语言的种类而有不同,且不需要用到语法解析器。因此GCC作者们将此步骤归入通称为中介阶段的部分里。此类的
最优化包括消解死码、消解重复运算与全域数值重编码等。许多最佳化技巧也正在实作中。
后端接口
GCC后端的行为因不同的前处理器宏和特定架构的功能而不同,例如不同的
字符尺寸、呼叫方式与大小尾序等。后端接口的前半部利用这些讯息决定其RTL的生成形式,因此虽然GCC的RTL理论上不受处理器影响,但在此阶段其抽象指令已被转换成目标架构的格式。
GCC的最佳化技巧依其释出版本而有很大不同,但都包含了标准的最佳化算法,例如循环最佳化、执行绪跳跃、共通程序子句消减、指令排程等等。而RTL的最佳化由于可用的情形较少,且缺乏较高阶的资讯,因此比较起近来增加的GIMPLE语法树形式,便显得比较不重要。
后端经由一重读取步骤后,利用描述目标处理器的指令集时所取得的资讯,将抽象暂存器替换成处理器的真实暂存器。此阶段非常复杂,因为它必须关照所有GCC可移植平台的处理器指令集的规格与技术细节。
后端的最后步骤相当公式化,仅仅将前一阶段得到的组合语言码藉由简单的副函式转换其暂存器与
内存位置成相对应的机械码。
替 GCC 程序除错
为 GCC 除错的首选工具当然是 GNU 除错器。其他特殊用途的除错工具是
Valgrind, 用以发现内存漏失 (Memory leak)。而 GNU 测量器 (gprof) 可以得知程序中某些函式花费多少时间,以及其呼叫频率;此功能需要使用者在编译时选定测量〈profiling〉选项。
GCC编译器的使用
首先检查是否在你的机器上安装了GCC,使用命令:
可用rpm -q gcc 检查。
如果沒有安裝,請依序檢查並安裝下面各RPM
libbinutils
binutils
make
glibc-devel
gcc-cpp
gcc
看下面的例子:test.c
#include
main()
{ char *str="I like Linux! I advices you jion in the Linux World";
printf("%s ",str);
exit(0);
}
使用gcc编译。输入gcc -c test.c得到目标文件test.o.-c命令表示对文件进行编译和汇编。但并不连接。如果再健入gcc -o ../bin/test test.o,那么将得到名为test的可执行文件。其实这两不可以一气呵成,gcc ../bin/test test.c.如果程序没有错误救生成了可执行文件。也许你会觉得基于命令行的编译器比不上如VC之类的集成开发环境,的确gcc的界面要改进,但是你一旦熟练了就会感到。gcc的效率如此之高。可以告诉大家的是
Linux底下强大的C/
C++集成开发环境Kdevelope和Vc一样强大,使用了Gcc编译器。
GNU C编译器 即gcc是一个功能强大的ANSI C兼容编译器,你会操作其他操作系统下的一种C编译器,能很快掌握GCC,我也是学了不久的GCC.
1、使用Gcc,Gcc是基于命令行的,使用时通常后跟一些选项和文件名。Gcc的基本用法如下: gcc [options] [filenames] 命令行选项制定操作将对命令行上的每个给出的文件执行。
2、GCC的常用选项
编译选项:gcc有超过100个的编译选项可用。具体的可以使用命令man gcc察看
优化选项:用GCC编译C/
C++代码时,它会试着用最少的时间完成编译并且编译后的代码易于调试。易于调试意味着编译后的代码与源代码有同样的执行顺序,编译后的代码没有经过优化。有很多的选想可以告诉GCc在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件。这些选项中最典型的就是-O和-O2。-O选项告诉gcc对源代码进行基本优化。-O2选项告诉Gcc产生尽可能小的和尽可能快的代码。还有一些很特殊的选项可以通过man gcc察看。
调试和剖析选项:GCC支持数种调试剖析选项。在这些选项中最常用的是-g和-pg.-g选项告诉gcc产生能被GNU调试器(如gdb)使用的调试信息,以便调试用户的程序。-pg选项告诉gcc在用户的程序中加入额外的代码,执行时,产生gprof用的剖析信息以显示程序的耗时情况。
使用方法:在命令行中健入gdb并按回车就可以运行gdb了,启动gdb后,能在命令行上制定很多的选项,也可以下面的方式来运行gdb: gdb filename 用这种方式运行gdb时,能直接指定想要调试的程序。在命令行上健入gdb -h得到一个有关gdb的选项的说明简单列表。
编译代码以供调试,为了使gdb工作,必须使程序在编译时包含调试信息,调试信息包含程序里的每个变量的类型,在可执行文件里的地址
映射以及源代码的行号。
GNU侦错器利用这些信息使源代码和
SN码相关联。
关于gcc的大体就写这么多吧,根多的信息可以查找帮助,记得学习
Linux的一大武器man或者info命令,下次在介绍一下使用c/
C++编写大型程序的makefile文件和make命令。
参考资料
Warning: Invalid argument supplied for foreach() in
/www/wwwroot/newbaike1.com/id.php on line
362