借助Graalvm设计自己的开发语言

SimpleLanguage 简介

我们发现,开始实现您自己的语言的最简单方法是扩展现有语言,例如 SimpleLanguage。 SimpleLanguage是一种使用Language API构建的演示语言。SimpleLanguage 项目展示了如何使用语言 API 编写您自己的语言。它旨在使用大多数可用的Truffle 语言实现框架(以下简称“Truffle”)功能,并通过内联源文档广泛记录它们的使用。

首先,确保Maven3和 GraalVM 在您的系统中可用。

使用以下命令克隆 SimpleLanguage 存储库:

git clone https://github.com/graalvm/simplelanguage

JAVA_HOME使用 Linux 的命令行 shell 将环境变量和环境变量设置PATH为 GraalVM 主目录和 bin 文件夹:

export JAVA_HOME=/path/to/graalvm
export PATH=/path/to/graalvm/bin:$PATH

对于 macOS,请使用:

export JAVA_HOME=/path/to/graalvm/Contents/Home
export PATH=/path/to/graalvm/Contents/Home/bin:$PATH

原文博客 https://wuxiongwei.com/archives/jie-zhu-graalvm-she-ji-zi-ji-de-kai-fa-yu-yan

mvn package从 SimpleLanguage 文件夹执行以构建语言。该命令还在目录中构建一个slnative可执行文件simplelanguage/native和一个sl-component.jar语言组件,稍后可以使用GraalVM Updater工具将其安装到 GraalVM 中。请验证该native-image插件在您的 GraalVM 发行版中是否可用,以避免构建失败:
gu list gu install native-image
您可以通过运行以下命令在打包阶段禁用 SimpleLanguage 本机可执行文件构建:

export SL_BUILD_NATIVE=false
mvn package

在 SimpleLanguage 根文件夹中运行:

./sl ./language/tests/HelloWorld.sl

SimpleLanguage 演示语言根据通用许可许可证(UPL) 获得许可。

IDE 设置

Truffle 框架提供了与语言无关的基础设施,通过提供额外的 API 来实现标准 IDE 功能。如果您想试验您的语言并获得 IDE 的好处,请考虑导入 SimpleLanguage 作为示例。
原文博客 wuxiongwei.com

Eclipse

SimpleLanguage 教学项目已经使用 Eclipse Neon.2 Release 4.6.2 和 Eclipse Oxygen.3A 进行了测试。要将项目文件夹导入所需的 Eclipse 环境:

  1. 使用新工作区打开 Eclipse。
  2. 从 Eclipse 市场(Help -> Eclipse Marketplace)安装m2e和插件。m2e-apt
  3. 最后,SimpleLanguage从 File -> Import -> Maven -> Existing Maven Projects -> 浏览到 SimpleLanguage 文件夹 -> Finish 导入项目。

NetBeans

NetBeans 为调试任意语言提供 GUI 支持。要将 SimpleLanguage 上传到 NetBeans 界面,请执行文件 -> 打开项目 -> 选择simplelanguage文件夹 -> 选中打开所需项目 -> 打开项目。

IntelliJ IDEA

SimpleLanguage 项目已使用 IntelliJ IDEA 进行了测试。打开 IntelliJ IDEA,然后从主菜单栏中选择 File -> Open -> Navigate to 并选择simplelanguage文件夹 -> 按 OK。所有依赖项都将自动包含在内。

运行 SimpleLanguage

要运行 SimpleLanguage 源文件,请执行:
原文博客 https://wuxiongwei.com/archives/jie-zhu-graalvm-she-ji-zi-ji-de-kai-fa-yu-yan

./sl language/tests/HelloWorld.sl

要查看已编译函数的汇编代码,请运行:

./sl -disassemble language/tests/SumPrint.sl

转储图

要调查性能问题,我们推荐使用Ideal Graph Visualizer (IGV) ,它是构建在Oracle GraalVM 企业版之上的任何语言实施者的必备工具。它可以在Oracle 技术网下载页面上单独下载。

解压下载的包,进入bin目录,启动IGV:

cd idealgraphvisualizer/bin
idealgraphvisualizer

从 SimpleLanguage 根文件夹执行以下命令将图形转储到 IGV:

./sl -dump language/tests/SumPrint.sl

调试

要使用 Java 调试器开始调试 SimpleLanguage 实现,请将-debug选项传递给程序的命令行启动器:

./sl -debug language/tests/HelloWorld.sl

然后在端口 8000 上附加一个 Java 远程调试器(如 Eclipse)。

GraalVM 的 SimpleLanguage 组件

使用Truffle 框架实现的语言可以打包为组件,以后可以使用GraalVM Updater工具将其安装到 GraalVM 中。mvn package在 SimpleLanguage 文件夹中运行也会构建一个sl-component.jar. 该文件是 GraalVM 的 SimpleLanguage 组件,可以通过运行以下命令进行安装:

gu -L install /path/to/sl-component.jar

SimpleLanguage 原生图像

使用 Truffle 构建的语言可以使用Native Image进行 AOT 编译。mvn package在 SimpleLanguage 文件夹中运行还会slnative在该目录中构建一个可执行文件native。该可执行文件是作为单个原生应用程序的完整 SimpleLanguage 实现,不需要 GraalVM 即可执行 SimpleLanguage 代码。除此之外,与在 GraalVM 上运行相比,使用本机可执行文件的一大优势是启动时间大大加快,如下所示:
原文博客 wuxiongwei.com

time ./sl language/tests/HelloWorld.sl
== running on org.graalvm.polyglot.Engine@2db0f6b2
Hello World!

real    0m0.405s
user    0m0.660s
sys     0m0.108s

time ./native/slnative
language/tests/HelloWorld.sl
== running on org.graalvm.polyglot.Engine@7fd046f06898
Hello World!

real    0m0.004s
user    0m0.000s
sys     0m0.000s

该片段显示了使用启动器脚本定时执行“Hello World”程序,该sl启动器脚本使用 Native Image 在 GraalVM 上运行 SimpleLanguage。我们可以看到,在 GraalVM 上运行时,执行需要 405 毫秒。由于我们的 SimpleLanguage 程序只执行一条打印语句,我们可以得出结论,几乎所有这些时间都花在了启动 GraalVM 和初始化语言本身上。当使用本机可执行文件时,我们看到执行只需要 4 毫秒,这表明启动速度比在 GraalVM 上运行快两个数量级。

有关该native-image工具的更多信息,请考虑阅读参考手册。

禁用 SimpleLanguage Native Image Build

通过 Maven 构建本机可执行文件附加到 Mavenpackage阶段。SL_BUILD_NATIVE由于本机可执行文件构建可能需要一些时间,我们通过将环境变量设置为如下方式提供跳过此构建的选项false:

export SL_BUILD_NATIVE=false
mvn package
...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building simplelanguage-graalvm-native
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- exec-maven-plugin:1.6.0:exec (make_native) @ simplelanguage-graalvm-native ---
Skipping the native image build because SL_BUILD_NATIVE is set to false.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...

使用最新(开发)版本的编译器运行 SimpleLanguage

要使用 Graal 编译器的开发版本运行 SimpleLanguage,我们必须使用该编译器构建 GraalVM。克隆graal存储库 (https://github.com/oracle/graal) 并按照vm/README.md文件中的说明构建 GraalVM。

完成后,指向JAVA_HOME新建的 GraalVM 并继续正常构建和运行 SimpleLanguage。

使用命令行运行 SimpleLanguage

执行 SimpleLanguage 代码通常使用脚本来完成,该sl脚本设置必要的命令行,具体取决于JAVA_HOME指向 GraalVM 还是其他 JVM 安装。以下小节描述了这两种情况的命令行。

使用 GraalVM 作为 JAVA_HOME 运行 SimpleLanguage

假设JAVA_HOME指向 GraalVM 安装并且当前工作目录是该simplelanguage目录,要运行 SimpleLanguage 应该执行以下命令:

$JAVA_HOME/bin/java \
    -cp launcher/target/launcher-22.1.0-SNAPSHOT.jar \
    -Dtruffle.class.path.append=language/target/simplelanguage.jar \
    com.oracle.truffle.sl.launcher.SLMain language/tests/Add.sl

简而言之,我们将启动器 JAR 放在类路径上并执行其主类,但我们通过使用-Dtruffle.class.path.append选项通知 GraalVM SimpleLanguage 的存在并向其提供胖语言 JAR 的路径。将语言放在单独的类路径上可确保语言实现与其嵌入上下文(在本例中为启动器)之间的强分离。

禁用类路径分离
笔记!这应该只在开发过程中使用。

出于开发目的,禁用类路径分离并在应用程序类路径上启用语言实现(例如,用于测试语言的内部)很有用。

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

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

用于导出语言 API 包的示例 POM--upgrade-module-path可以在Simple Language POM.xml文件中找到。

注意:禁用定位器会有效地从模块路径中删除所有已安装的语言,因为定位器还会为这些语言创建类加载器。要继续使用内置语言,请将模块路径指向所有需要的语言主目录(例如,$GRAALVM/languages/js),将它们添加到模块路径中。

其他 JVM 实现

与包含运行使用Truffle实现的语言所需的所有依赖项的 GraalVM 不同,其他 JVM 实现需要额外的 JAR 才能出现在类路径上。这些是 Maven Central 提供的 Language API 和 GraalVM SDK JAR。

假设JAVA_HOME指向一个股票 JDK 安装,并且当前工作目录是该simplelanguage目录,并且该目录中存在 Language API 和 GraalVM SDK JAR,可以使用以下命令执行 SimpleLanguage:

$JAVA_HOME/bin/java \
    -cp graal-sdk-22.1.0.jar:truffle-api-22.1.0.jar:launcher/target/launcher-22.1.0-SNAPSHOT.jar:language/target/simplelanguage.jar \
    com.oracle.truffle.sl.launcher.SLMain language/tests/Add.sl

原文博客 https://wuxiongwei.com/archives/jie-zhu-graalvm-she-ji-zi-ji-de-kai-fa-yu-yan

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容