使用graalvm直接将javascript文件编译为java类

问题描述

我一直在寻找GraalVM referenceJS,大多数示例显示了创建上下文并在该上下文中执行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()

您可以解释目标程序的树,这就是它的执行方式。在运行时,解释器可以修改树,在为要执行的操作收集一些概要文件之后优化执行。它使用一种称为部分评估的技术将解释器代码和程序中的数据融合在一起(您可以将其视为非常全面的内联)。

然后,将解释器代码进一步与JVM jit编译器进行JIT编译。但是该程序没有中间字节码表示。

当然,您可以使用GraalVM的js实用工具直接运行JavaScript代码。或来自GraalVM的node.js(或其他)。但是我认为这不是这里要问的。