编写编程语言的建议?

时间:2009-01-17 19:29:42

标签: compiler-construction programming-languages interpreter scripting-language

您可以为想要编写编程或脚本语言的人提供哪些提示?一世 我并不担心如何编程或设计编译器,而是如何使用工具和代码生成器快速开发编译器。

上次我尝试用c ++编写它时,状态和语法几乎和编写实际逻辑一样长。我知道以下工具会有所帮助。

我在想我可以生成c ++代码并让gcc编译它。使用上面的工具,您估计编写程序或脚本语言需要多长时间?


早在Learning to write a compiler就已经反复询问过这个问题的变化。关于该主题的Here is an incomplete list of SO resources

10 个答案:

答案 0 :(得分:18)

估计这样的事情可能需要多长时间取决于许多不同的因素。例如,经验丰富的程序员可以通过单元测试在几个小时内轻松淘汰一个简单的算术表达式求值程序。但是,新手程序员可能必须学习解析技术,递归下降,表达式树的抽象表示,树行走策略等等。这可能很容易花费数周或更长时间,仅用于算术表达式。

但是,不要让那些气馁。正如Jeff和Joel在recent Stack Overflow podcast上与Eric Sink讨论一样,编写编译器是了解编程的许多不同方面的绝佳方法。我已经构建了一些编译器,它们是我最难忘的编程项目之一。

有关构建编译器的一些经典书籍是:

答案 1 :(得分:5)

与克里斯弗雷泽一起建造one of the world's most carefully crafted compilers 10年的戴夫汉森告诉我,他从经验中学到的主要内容之一就是不要尝试用C或C ++编写编译器。

如果您想快速开发某些内容,请不要生成本机代码;定位现有虚拟机,例如CLR,JVM或Lua虚拟机。使用maximal munch生成代码。

如果您正在编写解释器,另一个好的选择就是使用内存管理和底层编程语言的其他工具。解析为AST,然后通过AST的树步行解释。这将让你快速起步。性能不是最好的,但它是可以接受的。 (使用这种技术,我曾经在Modula-3中编写了一个PostScript解释器。第一次实现需要一周的时间,虽然它后来经历了一些性能调整,主要是在词法分析器中,它从来不需要被替换。)

避免使用LALR解析器生成器;使用节省时间的东西,比如ANTLR或Elkhound GLR解析器生成器。

答案 2 :(得分:3)

有关编译器设计的经典书籍

Alfred V. Aho和Jeffrey D. Ullman撰写的“编译器设计原理”。它已经存在了很长一段时间,它的粉红色骑士和绿龙至少在几代CS学生中都是众所周知的。

也...

Alfred V. Aho,Monica S. Lam,Ravi Sethi,Jeffrey D. Ullman撰写的“编纂者:原则,技巧和工具”

如果您对编写编译器感兴趣,那么这些无疑是最佳起点。

答案 3 :(得分:3)

  

作为一个非常了解C ++的人,   你有什么建议可以给一个人   正在寻找编写程序或脚本语言?

不要这样做。 (或者至少在你做之前想很久很久!)

如果您正在尝试编写脚本语言来公开某些自定义编写对象的方法/属性,那么最好用Java(或.NET / VB或所有那些棘手的Microsoft)来实现它们然后使用其中一种Bean Scripting Framework语言作为您的脚本语言。 (无论等同于微软的哪一方面。)

答案 4 :(得分:3)

有关编译器的任何问题都会在几分钟内回答“阅读龙书,阅读本书,本书......”,无论其内容如何。所以我跳过那一部分(就像我在第一时间说的那样)。阅读这些书籍以学习如何使用你想要的工具,就像阅读有关如何骑自行车的角动量一样有用。

所以,为了回答你的问题而不质疑你的意图,我可以很容易地为初学者推荐antlr和antlrworks。您可以轻松生成AST(我认为真正的魔法发生在那里)并直观地调试您的语法。它为您生成了很好的工作编译器。

如果您了解自己的内容并且希望获得更多控制权或者不想使用antlr,则可以使用lemon解析器生成器和ragel状态机编译器(对lexing特别支持)。< / p>

如果您不需要太多性能,并且因为您计划生成C / C ++代码,那么您可以自己跳过任何优化并将这些内容留给C / C ++编译器。

如果您可以使用缓慢的运行时,您可以进一步缩短开发工作量,只需进行解释,因为通过这种方式实现动态功能通常更容易。

答案 5 :(得分:3)

我认为每个人都错过了一个非常重要的观点。

为什么 你想编写编译器/解释器/解析器等。

这将严重决定你做了很多事情。

我已经开发了很多语言实现,有些是相当奇怪的,有些是特定于域的,有些只是通过命令环境编写脚本(通常在以后隐藏命令环境的地方)。每个人都需要不同的技能水平。

有很多书可供选择。我喜欢的是一本BYTE书:螺纹解释语言 - 打赌它绝版了。

简单的脚本引擎可以通过一些晚上的思考和一些试验和错误来制作。

但我敢打赌,现在有在线课程可以节省大量时间。

答案 6 :(得分:2)

我强烈建议您查看现有的字节码解释器。如果您可以使您的语言适合CIL(.NET)或Java(甚至是其他语言,如Python或Parrot),那么您将节省自己制作可行的支持环境的所有工作,并可以继续尝试语言概念。

答案 7 :(得分:1)

如果您打算编写解释器或编译器,请不要这样做,因为您想编写下一个重要的东西。写它是因为你已经有了它的目的或学习。如果你这样做,你可能会发现你不小心写了下一件大事。

答案 8 :(得分:1)

我用于LALR的一个好工具是GOLD Parsing System。它是免费的,语法是Backus-Naur Form,有多个例子,包括用C#,VB.NET,Java等编写的引擎。这使您可以编写语法,将语法编译为文件,然后使用引擎解析语法。

如上所述,我建议使用某种字节代码,例如IL。这将允许您利用大量现有框架。

祝你好运

答案 9 :(得分:0)

如果您不想编写编译器以将语言缩减为汇编/机器,那么您的下一个选择是将编译器编写到字节码语言虚拟机,例如JVM,PVM或。 NET。

当然,如果您甚至不想这样做 - 您只想创建自己的“特定领域语言”,我会在Common Lisp中构建它。 Lisp宏提供了一种非常直接的方法来创建您想要的任何语法并将其解析为Lisp。而且您不必担心字节码或汇编。当然,你需要学习Lisp。