有一个简单的编译器为小语言
我正在寻找一个简单的编译器,编译一个简单的语言,我需要它写一个关于它的文件,并学习编译器如何工作,我不是一个简单的语言寻找一个复杂的东西(简单来说,我的意思是一个小代码,因为例如海湾合作委员会太toooooo大)。 任何帮助表示赞赏。
如果你想看代码,Eijiro Sumii的MinCaml编译器给我留下了深刻的印象。
-
它只有2000线长。
-
它编译了一个非常有趣的源语言。
-
它生成真正的机器代码,没有这个namby-pamby C或LLVM的东西:-)
-
编译代码的速度与gcc和本机OCaml编译器竞争。
-
编译器是专为教学而devise的。
我提到我有很深的印象?
我推荐TinyScheme或者jonesforth 。
杰克Crenshaw,博士。 谁写了广泛的实际数值方法,很长时间害怕编译器。 他终于厌倦了感到害怕,并根据他在教授这个主题时学到的知识,编写了一个关于编译器构build的多部分教程。
有关更多信息,请参阅“让我们构build一个编译器” 。 请注意,它不完整。 在完成之前,他跑了出来,但是里面有很多容易理解的信息。
大约1000行代码。 编译schemeLLVM汇编或C.我会说这是一个非常适合编译器的论文。 如果你想深入一点,我推荐这本书“SICP” 。
看看简单的PL / 0编译器(一个类似pascal的小子集 – 没有参数,只有整数数据)。 用Pascal编写的源代码只有大约500行代码,并且很容易遵循。 这可能是所有你需要看的。
但是,如果你想走得更远一点,一旦你对此感到满意,看一看Pascal-S的来源。 这是一个更大的Pascal子集的编译器,但包含一些额外的概念,例如parameter passing,附加数据types以及数组和logging(结构)。 仍然只有大约2000行代码,并且一旦掌握了PL / 0就很容易遵循。
你可以在这里find来源:
你应该阅读一本关于编译器devise的书。 它应该有你想知道的理论,以及一些适当简单的例子。
我推荐由Aho和Ullman编写的“龙书”: 编译器devise原理 。 我读了这么多年,所以我不记得具体是哪些例子,但是这是一个很好的文字。
有很多你可以使用,你会发现最简单的将取决于你的经验。
首先关于语言:
- 最简单的是玩具语言,例如编译一个算术expression式。
- 接下来是汇编程序 – 再次只是翻译,但是显示了parsing和转换为操作码的基础知识
- 接下来可能就像是C,它非常接近纯粹的汇编,或者像LISP这样的非常接近于纯理论的东西。
接下来,select你的编译器。
你可以从一个汇编程序开始 – 将汇编程序转换成机器代码。 这是生产编译器的第一步 – 我build议像6502或8080这样的芯片都非常简单。 像汇编程序的开发工具包可能适合你(它带有例子)
许多人(包括我)都会争论编写程序的最简单的语言是function性的 – 现在可能意味着Haskell,Scheme或Common Lisp。 这个博客文章是多么容易的一个例子。 他写了一个编译器,只编译几行算术expression式。 这对你来说可能是最小的。
几乎所有在学术层面上编写编译器的入门都以最低限度的语言为例,总是推荐Dragon Book http://en.wikipedia.org/wiki/Dragon_Book_%28computer_science%29 ,但还有其他的好书。
在大学我使用C – 这是像C,但更容易编写一个编译器。 大量的资源: http : //www.cminusminus.org/qc–.html
如果你想要一个编译器,并且你知道Java这样的语言,我会build议一些类似JavaCC的地方 ,在那里用语法指定语言。 这里有很多例子语法 – select一些简单的像C开始。
LISPes(Scheme等)是最简单的实际语言。 你可以看看如何在本书中使用perl来构build一个原始的Scheme解释器( 在Lulu的文章版本)。 parsing和types检查在解释器和编译器中是相似的。 然后,这里是一个关于编译器devise主题的更加核心的书 (也可作为Lulu的死树 )。
在我以前的IT学校,我们不得不用C ++开发一个编译器,而不是从头开始:有步骤,学习曲线等等。
TIGER编译器和projet任务 的概念
所有文件都可用,但代码本身不是,所以你必须自己做。
有很多可以理解的和有用的信息,这可能是学习编译器的良好开端。
Google UCSD Pascal 。 这是七十年代的破土动工。 也许它比你想要的要多,但当时它很容易被移植到很多“微型”芯片上。
这个只有300行正常的代码,实现了一个简单的通用语言链接文本 ,就像你在找什么?
你可以看看Bjarne Stroustrup的热门书籍“The C ++ programming language”中的Calculator例子。
如果你想要更先进的东西,请阅读boost :: spirit的源代码。
取决于你对简单的看法。 你可以看看其中一个可用的BrainFuck编译器。 这是一个非常简单的语言,编译器很小。 但是我不知道这会告诉你“真实”编译器是如何工作的。
怎么看一个小型的C编译器? C不是很复杂,我想这会给你一些编译器构build的见解。
你也可以尝试这本书: 计算系统的元素 。
尽pipe这本书的目的是从devise一个微处理器到编译器的语言,但你可以只关注相关的章节。
第10章:语法分析是你可以通过的工作,如果你打算只关注编译器的前端部分。 但是, 第9章应该是一个先决条件,因为它描述了编译器实现的高级语言的devise。 这种高级语言实际上是一种简单的面向对象的Java语言,因此编译器实际上编译为一个虚拟机。
最好的部分是,如果你认为这将进一步加深你的理解,你可以按照你的select的任何一种语言,按照指示和实施前端部分。 如果你把它和编译器理论结合起来,它会变得非常好。
而且,你可以在这里find我对这本书的评论。
Brainfucked是一个非常简单的语言Brainfuck编译器。
编译器编写资源的标准Stack Overflow资源是学习编写一个编译器
我知道的最小的实际编译器是MetaII ,它具有40行的自我描述,并且可以使用特殊的运行时系统进行自我编译,这个系统肯定隐藏了一些有趣的计算(但是,这里列出的大多数编译器都假定某种运行时系统,肯定比MetaII的还要大,我已经build立了以这个为基础的真正的编译器,虽然meta-self-enhanced有了相当的壮观。
还有一些工作要做得更小。 我不认为有这方面的实际编译器。
这些值得写一篇关于。