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

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


当前回答

As an starting point, it will be good to create a recursive descent parser (RDP) (let's say you want to create your own flavour of BASIC and build a BASIC interpreter) to understand how to write a compiler. I found the best information in Herbert Schild's C Power Users, chapter 7. This chapter refers to another book of H. Schildt "C The complete Reference" where he explains how to create a calculator (a simple expression parser). I found both books on eBay very cheap. You can check the code for the book if you go to www.osborne.com or check in www.HerbSchildt.com I found the same code but for C# in his latest book

其他回答

Python附带了一个用Python编写的Python编译器。您可以看到源代码,它包括从解析、抽象语法树、发出代码等所有阶段。 破解它。

你可能想看看Lex/Yacc(或Flex/Bison,随便你怎么称呼它们)。Flex是一个词法分析器,它将解析和识别语言的语义组件(“标记”),而Bison将用于定义解析每个标记时发生的情况。这可以是,但绝对不限于,打印出C代码,供编译器编译成C,或者动态运行指令。

这个常见问题应该对你有帮助,这个教程看起来很有用。

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

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

我认为这是一个相当模糊的问题;只是因为这个话题涉及的深度。然而,编译器可以被分解成两个独立的部分;上半身和下半身。上半部分通常采用源语言并将其转换为中间表示,下半部分负责特定于平台的代码生成。

尽管如此,解决这个问题的一个简单方法(至少是我们在编译器类中使用的方法)是在上面描述的两部分中构建编译器。具体来说,通过构建上半部分,您将对整个过程有一个很好的了解。

Just doing the top half lets you get the experience of writing the lexical analyzer and the parser and go to generating some "code" (that intermediate representation I mentioned). So it will take your source program and convert it to another representation and do some optimization (if you want), which is the heart of a compiler. The bottom half will then take that intermediate representation and generate the bytes needed to run the program on a specific architecture. For example, the the bottom half will take your intermediate representation and generate a PE executable.

关于这个主题的一些书,我发现特别有用的是编译器原理和技术(或者龙书,因为封面上有可爱的龙)。它有一些很棒的理论,而且肯定以一种非常容易理解的方式涵盖了上下文无关语法。此外,为了构建词法分析器和解析器,您可能会使用*nix工具lex和yacc。而且很无趣的是,这本名为《莱科斯和雅克》的书继承了《龙之书》这部分的内容。

这是一个庞大的课题。不要低估这一点。不要低估我的观点。 我听说龙之书是一个(?)开始的地方,连同搜索。(收集学会寻找,最终它将成为你的人生。 构建自己的编程语言绝对是一个很好的练习!但你要知道,它最终永远不会被用于任何实际目的。这种情况很少有例外。