我正在寻找一个简单的编译器来编译一个简单的语言,我需要它来写一篇关于它的论文并了解编译器是如何工作的,我不是在寻找一个复杂的东西只是一个简单的语言(简单来说,我的意思是小代码,因为例如gcc太大了)。任何帮助表示赞赏。
答案 0 :(得分:48)
如果你想查看代码,我对Eijiro Sumii的MinCaml编译器印象非常深刻。
它只有2000行。
它汇编了一种非常有趣的源语言。
它会生成真正的机器代码,这些代码都不属于这些内容: -
编译代码的速度与gcc和本机OCaml编译器竞争。
编译器专为教学而设计。
我提到过我的印象非常深刻吗?
答案 1 :(得分:8)
我建议TinyScheme或jonesforth。
答案 2 :(得分:6)
About 1000 lines of code. Compiles Scheme to LLVM assembler or to C.我想说这非常适合编写有关编译器的论文。如果你想深入了解,我推荐书"SICP"。
答案 3 :(得分:6)
Jack Crenshaw,博士。谁写了大量关于实用数值方法的文章,很长一段时间都害怕编译器。他终于厌倦了被吓到了,并根据他在自学这门课程时学到的东西写了一篇关于编译器构建的多部分教程。
有关详细信息,请参阅"Let's Build a Compiler"。请注意,它不完整;在他完成之前,他没有动力,但那里有很多容易消化的信息。
答案 4 :(得分:5)
查看PL / 0的简单编译器(类似pascal的小子集 - 没有参数,只有整数数据)。用Pascal编写的源代码只有大约500行代码,很容易理解。这可能是您需要查看的全部内容。
但是,如果你想再往前一点,一旦你对此感到满意,请查看Pascal-S的来源。这是一个较大的Pascal子集的编译器,但包含一些其他概念,例如参数传递,其他数据类型以及数组和记录(结构)。仍然只有大约2000行代码,并且一旦你掌握了PL / 0就很容易理解。
您可以在此处找到来源:
答案 5 :(得分:4)
你可以使用很多,你会发现最容易取决于你的经验。
首先是关于语言:
接下来,选择你的编译器。
您可以从汇编程序开始 - 将汇编程序转换为机器代码。这是制作编译器的第一步 - 我建议使用像6502或8080这样的芯片,它们都非常简单。像assembler's development kit这样的东西可能适合你(它带有例子)
许多人(包括我)认为编写编译器的最简单的语言是功能性的 - 现在可能意味着Haskell,Scheme或Common Lisp。 this blog post是一个多么容易的例子。他编写了一个编译器,它只是在几行中编译算术表达式。这对您来说可能是最小的。
几乎所有在学术层面编写编译器的介绍都以最小语言为例,始终建议使用the Dragon Book http://en.wikipedia.org/wiki/Dragon_Book_%28computer_science%29,但还有其他好的。
在大学里,我使用C--就像C一样,但更容易编写编译器。许多资源位于:http://www.cminusminus.org/qc--.html
如果你想要一个编译器并且你知道像Java这样的语言,我建议使用类似JavaCC的东西,其中使用语法指定语言。有lots of example grammars here - 选择像C这样简单的东西来开始。
答案 6 :(得分:3)
你应该读一本关于编译器设计的书;它应该有你想知道的理论,以及一些恰当的简单例子。
我推荐Aho和Ullman撰写的“龙书”:编译器设计原理。我阅读它已经很多年了,所以我不记得究竟有哪些例子可用,但这是一篇非常好的文章。
答案 7 :(得分:3)
LISPes(Scheme等)是最简单的实际语言。您可以查看如何使用this book(纸质版本here on Lulu)在perl中构建原始的Scheme解释器。解析,类型检查在解释器和编译器中类似。然后,这是一个more hardcore book on the compiler design subject(也可用dead tree on Lulu)。
答案 8 :(得分:3)
在我以前的IT学校,我们必须用C ++开发一个编译器,但不是从头开始:有步骤,学习曲线等。
The concept of the TIGER Compiler和projet assignments
所有文件都可以使用,但代码本身不是,所以你必须自己完成。
有许多可理解和可用的信息,它可能是学习编译器编码的良好开端。
答案 9 :(得分:3)
Google UCSD Pascal。它是70年代的一个突破口。也许它比你想要的更多,但当时很容易移植到很多“微型”芯片上。
答案 10 :(得分:2)
这一行只有300行普通代码并实现了一种简单的通用语言link text,就像你在寻找什么?
答案 11 :(得分:1)
你可以看看Bjarne Stroustrup的热闹书“The C ++ programming language”中的Calculator例子。
如果你想要更高级的东西,请阅读boost :: spirit的源代码。
答案 12 :(得分:1)
你也可以试试这本书:The Elements of Computing Systems。
虽然这本书旨在涵盖从设计微处理器到使用其编译器的语言,但您可以只关注相关章节。
第10章:语法分析是您可以解决的问题,如果您打算只关注编译器前端部分。但是,第9章应该是先决条件,因为它描述了为其实现编译器的高级语言的设计。这种高级语言实际上是一种简单的OO java语言,因此编译器实际上编译为VM。
最重要的是,您可以按照说明操作,并以您选择的任何语言实施前端部分,如果您认为这将进一步理解您的理解。如果你把它与编译器理论结合起来,那就很好了。
而且,您可以找到我对该书here的评论。
答案 13 :(得分:1)
答案 14 :(得分:1)
取决于你对简单的看法。您可以查看其中一个可用的BrainFuck编译器。这是一种非常简单的语言,编译器很小。但我不知道这会告诉你“真正的”编译器是如何工作的。
查看小型C编译器怎么样? C不是很复杂,我认为这将为您提供编译器构建方面的一些见解。
答案 15 :(得分:0)
编译器编写资源的标准Stack Overflow资源是Learning to write a compiler
答案 16 :(得分:0)
Brainfucked是一个非常简单的语言Brainfuck的编译器。
答案 17 :(得分:0)
smallest practical compiler I know is MetaII,它有一个40行自我描述并且可以自己编译,使用一个特殊的运行时系统,它确实隐藏了一些有趣的计算(但是,这里列出的大多数编译器假设某种运行时系统,肯定比MetaII更大。我已经建立了真正的编译器,以此为基础,虽然元自我增强相当壮观。
我的been work to make that even smaller.我认为根据这个方向没有任何实用的编译器。
值得写一篇论文。