将自定义DSL和提供的语言与GraalVM/Truffle框架相结合



我正在GraalVM上使用Truffle框架来实现DSL的原型。目前,我的代码应用程序使用ASM将DSL直接编译为JVM字节码,然后动态加载生成的类。为了使它更易于维护和扩展,我想在Truffle上实现我的语言。

我目前还通过提供的组件中的GraalVM/Truffle使用Python和JS。如何使我的语言与所提供的语言一起工作?根据文件,我需要设置"-Dgraalvm.locatorDisabled=true";为了找到我的语言实现,这是可行的。如果没有它,我就无法使用它。但是,当我启用它时,我就不能使用JS和Python。该文件还说";为了仍然使用内置语言,通过将模块路径指向所有需要的语言主页(例如$GRAALVM/languages/js(,将它们添加到模块路径中&";。

这对我不起作用。我收到一个错误:java.lang.module.ResolutionException:模块org.graalvm.js没有读取导出com.oracle.truffle.api 的模块

我该怎么解决。或者,有没有更好的方法可以将我的语言与所提供的语言一起使用?在我看来,从逻辑上讲,当我通过将语言实现类传递给上下文来构建语言时,应该有一种程序化的方式来用上下文"注册"我的语言。

我不能将我的语言部署为组件,因为它非常特定于主机应用程序,并且只能在进程中与我的应用程序一起工作。将其作为一个组件构建会使构建和部署过程复杂化,并需要包括大量额外的JARS,并将其暴露在更广泛的系统中,而这些系统与它无关。

就上下文而言,所讨论的DSL是一种查询语言(想想SQL(,它使用户能够为系统定义查询,并与内存中的缓存进行有效交互。

谢谢,特洛伊

健康检查:你是否使用了文档中建议的来自maven的truffle-api.jar?

Maven Central上的Language API JAR导出其模块-信息中的所有API包。将--upgrade-module-path选项与-Dgraalvm.locatorDisabled=true和此JAR一起应用以导出语言API包:

-Dgraalvm.locatorDisabled=true --module-path=<yourModulePath>:${truffle.dir} --upgrade-module-path=${truffle.dir}/truffle-api.ja

最新更新