GNU是Gnu's Not Unix的缩写,那么Gnu's Not Unix里面的Gnu是什么意思, Gnu's Not Unix里的Gnu同GNU。这个是递归。
GNU就是GNU's Not Unix的缩写, GNU 的创始人Stallman 认为UNIX 虽然不是最 好的操作系统,但是至少不会太差,而他自信有能力把UNIX 不足的地方加以改进,使它 成为一个优良的操作系统, 就是名为 GNU的一个同UNIX兼容的操作系统,并且开发这 个系统的目的就是为了让所有计算机用户都可以自由地获得这个系统。任何人都可以免费 地获得这个系统的源代码,并且可以相互自由拷贝。因而在使用GNU软件的时候我们可以 理直气壮地说我们使用的是正版软件。当然GNU也是有自己的版权声明(即GPL,见附 录A)的,就是它有名的Copyleft(相对于版权的英文Copyright),就是用户获得GNU 软件后可以自由使用和修改,但是用户在散布GNU软件时,必须让下一个用户有获得源代 码的权利并且必须告知他这一点。这一条看似古怪的规定是为了防止有些别有用心的人或 公司将GNU软件稍加修改就去申请版权,说成是自己的产品。其目的就是要让GNU永远 是免费和公开的。
GNU是谁发起的? GNU 是由自由软件基金会 (Free Software Foundation, FSF) 的董事长Richard M. Stallman (RMS)于1984年发起的,如今已经有十几年的历史了。 Stallman
本来是在美国麻省理工学院的人工智能实验室从事研究工作的研究员, 同时也是 世界上可数的几个顶尖程序员之一,他的最著名的作品也是GNU的第一个软件就是GNU Emacs,UNIX平台上的一个编辑器。这个软件推出后受到广大UNIX用户 的热烈欢迎, 由于它同时提供源代码,大家都热心地替它排除错误,增加功能,它的功能越来越强大, 终于成为UNIX平台上最好的编辑器,上至CRAY超级计算机,下至最普遍的 PC机,从 DOS到Windows,从VMS到UNIX都可以使用这个Emacs。受到这个软件成功的鼓励, Stallman成立了自由软件基金会,以推广GNU计划。 基金会成立之后,主要靠一些厂家 的捐献和出售GNU程序的使用手册,以及拷贝GNU软件的电脑磁带和光盘来维持,不过 许多硬件厂家开始基金会提供高性能的工作站,这其中包括HP和 SONY,AT&T这样的 国际性大公司。
GNU目前已经推出的软件主要由Emacs──功能强大的编辑环境,GCC──性能优 异的多平台的C,C++,Fortran编译器和其他40多种软件。其中GCC的成功为GNU带 来了前所未有的影响。GCC是一种可以在11种硬件平台上编译出可执行程序的超级编译 器,而且其执行效率更是惊人,与一般的编译器相比平均效率要高20%-30%。这使得很多 商业公司也采用GCC来开发软件,其中包括像HP公司这样的专业大公司。 而现在回到苹 果公司的前NeX
T公司总裁斯蒂夫·乔布斯也对Stallman尊敬有加,因为NeXT公司的软 件都是用GCC开发的,在PC游戏中最好的3D射击游戏quake(由ID Software公司开发) 也是用GCC的DOS移植版本djgpp编写的。GCC是C,C++,Objective C(由NeXT公 司贡献)三者合一的编译器,它的编译原理同大多数编译器不一样,它先有一个前端处理 程序将C,C++,Ovjective C的语句转换成为一个类似于Lisp的内部语言--RTL,再 由一个后端处理程序将其优化后产生目的CPU可以执行的机器代码,因而对于每种新语言 来说,只要写好一个新的前端处理程序就可以立刻将此语言移植到GCC已经支持的不同硬 件平台上去,而且编译出来的就已经是经过优化的二进制代码。除了C系列以外,GCC还 有Fortran 77,ada9x,Pascal的前端处理程序。GCC的多平台的实现方法同JAVA的虚 拟机技术不太一样,因而其运行速度远非JAVA能望其项背。
GNU 开始的策略就是先开发 UNIX 已经有的程序(因为计划中GNU将会是一个与 UNIX兼容的操作系统,而UNIX下的标准使用界面已经非常完善了,所以先依照这个标准 开发应用程序,将来 GNU 自己的系统核心一出来,就立即可以使用所有先前开发的GNU 应用程序),因此会先有 emacs,GCC 等工具软件开发出来。其中 GCC 更是GNU计划 自立更生的一个重要步骤(不需要依靠商业软件来产生/编译整个GNU系统),如今这套 程序开
发工具已经很成熟了。下一步要做的就是开发GNU的核心--Hurd了,只要Hurd 一开发出来,GNU 就是一套能够自我开机,真正自给自足,完整的自由操作系统。Hurd 是基于Mach这个微内核(micro kernel)上的操作系统核心。 以后会使用尤他大学的Mach4 (一个更为方便和快速的微内核),由于Hurd基于Mach,所以只要Mach移植到什么机 器上,Hurd也立刻就是这种硬件平台的操作系统,就这一点而言,它是一种很前卫的操作系统。
但是 Linux 在短短的几年内崛起,也使用 GNU 的版权声明,大有取代 Hurd 之势。 在网络上甚至有不少人认为Hurd 应该停止开发, 因为 Linux 系统已经十分成熟,GNU 实际上可以使用Linux 当作核心,也能构成一套完整的操作系统。甚至连自由软件基金会 的技术人员也承认,要是 Linux早几年出现,也许就不用发展 Hurd 了。但是 Linux 还是 晚了一步,Hurd 已经计划很久了,技术上有很多非常领先的地方,能够支持的硬件平台也 比Linux多,不完成就太可惜了。1994 年 11 月,Hurd 的第一个雏形已经发表; 1995 年 4 月,也发表了第二次snapshot。Hurd目前的版本是0.2,是1997年6月发布的,已经可 以独立安装与稳定运行了,GNU版本的Mach 目前的版本是1.1.3。与此同时,已经开发 出一个基于微内核的Linux版本了,目前有一个可以在HP-PA RISC机器上运行的Linux系 统。 实际上,自由软件基金会目前有一套以 Linux 为核心的 GNU 系统计划。这个计划 就是自由
软件基金会支持的 Debian Linux。 Debian Linux 是 GNU软件与公共软件 (Public Domain Software )最彻底的结合,它是一套完全由GNU 和公共软件配置起来的, 而且具有商业操作系统水平的操作系统。
注一:POSIX(Portable Operating System Interface)标准操作系统界面。
注二:按照编程人员的习惯,一个软件在第一次推出前的所有测试版本都不能称作1.0 版,只能叫作0.3,0.7,0.99版,其数目越接近1,就表明其越来越接近正式发布
1、用于linux系统下编程的编译器
概述
GCC(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语言编译器。它是一套 GNU编译器套装。以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU计划的关键部分,亦是自由的类Unix及苹果电脑 Mac OS X 操作系统的标准编译器。
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 Compiler System〉的专案,此专案汇整了数项实验性的分支进入某个GCC专案的分支中。EGCS比起GCC的建构环境更有活力,且EGCS最终也在1999年四月成为GCC的官方版本。
GCC目前由世界各地不同的数个程序设计师小组维护。它是移植到中央处理器架构以及操作系统最多的编译器。
由于GCC已成为GNU系统的官方编译器(包括GNU/Linux家族),它也成为编译与建立其他操作系统的主要编译器,包括BSD家族、Mac OS X、NeXTSTEP与BeOS。
GCC通常是跨平台软件的编译器首选。有别于一般局限于特定系统与执行环境的编译器,GCC在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。
结构
GCC的外部接口长得像一个标准的Unix编译器。使用者在命令列下键入gcc之程序名,以及一些命令参数,以便决定每个输入档案使用的个别语言编译器,并为输出程序码使用适合此硬件平台的组合语言编译器,并且选择性地执行连结器以制造可执行的程序。
每个语言编译器都是独立程序,此程序可处理输入的原始码,并输出组合语言码。全部的语言编译器都拥有共通的中介架构:一个前端解析符合此语言的原始码,并产生一抽象语
法树,以及一翻译此语法树成为GCC的暂存器转换语言〈RTL〉的后端。编译器最佳化与静态程序码解析技术(例如FORTIFY_SOURCE,一个试图发现缓冲区溢位〈buffer overflow〉的编译器)在此阶段应用于程序码上。最后,适用于此硬件架构的组合语言程序码以Jack Davidson与Chris Fraser发明的算法产出。
几乎全部的GCC都由C写成,除了Ada前端大部分以Ada写成。
前端接口
前端的功能在于产生一个可让后端处理之语法树。此语法解析器是手写之递回语法解析器。
直到最近,程序的语法树结构尚无法与欲产出的处理器架构脱钩。而语法树的规则有时在不同的语言前端也不一样,有些前端会提供它们特别的语法树规则。
在2005年,两种与语言脱钩的新型态语法树纳入GCC中。它们称为GENERIC与GIMPLE。语法解析变成产生与语言相关的暂时语法树,再将它们转成GENERIC。之后再使用"gimplifier"技术降低GENERIC的复杂结构,成为一较简单的静态唯一形式(Static Sin
gle Assignment form,SSA)基础的GIMPLE形式。此形式是一个与语言和处理器架构脱钩的全域最佳化通用语言,适用于大多数的现代编程语言。
中介接口
一般编译器作者会将语法树的最佳化放在前端,但其实此步骤并不看语言的种类而有不同,且不需要用到语法解析器。因此GCC作者们将此步骤归入通称为中介阶段的部分里。此类的最佳化包括消解死码、消解重复运算与全域数值重编码等。许多最佳化技巧也正在实作中。
后端接口
GCCgnu编译器后端的行为因不同的前处理器宏和特定架构的功能而不同,例如不同的字符尺寸、呼叫方式与大小尾序等。后端接口的前半部利用这些讯息决定其RTL的生成形式,因此虽然GCC的RTL理论上不受处理器影响,但在此阶段其抽象指令已被转换成目标架构的格式。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论