使用 graalvm 直接将 java 脚本文件编译为 java class
directly compile a javascript file to a java class using graalvm
我一直在查看 GraalVM reference for JS,大多数示例都展示了创建上下文并在该上下文中执行 js 代码。
Context context = Context.create()
有没有办法直接将 JS 代码编译成字节码等价物,加载它并直接 运行 它?
GraalVM 语言、JavaScript、Ruby、R、Python、Webassembly、GraalSqueak 等不将目标程序编译成字节码。
语言实现是目标语言抽象语法树的解释器。该解释器是使用 Truffle 框架 API.
在 Java 中编写的
在运行时,您使用此解释器的节点构建程序 AST,它们知道如何评估自己。例如像 a + b
这样的东西可以变成 3 个节点对象,AddNode
和 2 个子节点。 AddNode.evaluate()
可能类似于 return left.evaluate() + right evaluate()
.
您可以解释目标程序的树,这就是它的执行方式。在 运行 时间,解释器可以修改树,在收集一些关于将要执行的内容的配置文件后优化执行。它使用一种称为部分评估的技术(您可以将其视为非常全面的内联)将解释器代码和程序中的数据融合在一起。
然后解释器代码进一步JIT-compiled 与JVM jit 编译器。但是程序没有中间字节码表示。
当然,您可以使用 GraalVM 中的 js
实用程序来 运行 Java 直接用它编写脚本代码。或来自 GraalVM(或其他)的 node.js
。不过我觉得这里问的不是这个。
我一直在查看 GraalVM reference for JS,大多数示例都展示了创建上下文并在该上下文中执行 js 代码。
Context context = Context.create()
有没有办法直接将 JS 代码编译成字节码等价物,加载它并直接 运行 它?
GraalVM 语言、JavaScript、Ruby、R、Python、Webassembly、GraalSqueak 等不将目标程序编译成字节码。
语言实现是目标语言抽象语法树的解释器。该解释器是使用 Truffle 框架 API.
在 Java 中编写的在运行时,您使用此解释器的节点构建程序 AST,它们知道如何评估自己。例如像 a + b
这样的东西可以变成 3 个节点对象,AddNode
和 2 个子节点。 AddNode.evaluate()
可能类似于 return left.evaluate() + right evaluate()
.
您可以解释目标程序的树,这就是它的执行方式。在 运行 时间,解释器可以修改树,在收集一些关于将要执行的内容的配置文件后优化执行。它使用一种称为部分评估的技术(您可以将其视为非常全面的内联)将解释器代码和程序中的数据融合在一起。
然后解释器代码进一步JIT-compiled 与JVM jit 编译器。但是程序没有中间字节码表示。
当然,您可以使用 GraalVM 中的 js
实用程序来 运行 Java 直接用它编写脚本代码。或来自 GraalVM(或其他)的 node.js
。不过我觉得这里问的不是这个。