首选语言:C/ c++、Java、Ruby。

我正在寻找一些关于如何编写自己的编译器的有用书籍/教程,只是为了教育目的。我最熟悉C/ c++、Java和Ruby,所以我更喜欢包含这三者之一的资源,但任何好的资源都是可以接受的。


当前回答

来自comp.compiler常见问题解答:

《个人电脑编程》作者:Per Brinch Hansen Prentice-Hall 1982 ISBN 0-13-730283-5

这本书名很不幸的书 解释单用户编程环境的设计和创建 用于微电脑,使用一种类似pascal的语言,叫做Edison。作者介绍 一个的逐步实现的所有源代码和解释 爱迪生编译器和简单的支持操作系统,全部写在 爱迪生本身(除了一个小的支持内核写在符号 PDP 11/23汇编程序;完整的源代码也可以为IBM订购 个人电脑)。

这本书最有趣的地方是:1)它的能力 演示如何创建一个完整的,独立的,自我维护的, 有用的编译器和操作系统,以及2)有趣的讨论 语言设计和规范的问题和权衡。

“Brinch Hansen on Pascal Compilers” by Per Brinch Hansen 普伦蒂斯-霍尔 1985 ISBN 0-13-083098-4

Another light-on-theory heavy-on-pragmatics here's-how-to-code-it book. The author presents the design, implementation, and complete source code for a compiler and p-code interpreter for Pascal- (Pascal "minus"), a Pascal subset with boolean and integer types (but no characters, reals, subranged or enumerated types), constant and variable definitions and array and record types (but no packed, variant, set, pointer, nameless, renamed, or file types), expressions, assignment statements, nested procedure definitions with value and variable parameters, if statements, while statements, and begin-end blocks (but no function definitions, procedural parameters, goto statements and labels, case statements, repeat statements, for statements, and with statements).

编译器和解释器都是用Pascal* (Pascal " * ")编写的 Pascal子集扩展了一些爱迪生风格的创建功能 软件开发系统。用于IBM个人电脑的Pascal编译器由 但是很容易将这本书的Pascal编译器移植到任何作者 方便的Pascal平台。

本书使编译器的设计和实现看起来很简单。我 尤其是作者对质量的关注, 可靠性和测试。编译器和解释器可以很容易地使用 作为一个更复杂的语言或编译器项目的基础,特别是 如果你被要求快速启动并运行一些东西。

其他回答

我正在研究同样的概念,发现了Joel Pobar写的一篇很有前景的文章,

为.NET框架创建一个语言编译器-不知道它去了哪里

为.NET框架创建一个语言编译器-原始文档的pdf副本

他讨论了编译器的高级概念,并为. net框架发明了自己的语言。尽管它的目标是。net框架,但其中的许多概念应该能够被复制。文章内容包括:

语言的定义 扫描仪 解析器(位我主要感兴趣) 针对。net框架的 代码生成器

还有其他的话题,但你得到的只是。

它面向初学者,用c#(不完全是Java)编写。

HTH

骨头

我记得大约七年前问过这个问题,当时我对编程还是个新手。

我问的时候非常小心,令人惊讶的是,我没有像你们在这里受到那么多批评。然而,他们确实给我指出了“龙书”的方向,在我看来,这是一本真正伟大的书,解释了编写编译器所需知道的一切(当然,你必须掌握一两种语言)。你懂的语言越多越好。

是的,很多人说读那本书是疯狂的,你不会从中学到任何东西,但我完全不同意这种说法。

许多人还说编写编译器是愚蠢和毫无意义的。编译器开发之所以有用,原因有很多:

因为它很有趣。 它是有教育意义的,当你学习如何编写编译器时,你会学到很多计算机科学和其他技术,这些技术在编写其他应用程序时很有用。 如果没有人编写编译器,现有的语言就不会变得更好。

我没有立即编写自己的编译器,但在询问之后,我知道从哪里开始。现在,在学习了许多不同的语言和阅读了龙书之后,写作并不是什么大问题。(我也在学习计算机工程,但我对编程的大部分知识都是自学的。)

总之,《龙之书》是一个很棒的“教程”。但是在尝试编写编译器之前,先花些时间掌握一两种语言。不过,不要指望在未来十年左右成为编译器大师。

如果你想学习如何编写解析器/解释器,这本书也是不错的选择。

创建编译器的一个简单方法是使用bison和flex(或类似),构建一个树(AST)并用C生成代码,生成C代码是最重要的步骤。通过生成C代码,您的语言将自动在所有具有C编译器的平台上运行。

生成C代码就像生成HTML一样简单(只需使用打印或等效工具),这又比编写C解析器或HTML解析器容易得多。

如果你对为函数式语言(而不是过程式语言)编写编译器感兴趣,Simon Peyton-Jones和David Lester的《实现函数式语言:教程》是一个很好的指南。

函数式计算如何工作的基本概念是通过简单但功能强大的函数式语言“Core”中的示例来指导的。此外,Core语言编译器的每个部分都用Miranda(一种与Haskell非常相似的纯函数式语言)中的代码示例进行了解释。

书中描述了几种不同类型的编译器,但即使你只遵循Core的模板编译器,你也会对函数式编程有一个很好的理解。

看看下面这本书。作者是ANTLR的创建者。

语言实现模式:创建您自己的领域特定语言和通用编程语言。