使用来自 Java 的 LLVM
Working with LLVM from Java
我完全知道这里已经提出了类似的问题:Generating LLVM Code from Java
事实是,那是在 2012 年...我查看了解决方案,发现提到的大部分项目都被放弃了,或者至少非常不活跃。
那么,作为最习惯使用 Java 的人,我使用 LLVM 的选项是什么(创建一种玩具语言,而不是使用 clang 或任何东西)?
- 尝试使用其中一个项目,即使它们可能已过时?听起来是个坏主意。
- 学习C/C++?不要误会我的意思,我已经有一本 C++ 的书了,我并不是说它是一种糟糕的语言,但我非常怀疑我是否会觉得使用它很舒服。
- 使用其他语言的绑定,例如 Haskell、Python 等?我可能更喜欢 C/C++,但这意味着在开始之前要学习另一种完整的语言...
- 编写我自己的绑定?我从来没有做过那样的事情,我什至不知道 JNI、JNA 和诸如此类的东西之间的区别……但学习起来可能很有趣。
- 尝试将 LLVM IR 格式化为文本格式?可能有用,但也可能不是最好的主意。
为了最终回答这个问题,Java C++ 预设是一个有用且最新的选项:https://github.com/bytedeco/javacpp-presets/tree/master/llvm
我最近遇到了同样的问题,因为我在 Java/Scala 中使用 ANTLR 来定义我的词法分析器和解析器,并使用 LLVM 通过其 IR 生成实际的机器代码。
在尝试将基于 JVM 的前端绑定到 LLVM IR 和后端时,我实际上是在尝试使用 GraalVM https://www.graalvm.org/,因为它提供了一种无缝的方式来跨语言交互,包括 LLVM 位码,使用它的 Polyglot。
这里有一些参考资料:
- https://www.graalvm.org/docs/reference-manual/languages/llvm/
- https://medium.com/graalvm/graalvm-llvm-toolchain-f606f995bf
- https://blog.plan99.net/graal-truffle-134d8f28fb69
您应该能够直接从您的 Java/Scala 代码访问 LLVM IR,反之亦然,您可以使用 Polyglot 调用从 LLVM/C++ 代码访问基于 JVM 语言的 AST。
我完全知道这里已经提出了类似的问题:Generating LLVM Code from Java
事实是,那是在 2012 年...我查看了解决方案,发现提到的大部分项目都被放弃了,或者至少非常不活跃。 那么,作为最习惯使用 Java 的人,我使用 LLVM 的选项是什么(创建一种玩具语言,而不是使用 clang 或任何东西)?
- 尝试使用其中一个项目,即使它们可能已过时?听起来是个坏主意。
- 学习C/C++?不要误会我的意思,我已经有一本 C++ 的书了,我并不是说它是一种糟糕的语言,但我非常怀疑我是否会觉得使用它很舒服。
- 使用其他语言的绑定,例如 Haskell、Python 等?我可能更喜欢 C/C++,但这意味着在开始之前要学习另一种完整的语言...
- 编写我自己的绑定?我从来没有做过那样的事情,我什至不知道 JNI、JNA 和诸如此类的东西之间的区别……但学习起来可能很有趣。
- 尝试将 LLVM IR 格式化为文本格式?可能有用,但也可能不是最好的主意。
为了最终回答这个问题,Java C++ 预设是一个有用且最新的选项:https://github.com/bytedeco/javacpp-presets/tree/master/llvm
我最近遇到了同样的问题,因为我在 Java/Scala 中使用 ANTLR 来定义我的词法分析器和解析器,并使用 LLVM 通过其 IR 生成实际的机器代码。 在尝试将基于 JVM 的前端绑定到 LLVM IR 和后端时,我实际上是在尝试使用 GraalVM https://www.graalvm.org/,因为它提供了一种无缝的方式来跨语言交互,包括 LLVM 位码,使用它的 Polyglot。
这里有一些参考资料:
- https://www.graalvm.org/docs/reference-manual/languages/llvm/
- https://medium.com/graalvm/graalvm-llvm-toolchain-f606f995bf
- https://blog.plan99.net/graal-truffle-134d8f28fb69
您应该能够直接从您的 Java/Scala 代码访问 LLVM IR,反之亦然,您可以使用 Polyglot 调用从 LLVM/C++ 代码访问基于 JVM 语言的 AST。