你有什么建议可以给那些想要编写编程语言或脚本语言的人吗?我不担心如何编程或设计编译器,而是如何使用工具和代码生成器快速开发一个编程语言。
上次我尝试用c ++编写它,状态和语法几乎花费了与编写实际逻辑一样长的时间。我知道下面这些工具会有所帮助。
我在考虑是否可以生成c ++代码,并让gcc编译它。使用上述工具,您估计需要多长时间才能编写一个程序或脚本语言?
这个问题的变体一直以来都被反复提出,早在学习编写编译器时期就有了。以下是有关该主题的SO资源列表,但不完整。
你有什么建议可以给那些想要编写编程语言或脚本语言的人吗?我不担心如何编程或设计编译器,而是如何使用工具和代码生成器快速开发一个编程语言。
上次我尝试用c ++编写它,状态和语法几乎花费了与编写实际逻辑一样长的时间。我知道下面这些工具会有所帮助。
我在考虑是否可以生成c ++代码,并让gcc编译它。使用上述工具,您估计需要多长时间才能编写一个程序或脚本语言?
这个问题的变体一直以来都被反复提出,早在学习编写编译器时期就有了。以下是有关该主题的SO资源列表,但不完整。
估算完成这样的工作需要考虑许多不同因素。例如,一位有经验的程序员可以在几个小时内编写一个简单的算术表达式求值器并进行单元测试,但是新手程序员可能需要学习解析技术、递归下降、表达式树的抽象表示、树遍历策略等等,仅仅为了处理算术表达式就可能需要花费数周甚至更长时间。
然而,不要因此而灰心。正如Jeff和Joel在最近的Stack Overflow podcast中与Eric Sink讨论的那样,编写编译器是学习编程的许多不同方面的绝佳方式。我已经构建了一些编译器,它们是我最难忘的编程项目之一。
关于构建编译器的一些经典书籍包括:
无论提出有关编译器的任何问题,SO上都会有一个答案:“去读龙书,读那本书,这本书……”不管问题内容如何,在几分钟内就会得到答案。所以我跳过了那部分(就像我一开始说的那样)。阅读这些书籍来学习如何使用你想要的工具,就像阅读角动量来学习如何骑自行车一样有用。
那么,回答你的问题,不质疑你的意图,我可以轻松推荐antlr和antlrworks作为入门工具。您可以轻松生成AST(我认为真正的魔力发生在这里),并通过可视化调试语法进行调试。它为您生成了一个工作编译器的很大部分。
如果您精通此领域并想要更多控制权或不喜欢antlr,则可以使用lemon解析器生成器和ragel状态机编译器(具有特殊支持词法分析)组合使用。
如果您不需要太高的性能,并且由于计划生成C/C++代码,您可以跳过自己进行任何优化,并将这些工作留给C/C++编译器。
如果您可以接受较慢的运行时间,您可以通过解释来进一步缩短开发时间,因为这种方法通常更容易实现动态功能。我强烈建议您查看现有的字节码解释器。如果您的语言可以适应CIL (.NET)、Java(甚至其他如Python或Parrot),那么您将节省所有制作可行支持环境的工作量,并可以开始尝试语言概念的实验。
我用过的一个很好的LALR工具是GOLD Parsing System。它是免费的,语法是Backus-Naur Form,有多个示例,包括用C#、VB.NET、Java等编写的引擎。这使您可以编写语法,将语法编译为文件,然后使用引擎解析语法。
如上所述,我建议针对某种字节码,例如IL。这将使您能够利用现有框架的巨大数量。
祝你好运
如果您不想编写编译器将语言转换为汇编/机器码,那么您的下一个选择是编写编译器将其转换为字节码语言虚拟机,例如JVM、PVM或.NET。
当然,如果您甚至不想这样做——您只想创建自己的“领域特定语言”,我会在Common Lisp中构建它。Lisp宏提供了一种相当直接的方法来创建任何您想要的语法并将其解析为Lisp。而且您不必担心字节码或汇编。当然,您需要学习Lisp。