2012-08-03 43 views
2

可能重复:
How are gcc/g++ bootstrapped?“C或gcc”就像“鸡还是蛋”? :(

我想知道的gcc编译方式,因为我们都知道它是用C写的

他们是否使用了一些其他编译器拿出gcc?

如果是这样,我可以使用相同的编译来编译我的C程序吗?

+0

glibc只是一个库。它是用C编写的,当然你可以用C编译它。 – 2012-08-03 15:17:56

+0

我认为他的意思是gcc,而不是glibc。 – 2012-08-03 15:18:46

+0

我的意思是gcc,对不起,我现在会改变标题。 – Viswesn 2012-08-03 15:20:05

回答

1

他们没有使用其他编译器。你可以编写一个不使用glibc的C程序,只需告诉编译器不要使用它。所以像这样:

gcc main.c -nostdlib 
6

这里没有鸡和鸡蛋。 glibc是使用您正在使用的编译器进行编译的。

该编译器首先使用相同编译器的以前版本编译。然后它可以自行编译。

真正的鸡与鸡蛋问题在20世纪50年代被解决,当时有人不得不编写世界上第一个编译器。之后,您可以使用一个编译器编译下一个。

+0

我想第一个“编译器”实际上是一个解释器呢? – 2012-08-03 15:25:49

+0

@AlexBelanger我真的不认为这是一位口译员。也许是一个汇编程序。 – Hassan 2012-08-03 15:27:13

+0

是的,可能。你不必一次实现整个语言,所以也许整数运算,if-else和一些循环。然后,您可以使用该语言的这一部分来稍后执行其他部分。 – 2012-08-03 15:33:00

4

有两种基本的方法来建立一个新的编译器:

  1. 如果你正在写一个新的编译器为像C建立语言,使用现有的编译器从不同的供应商建立自己的新的编译器。例如,您可以使用随HP-UX附带的C编译器构建gcc

  2. 如果您正在为新语言编写编译器,请先以不同语言实现一个非常简单的编译器(第一个C编译器用PDP-11汇编器编写)开始。这个初始编译器只会识别目标语言的一小部分;基本上足以做一些文件I/O和一些简单的语句。在目标语言子集中编写一个新的编译器,并使用第一个编译器构建它。现在编写一个功能稍强的编译器,可以识别目标语言的更大的子集,然后使用第二个编译器编译它。重复这个过程直到你有一个编译器能够识别完整的目标语言。

1

这是一个有趣的问题。我想你想知道用什么语言编写了一种新语言的编译器,不是吗?那么,如果我们只有汇编语言(例如x86),编写C编译器的唯一方法就是汇编语言。后来,我们可以使用我们的汇编编译器编写一个更好,更强大的用C语言编写的编译器,等等...... 问题出现了:早期的程序员如何编写第一个汇编编译器?我的父亲告诉我:通过手动输入1和0! :-)