如何在没有C本地编译器的情况下创建C编译器

5

这是一个简单的问题。如果要编译C编译器,是否需要C编译器?也许可以直接使用汇编代码?或者内核提供了将C转换为汇编语言并创建升级基础设施的基本工具?这也是一个愚蠢的问题,但我真的很感兴趣如何从0设计一个操作系统(不是我),以与CPU和内存交互。


2
听起来你对“引导”这个主题很感兴趣。我建议你去谷歌一下,看看是否会引发更具体的问题。 - Code-Apprentice
2
维基百科上关于编译器引导的文章应该会有所帮助。 - Michael Mior
1
我非常赞同C编译内核模块的想法(Linus会喜欢的),同时也支持“基础设施升级”的概念。 - Kerrek SB
1
相关:第一批汇编器是用机器码编写的吗? - Sergey Kalinichenko
可能是如何编写第一个C编译器?的重复问题。 - Ciro Santilli OurBigBook.com
显示剩余3条评论
2个回答

9

引导程序

这个词源于短语“用自己的靴带拉自己”,如果你想查一下的话。引导程序是一个简单的过程,但需要进行大量的工作。

  1. 用另一种语言编写C编译器。

  2. 用C语言编写C编译器。

  3. 使用第1步中的编译器来编译第2步中的编译器。

某些其他编译器也需要进行引导程序,不仅仅是C编译器。例如,GHC必须使用自身来编译。

请注意,只有在以下两种情况同时满足时才需要进行引导程序:

  1. 您正在发明一种新的语言,因此不存在现有的编译器。

  2. 您想要用正在编译的语言编写编译器。

这与操作系统无关。如果您正在设计操作系统,那么您已经有了足够的工作量。如果您的新操作系统尚未拥有C编译器,您可以从另一个操作系统交叉编译编译器。这样做要少得多——可能只需要几个小时或几天,而不是几个月或几年。


3
这似乎是一个需要使用 Tiny C Compiler (http://bellard.org/tcc/) 的任务。
这是我所知道的最小的 C 编译器,一旦移植完成,它就可以编译更大的编译器,并且有许多指南介绍如何将其移植到自定义系统中。

另外,tcc足够简单,可以手动将其“编译”为x86汇编/操作码。这是我想做的疯狂项目之一:获取一个旧的穿孔卡读取器和穿孔卡,用手动“编译和链接”的tcc打孔,并使用由离散元件制成的适配器将其连接到现代计算机的LPC接口,只是为了好玩。 - datenwolf
1
你有一种奇怪的乐趣感,我的朋友 :P - salezica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接