我一直在进行编译器创建。我发现了一些非常棒的初学者和高级东西,但中间什么都没有。我为玩具语言创建了3个不同的简单概念验证编译器,但我想让自己暴露在真实的东西之中。
语法方面最直接的真实语言似乎是C.因为我现在最熟悉的语言是C#,我很乐意研究一个真正的非教程C编译器的源代码。在C#中。是否存在一个(提供源代码)?
理想情况下,我喜欢C编译器,而不是.NET或C#编译器,但使用C#编写的源代码。
我知道C# - > C感觉有点倒退,但在我改变它之前,它还允许我从熟悉的语言开始更深入地进入编译器。
虽然我不是在寻找C#/。NET编译器,但有些人会看到这个问题的人正在寻找:
答案 0 :(得分:11)
您将很难找到示例代码。编译器编写者使用bootstrapping。第一个C编译器是用B编写的。然后用它来编写第一个C ++编译器。用于编写C#编译器。这通常用于编写托管代码的编译器。
这不是一个永远倒退的过程。虽然旁路是常见的,但C编译器通常用于交叉编译另一个操作系统的编译器。
我认为我使用了this book,它在附录中有很棒的C编译器代码。用C语言编写。在大型项目中编写我需要的Basic编译器时,我使用了它的一部分。表达式解析器很难做到,它为运算符优先级规则提供了一个优雅的解决方案。
定位托管语言是实现这一目标的更简单方法。语言不应该太重要,它正在使它工作,这是真正的挑战。即使它是很多更容易让托管代码工作。如果您想要定位C,您将需要黑带机器代码技巧以及对目标文件格式和链接器的深入洞察。
答案 1 :(得分:10)
语法方面最直接的真实语言似乎是C。
我不确定你的“真实语言”是什么意思,但无论“真正的语言”是什么意思,我都不能同意C有一个“直截了当”的词汇或句法语法,而且它的语义是不明确的。如果你想要一个非常直接的语言和非常明确的语义,为什么不去参加Scheme呢? Scheme有一个非常简单的语法,但确保其语义正确无疑是微不足道的。
答案 2 :(得分:5)
通过谷歌发现了这一点。
http://blogs.msdn.com/jmstall/archive/2005/02/06/368192.aspx
编辑:和此(不完全是C): http://msdn.microsoft.com/en-us/magazine/cc136756.aspx
答案 3 :(得分:3)
我不知道有哪一个存在,但没有理由不能或不应该。
为类似C语言编写编译器是一学期大学编译器课程的经典项目。如果您已经了解C#,它提供了许多功能,这将使您的工作比我在大学时更容易!有大量的库可以使工作变得更容易,而不会带来挑战,如果您需要灵活性,您可以随时使用自己的特殊代码替换它们。
第一个C编译器是用BCPL编写的,因为它是他们拥有的。目前的C编译器通常用C语言编写,因为它们的目的是可移植。我认为没有人会认为C是编写编译器的好语言。(C#并不完美,但它更好!)在像C这样的静态编译语言中,我认为你没有得到多少好处,如果有的话,使用目标语言来编写编译器。
HLL中的编译器可能具有许多优点。它比用C写的更短更简单。只有这样才能使很多事情变得足够容易,以至于它们可以被拉到“太难以让人无法做到”的门槛之下。 (GCC对于用LLL编写的编译器如何如此复杂以至于以冰川率运行而言是一种典型的海报。)优化基本上是图形转换,这不完全是C的强项。
我不认为使用C#编译C是“倒退”的。除非有人提议用更高级别的语言重写所有C代码,否则仍然需要以某种方式编译,这意味着你需要编译器。编译器是否应该使用能够提供最佳可靠性和性能的工具编写?
祝你好运!我期待看到你写的东西!