用于构建编译器的通用语言

时间:2009-01-20 12:29:04

标签: compiler-construction

受到Eric Sink对stackoverflow播客的采访的启发,我想在业余时间为学习体验构建一个完整的编译器。我最初的想法是构建一个C编译器,但我不确定它是否需要花费太多时间。

我想知道是否有更小的通用语言更适合作为第一个编译器工作实现?或者是在合理的时间范围内(200小时)可以实现C实现吗?

我打算以CLR为目标。

13 个答案:

答案 0 :(得分:13)

您最开心为较旧的较小语言编写编译器。例如,Pascal被设计为学习工具。 Pascal语言小而优雅;编译器可以很简单地编写。

即使OberonModula-2编译器的复杂程度与Pascal类似;他们的设计是由同一个人Niklaus Wirth驱动的。

像C这样有机发展的语言,太过怪癖,无法成为良好的学习经历。

答案 1 :(得分:9)

编写Scheme编译器。

请参阅:An incremental approach to compiler construction

答案 2 :(得分:8)

我的建议是选择你最喜欢的语言。你进入它的知识将超过为它编写编译器的难度,通常。

答案 3 :(得分:4)

如果您需要 compact 教程,为什么不考虑Wirth Compiler Construction(pdf)。源语言(Oberon-0)非常简单,可以使编译器易于理解。任何编程的人都应该可以阅读实现语言(Oberon)。

用于实现编译器的语言。使用你熟悉的东西。如有疑问,请选择一种不会使尝试复杂化的语言:垃圾收集。可以轻松打印或以其他方式转储内部数据结构以进行检查的东西。所有人都会想到PythonSchemeLua

最后的考虑因素是使用编译器 target 的内容。我确信,虚拟机JVM和CLR已被提及。你可以走那条路。首次尝试将模拟器用于精简RISC处理器作为目标可能更容易。 (Wirth的编译器书就是这样做的。)

我不建议将x86作为您的第一个编译器,因为它超出了单词的隐藏性。我也不会针对像C这样的高级语言,因为你会错过许多有趣的细节,比如如何为布尔运算符实现短路语义等等。

答案 4 :(得分:3)

支持Scheme的另一个观点:初学者为它编写一个自托管编译器是很实用的,就像他的第一个编译器Kragen Sitaker的Ur-Scheme一样。很少有其他“教程”编译器足够强大,可以自己编译(虽然在链接上有一些指针)。这为这个问题带来了更多的现实主义和兴趣。

答案 5 :(得分:2)

无论您选择何种语言,请记住您可以定义自己的一组支持功能,以便根据您的学习目标进行自定义。如果你想学习编译器(你听起来像这样),那么你可以编写一个C编译器,但只是放弃对某些随机特性的支持,比如指针,或者只实现关键字的一个子集,只是为了使它成为可能。更易于管理。

当然,如果您的目标是与特定语言保持密切联系,那么您将需要完全实现该语言的编译器。

答案 6 :(得分:2)

已经提到过Pascal,但我想补充一点,Niklaus Wirth的书Algorithms + Data Structures = Programs包含一个使用递归下降的小型Pascal语言的完整实现。如果您正在寻找关于解析的理论密集型讨论,请查看其他地方;但如果您想要直接的代码让您通过实践来学习,那么我建议A + DP = P.

答案 7 :(得分:1)

无论选择哪种语言,您都可以考虑编译为中间语言(IL)以定位公共语言运行时(CLR)。我认为针对非Windows的Java虚拟机(JVM)的目标是类似的,或者是Mono中的CLR实现?这可能会大大简化这项工作,并让你有一些表现良好的东西。如果您想要更进一步,您稍后会重新定位特定的架构。

答案 8 :(得分:1)

我想不出任何一种语言可以简单地用作第一次编译器编写练习。我不认为我会尝试C进行第一次切割。为什么不发明自己的语言?也许这将是一个真正的打击。

答案 9 :(得分:1)

在编译器课程中,我们为C的子集编写了编译器(我喜欢将其视为C--)。这并不困难,因为你知道你的界限在哪里。您可以随时重构并添加更多功能。

答案 10 :(得分:0)

就简单性而言,FORTH将成为更容易开发的语言之一。它是线程解释而不是真正的编译,但你仍然会处理解析,变量存储等。

对于编译器,我会使用C或Pascal,这两者都非常紧凑,并且可以使用编译器。

答案 11 :(得分:0)

写一个brainfuck或者第四个编译器。 BASIC也许也是这种语言功能不太丰富的。我认为C会有点难度。不要羡慕目标拱。使用你拥有的任何东西。

如果您不想实现汇编程序,请将编译器输出汇编代码并将其推送到gas或nasm。

答案 12 :(得分:0)

我建议写一个brainf **编译器。对于第一个编译器来说,它非常简单和有用。时间表将更像是一个半小时。其他一些好的语言是Forth,Logo和Lisp。

相关问题