11.5 实战:深入理解Graal编译器 11.5.2 构建编译调试环境

11.5.2 构建编译调试环境

由于Graal编译器要同时支持Graal VM下的各种子项目,如Truffle、Substrate VM、Sulong等,还要支持作为HotSpot和Maxine虚拟机的即时编译器,所以只用Maven或Gradle的话,配置管理过程会相当复杂。为了降低代码管理、依赖项管理、编译和测试等环节的复杂度,Graal团队专门用Python 2写了一个名为mx的小工具来自动化做好这些事情。我们要构建Graal的调试环境,第一步要先把构建工具mx 安装好,这非常简单,进行如下操作即可:

1
2
$ git clone https://github.com/graalvm/mx.git 
$ export PATH=`pwd`/mx:$PATH

既然Graal编译器是以Java代码编写的,那第二步自然是要找一个合适的JDK来编译。考虑到Graal VM项目是基于OpenJDK 8开发的,而JVMCI接口又在JDK 9以后才会提供,所以Graal团队提供了一个带有JVMCI功能的OpenJDK 8版本,我们可以选择这个版本的JDK 8来进行编译。当读者只关注Graal 编译器在HotSpot上的应用而不想涉及Graal VM其他方面时,可直接采用JDK 9及之后的标准Open/OracleJDK。在本次实战中,笔者机器上使用的是带JVMCI的OpenJDK 8^1,对于与其他JDK版本有差别的步骤,笔者会特别说明。选择好JDK版本后,设置JAVA_HOME环境变量即可,这是编译过程中唯一需要手工处理的依赖:

1
export JAVA_HOME=/usr/lib/jvm/oraclejdk1.8.0_212-jvmci-20-b01

第三步是获取Graal编译器代码,编译器部分的代码是与整个Graal VM放在一块的,我们把Graal VM复制下来,大约有700MB,操作如下:

1
$ git clone https://github.com/graalvm/graal.git

其他目录中存放着Truffle、Substrate VM、Sulong等其他项目,这些在本次实战中不会涉及。进入compiler子目录,使用mx构建Graal编译器,操作如下:

1
2
$ cd graal/compiler 
$ mx build

由于整个构建过程需要的依赖项都可以自动处理,需要手动处理的只有OpenJDK一个,所以编译一般不会出现什么问题,大概两三分钟编译即可完成。此时其实已经可以修改、调试Graal编译器了, 但写Java代码不同于C、C++,应该没有人会直接用VIM去做Java开发调试,我们还是需要一个IDE来支持本次实战的。mx工具能够支持Eclipse、Intellij IDEA和NetBeans三种主流的Java IDE项目的创建, 由于Graal团队中使用Eclipse占多数,支持也最好,所以笔者也选择Eclipse来进行本次实战,创建Eclipse项目的操作如下:

1
2
$ cd graal/compiler 
$ mx eclipseinit

无论使用哪种IDE,都需要把IDE配置中使用的Java堆修改到2GB或以上,才能保证Graal在IDE中的编译构建能够顺利进行,譬如Eclipse默认配置(eclipse.ini文件)下的Java堆最大为1GB,这是不够的。设置完成后,在Eclipse中选择File->Open Projects from File System,再选择Graal项目的根目录,将会导入整个Graal VM,导入的工程如图11-10所示。

image-20211126123628899

图11-10 Graal VM项目(部分工程)

如果你与笔者一样采用的是JDK 8,那么要记得在Eclipse中也必须将那个带有JVMCI功能的特殊JDK 8用作Eclipse里面“Java SE-1.8”的环境配置(Windows->Preferences->Java->Install JREs->ExecutionEnvironments->Java SE-1.8),此外,还需要手工将以其他版本号结尾的工程关闭,譬如图11-11所示。 这对于采用其他版本JDK来编译的读者也是一样的。

到此为止,整个编译、调试环境就已经构建完毕,下面可以开始探索Graal工作原理的内容了。