从使用scala解析器组合器编写的解释器生成本机代码的好方法是什么?

时间:2013-03-20 04:27:37

标签: scala llvm parser-combinators

我已经为我的语言提供翻译。 它通过以下方式实现:

  • 解析器 - > scala parser combinators;
  • AST - >斯卡拉案例类;
  • 评估者 - >斯卡拉模式匹配。

现在我想将AST编译为本机代码,并希望将Java字节码编译。 我正在考虑完成这两项任务中至少一项的两个主要选择:

  • 生成LLVM IR代码;
  • 生成C代码和/或Java代码;

obs:GCJ和SLEM似乎无法使用(GCJ适用于简单的代码,因为我可以测试)

2 个答案:

答案 0 :(得分:1)

简答

我会选择Java Bytecode。

长答案

问题是,你编译的语言越高级,

  1. 编译过程越慢越麻烦
  2. 获得更大的灵活性
  3. 例如,如果您编译为C,那么您可以为C编译器获得许多可能的后端 - 您可以为许多体系结构生成Java字节码,LLVM IR,asm等,但您基本上编译了两次。如果你选择LLVM IR,你已经有一半编译成asm(解析LLVM IR比解析像C这样的语言要快得多),但是你很难从中获取Java字节码。但是,这两种中间语言都可以编译为本机语言。

    我认为编译一些中间表示比编译成通用编程语言更可取。在LLVM IR和Java Bytecode之间,我会选择Java Bytecode - 尽管我个人更喜欢LLVM IR - 因为你写道你基本上都想要两者,而你可以将Java Bytecode转换为LLVM IR,另一个方向是非常困难的。

    唯一剩下的难点是将您的语言翻译为Java字节码。 This related question about tools that can make it easier可能有帮助。

    最后,Java Bytecode的另一个优点是它可以很好地与您的解释器配合使用,有效地允许您轻松生成类似热点的JITter(甚至是跟踪编译器)。

答案 1 :(得分:0)

我同意@Oak关于选择ByteCode作为最简单的目标。 @psuter生成ByteCode的可能Scala库为CafeBabe

你无法用它做任何事情,但对于小项目来说,它就足够了。语法也很清楚。有关更多信息,请参阅项目Wiki。