《操作系统真象还原》——1.2 我们需要哪些编译器

简介: GCC是由理查德·马修·斯托曼在1985年开始的。他首先扩展一个旧有的编译器,使它能编译C,这个编译器一开始是以Pastel语言所写的。Pastel是一个不可移植的Pascal语言特殊版,这个编译器也只能编译Pastel语言。

本节书摘来自异步社区《操作系统真象还原》一书中的第1章,第1.2节,作者:郑钢著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.2 我们需要哪些编译器

C语言虽然不是为设计大型软件而生的,但其却被用来开发大型软件。

现代操作系统基本上是用C语言再结合汇编语言开发的,所以C语言编译器,我们选择的是gcc。而汇编语言编译器,我们选择的是nasm。为什么选择这两个,首先因为它们都是开源软件,其次其强大的功能不亚于同类的商业软件。

1.2.1 世界顶级编译器GCC
秉着简单至上的原则,我们在开发过程中,能用简单的工具就不用复杂的。所以我们的系统,绝大部分是C语言实现的,而且并不需要多么高深的算法及数据结构功底。

另外我们在Linux下开发,所以首先的编译器就是GCC,基本上没有人不了解这个大名鼎鼎的开源编译器了。出于对这个编译器的膜拜,我还是引用wiki上的介绍:

GNU编译器套装(GNU Compiler Collection,GCC),是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发行的自由软体,也是GNU计划的关键部分,亦是自由的类Unix及苹果电脑Mac OS X 操作系统的标准编译器。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的标准。

GCC是由理查德·马修·斯托曼在1985年开始的。他首先扩展一个旧有的编译器,使它能编译C,这个编译器一开始是以Pastel语言所写的。Pastel是一个不可移植的Pascal语言特殊版,这个编译器也只能编译Pastel语言。为了让自由软件有一个编译器,后来此编译器由斯托曼和Len Tower在1987年以C语言重写并成为GNU专案的编译器。GCC的建立者由自由软件基金会直接管理。

GCC原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。GCC很快扩展,以2011年10月26日释出的4.6.2版为准,可处理的编程语言有:

1.Ada(GNAT)
2.C(GCC)
3.C++(G++)
4.Fortran(Fortran 77: G77,Fortran 90: GFORTRAN)
5.Java(编译器:GCJ;解释器:GIJ)
6.Objective-C(GOBJC)
7.Objective-C++
8.Go

好啦,介绍结束,看上去GCC很厉害,居然可以支持这么多语言。不愧是出自理查德·马修·斯托曼(Richard Matthew Stallman)之手,只要学过计算机的读者便了解此人,他到底有多厉害呢,看网友对他的评价:“曾独自一人与一众lisp黑客高手进行比赛……”好了,多说已无益,简单的半句话便彻底表达了此人深厚的计算机功力。

1.2.2 汇编语言编译器新贵NASM
新是相对于旧来说的,旧的汇编器MASM和TASM已经过时了,从名称上可以看出字母n是在m之后,其功能必然有所超越才会被大家接受。

请用一句话概括NASM优势在哪里。免费+语法简洁使人舒适+支持Linux平台。这里所说的任何一个理由都是其他同类产品不具备的,敏锐的同学是不是察觉到了什么……哈哈,怎么给人的感觉是:其他编译器不是花钱,就是语法怪异让人不爽,要么就不支持Linux,看上去选择nasm是没得可选了?我就不自问自答了,反正NASM语法很接近咱们当初学的Intel语法,我是用得很爽呢。这里就不再比较其优越性了,大家若感兴趣还是自行查阅吧。

同样是为了抒发一下对这位新贵的“爱慕之情”,简要介绍还是很有必要的。

NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。它支持相当多的目标文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微软16位的'OBJ'和'Win32'。它还可以输出纯二进制文件。它的语法设计得相当的简洁易懂,和Intel语法相似但更简单。它支持'Pentium','P6','MMX','3DNow!','SSE'和'SSE2'指令集。

介绍完了之后,咱们讨论下为什么要用汇编语言开发系统呢?就目前来看,无论再怎么要求开发过程简单,也避免不了用汇编语言,尤其是开发操作系统这类底层软件。越底层的软件就越要与硬件直接打交道,这就要求在语言层面上给开发人员提供访问端口寄存器的方法。显然,目前的高级语言都做不到这一点,像C语言这类偏底层的语言都不支持修改寄存器,用汇编语言则是不可避免的事了。

包括我在内的很多同学一听要用汇编了,都有一种小小的恐惧感,认为这是一种不好掌握的东西(我没有称之为语言而是称之为东西,是因为曾经有个女同学都不知道汇编是什么),而且程序编写起来特别麻烦,要考虑的东西太多了,代码逻辑写起来不够直接,似乎总是在迂回……以至于我们经常被汇编语言“搞定”。我个人的感觉是当我熟悉了汇编语言后,甚至觉得有一点亲切呢。当然了,任何陌生的事物经过熟悉的过程后都会变得有亲切感,关键是咱们得扛到对它熟悉为止,不能让心里的畏惧战胜自己。用汇编语言和CPU直接对话,想想就有点小兴奋呢。

不过好在我们需要用汇编的地方只是一些硬件访问、中断调用、端口读写、线程切换之类(怎么看上去好多……),我们可以写出一些通用的代码来减少汇编的枯燥。总之,只有不得不用时我们才会向汇编语言屈服。

相关文章
|
Cloud Native 编译器 Linux
如何在Windows、Mac和Linux操作系统上安装Protocol Buffers(protobuf)编译器
如何在Windows、Mac和Linux操作系统上安装Protocol Buffers(protobuf)编译器
488 0
|
Shell 编译器 Linux
Linux操作系统4:Vim编译器
Linux操作系统4:Vim编译器
214 0
|
Ubuntu Java 编译器
Linux操作系统笔记——GCC编译器
Linux操作系统笔记——GCC编译器
Linux操作系统笔记——GCC编译器
|
Linux C语言
《操作系统真象还原》——导读
以上情况对我们学习操作系统来说也同样存在,比如当老师介绍中断发生时的上下文保护时,我们更多的疑问不是如何保存CPU的上下文数据,而是想知道为什么在不同的特权级下会使用不同的栈,这背后的原理是什么,并且这是如何做到的。
1647 0
|
JavaScript 前端开发 Linux
《操作系统真象还原》——2.3 让MBR先飞一会儿
虽说主引导记录mbr是咱们能够掌控的第一个程序,但这并不是让我们为之激动的理由。我们平时所写的程序都要依赖于操作系统,而我们即将实现的这个程序是独立于操作系统的,能够直接在裸机上运行,这才是让我们激动的理由,对咱们来说这无疑是历史性的一刻。
2413 0
|
存储 内存技术 程序员
《操作系统真象还原》——2.2 软件接力第一棒,BIOS
Intel 8086有20条地址线,故其可以访问1MB的内存空间,即2的20次方=1048576=1MB,地址范围若按十六进制来表示,是0x00000到0xFFFFF。不知道硬件工程师当时设计的初衷是什么,总之人家有自己的理由,这1MB的内存空间被分成多个部分。
2103 0
|
存储
《操作系统真象还原》——第2章 编写MBR主引导记录,让我们开始 掌权 2.1 计算机的启动过程
所以,都在内存中运行程序,操作系统和硬件设计都省事了,这可能也是为了方式的统一吧,否则总不能出现某种存储介质后,操作系统和硬件就要付出额外努力去支持。当然,具体原因只有硬件工程师才知道,咱们在此先打住,继续咱们的内容。
1561 0
|
运维 Linux
《操作系统真象还原》——1.5 运行bochs
我们键入的是上面长方形框框中的部分:bochsrc.disk。由于我们刚刚把此文件放到了bochs的安装路径下,bochs找到了它并加载成功。紧接着下面给出的默认选项变成了[6],也就是Begin simulation选项,开始模拟x86硬件平台。
4261 0
|
NoSQL
《操作系统真象还原》——1.4 配置bochs
Bochs既然是模拟硬件的,它就得知道,您需要它模拟的计算机是什么样的,换句话说,在这个虚拟机中有哪些硬件,启动顺序是什么,是从软盘开始,还是从硬盘开始?人家也得像模像样地跟BIOS差不多才行。
2733 0
|
NoSQL Linux iOS开发
《操作系统真象还原》——1.3 操作系统的宿主环境
虚拟机在当今已经不是陌生的概念了,要是在几年前,我还得搬出个概念放在这给大家看看。个人觉得,要解释一个东西是什么,不如直接解释这个东西解决了哪些问题,这样大家自然就从本质上真正理解了它是什么。
2684 0
下一篇
无影云桌面