我已经有我的语言的翻译。它通过以下方式实现:
- parser -> scala 解析器组合器;
- AST -> scala 案例类;
- 评估器-> scala 模式匹配。
现在我想将 AST 编译为本机代码,希望是 Java 字节码。我正在考虑两个主要选项来完成这两项任务中的至少一项:
- 生成 LLVM IR 代码;
- 生成 C 代码和/或 Java 代码;
obs.: GCJ 和SLEM似乎无法使用(GCJ 使用简单的代码,我可以测试)
我已经有我的语言的翻译。它通过以下方式实现:
现在我想将 AST 编译为本机代码,希望是 Java 字节码。我正在考虑两个主要选项来完成这两项任务中的至少一项:
obs.: GCJ 和SLEM似乎无法使用(GCJ 使用简单的代码,我可以测试)
我会选择Java Bytecode。
问题是,您编译的语言级别越高,
例如,如果您编译为 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(甚至是跟踪编译器)。
我同意@Oak 关于选择 ByteCode 作为最简单目标的观点。@psuter的 CafeBabe是一个可能生成 ByteCode 的 Scala 库。
你不能用它做所有事情,但对于小型项目来说它可能就足够了。语法也很清楚。请参阅项目 Wiki 了解更多信息。