用C#编写的开源C编译器?

23

我开始学习编译器创建,找到了一些很好的入门和高级资料,但其中没有介于两者之间的内容。我已经为玩具语言创建了三个不同的简单概念验证编译器,但我想接触一些真实的东西。

在语法方面最直接的真实语言似乎是C。由于我现在最熟悉的语言是C#,我想研究一个用C#编写的真正的非教程C编译器的源代码。这样的编译器(包括源代码)存在吗?


理想情况下,我希望有一个用C#编写的C编译器,而不是.NET或C#编译器。
我知道C# --> C 的感觉有点反向,但这将使我更容易地深入学习编译器,因为我首先使用的是熟悉的语言,然后再去改变它。

尽管我不想寻找C#/.NET编译器,但以下列出了一些编译器以供需要这类编译器的人参考:


1
https://github.com/phisiart/C-Compiler - Robert Harvey
4个回答

11
你会很难找到示例代码。编译器编写者使用自举。第一个C编译器是用B语言编写的。然后用它来编写第一个C++编译器。然后用它来编写C#编译器。这非常常见,用于编写托管代码的编译器。

这不是一个可以倒退的过程。虽然横向移植很常见,但C编译器经常被用于交叉编译其他操作系统的编译器。

我想我用了这本书,附录里有非常好的C编译器代码。用C语言编写。在我需要大型项目中编写Basic编译器时,我用了其中的部分。表达式解析器很难正确处理,对于运算符优先级规则有一种优雅的解决方案。

以托管语言为目标是更容易实现的方法。语言不应该太重要,真正的挑战是让它工作起来。即使获得托管代码的工作也要容易得多。如果你想瞄准C语言,你需要黑带机器码技巧和深入理解目标文件格式和链接器。


1
引用DMR在http://cm.bell-labs.com/cm/cs/who/dmr/chist.html上的话: 1971年,我开始通过添加字符类型来扩展B语言,并重写了其编译器,以生成PDP-11机器指令而不是线程代码。因此,从B到C的转换与创建一个能够生成快速且足够小以与汇编语言竞争的程序的编译器同时发生。我将略微扩展的语言称为NB,“new B”。 - anon

10

就语法而言,最简单的真实语言似乎是C语言。

我不确定您所说的“真实语言”是什么意思,但无论“真实语言”意味着什么,我不能同意C语言具有“简单明了”的词汇或句法语法,并且其语义是未规范化的。如果您想要一种具有非常简单的语法和相当明确定义的语义的语言,那为什么不选择Scheme语言呢?Scheme语言有一个非常简单的语法,但确实不容易正确理解它的语义。


语义方面存在什么样的未明确说明? - Dinah
@Dinah:C和C++的许多方面都由编译器编写者自行决定,不同的编译器编写者选择不同的语义。例如,函数参数的求值顺序。(尽管公平地说,Scheme也未明确规定这一点。但是,通过Scheme不鼓励具有副作用的代码,这使得哪个参数先执行变得不那么重要。) - Eric Lippert
我从未接触过Scheme,但我可以尝试一下。你知道有没有用C#编写的开源Scheme编译器吗? - Dinah
@Dinah:有一些面向.NET的Scheme实现,但我不知道它们是否开源。 - Eric Lippert
6
如果我没记错的话,C语言可以通过单次编译来完成。因此从某种意义上讲,C语言非常“直截了当”;-) - Joren

5

很好的发现,我知道也有Mono,但如果可能的话,我真的在寻找一个C编译器。 - Dinah

4
我不知道有没有这样的工具,但是没有任何理由不能或者不应该制作一个。
编写类似C的语言编译器是一学期大学编译器课程的经典项目。如果你已经了解C#,那么它提供了很多功能,可以使你的工作比我上大学时更容易!有很多库可以让编写编译器变得更加轻松,同时不会削弱挑战性,如果需要的话,还可以用自己的临时代码替换它们以获得更大的灵活性。
第一个C编译器是用BCPL编写的,因为那是他们所拥有的。目前的C编译器通常使用C编写,因为它们旨在实现可移植性。我不认为有人会认为C是编写编译器的好语言。(C#并不完美,但比C好得多!)在一个静态编译的语言中,例如C,我认为使用目标语言编写编译器并没有太多好处。
高级语言编写的编译器有很多优点。它会比用C编写的编译器更短小简单。仅仅这一点就足以使得许多事情变得更容易,从而达到“不再太难无法完成”的门槛。(GCC是一个以使用低级语言编写的编译器,它非常复杂,进展缓慢。)优化基本上是图形转换,这并不是C所擅长的。
我不认为使用C#编译C是“倒退”的。除非有人建议用一种更高级别的语言重写所有的C代码,否则仍然需要编译,这意味着你需要一个编译器。这个编译器应该采用最可靠和性能最好的工具来编写,对吧?
祝你好运!期待看到您的作品!

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