2

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

  • parser -> scala 解析器组合器;
  • AST -> scala 案例类;
  • 评估器-> scala 模式匹配。

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

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

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

4

2 回答 2

1

简答

我会选择Java Bytecode。

长答案

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

  1. 编译过程越慢越繁琐
  2. 您获得的灵活性越大

例如,如果您编译为 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 字节码。这个有关可以使其更容易的工具的相关问题可能会有所帮助。

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

于 2013-03-20T09:48:43.443 回答
0

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

你不能用它做所有事情,但对于小型项目来说它可能就足够了。语法也很清楚。请参阅项目 Wiki 了解更多信息。

于 2013-03-20T14:00:22.303 回答