truffle - 使用 graalvm 直接将 javascript 文件编译为 java 类
问题描述
我一直在查看 JS 的GraalVM参考,大多数示例显示创建上下文并在该上下文中执行 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 编译。但是程序没有中间字节码表示。
当然,您可以使用js
GraalVM 中的实用程序直接运行 JavaScript 代码。或node.js
来自 GraalVM(或其他)。但我认为这不是这里要问的。
推荐阅读
- ruby-on-rails - Rails - Heroku 部署问题
- r - 向 ChartSeries Quantmod 添加自定义指标
- java - CSF - 连接被拒绝
- xml - Python Crawler Xpath 获取
标签内容 - reactjs - PWA 应用程序中的 OT.Publisher.onStreamAvailableError OT_MEDIA_ERR_ABORTED
- c++ - 将子线程同步到由父线程管理的原子时间
- java - 从包含键的 LinkedHashMap 中删除特定值
和价值 LinkedList - linq - 使用 GroupBy 并根据条件显示不同的总和 - LINQ Lambda 表达式
- java - 为什么变量 drawable 和 getDrawable(R.drawable.ic_launcher_background) 分别引用不同的对象?
- python - SpreadsheetNotFound:如何授权 gspread 电子邮件帐户