JITコンパイラのコードはいろいろ読んでみたことはあるけれど、ネイティブイメージのSubstrateVMの方はまったく読んでいないなあ、と思いました。ネイティブイメージを生成してみる、的なことを、1年ほど前に試しただけでした。www.sakatakoichi.comというわけで、読めるかもわかりませんが、準備していきます。ありますので、まだの方はcloneしてください。MXGraalVMは、ビルドにMXというツールを使っています。MavenやGradleではありません。単純に読むだけなら、MXは不要ですが、あると便利です。MXをセットアップしましょう。5.195.1GraalVMのプロジェクト構造GraalVMのソースコードは、機能ごとに分かれています。JITコンパイラ、sulongはLLVM関連です。substratevmが、今回の対象となる、ネイティブイメージ生成、実行用VMの機能です。substratevmディレクトリを見てみます。substratevm/srccom.oracle.graal.pointstocom.oracle.objectfilecom.oracle.svm.corecom.oracle.svm.core.genscavengecom.oracle.svm.core.graalcom.oracle.svm.core.jdk8com.oracle.svm.core.jdk9com.oracle.svm.core.posixcom.oracle.svm.core.windowscom.oracle.svm.drivercom.oracle.svm.graalcom.oracle.svm.hostedcom.oracle.svm.jlinecom.oracle.svm.jnicom.oracle.svm.junitcom.oracle.svm.libfficom.oracle.svm.nativecom.oracle.svm.native.jnicom.oracle.svm.native.libchelpercom.oracle.svm.native.strictmathcom.oracle.svm.polyglotcom.oracle.svm.reflectcom.oracle.svm.testcom.oracle.svm.thirdpartycom.oracle.svm.trufflecom.oracle.svm.truffle.nficom.oracle.svm.tutorialnative-image-maven-pluginnative-image-maven-plugin-testorg.graalvm.polyglot.nativeapiorg.graalvm.polyglot.nativeapi.nativesrcディレクトリの中に、多数のモジュールが入っています。このモジュール1つ1つに、またsrcディレクトリがあります。substratevm/src/com.oracle.graal.pointstocom.oracle.graal.pointsto.imlsrcこのような構造なので、単純にIDEでsubstratevmディレクトリを開くと、コンパイルエラーの表示が出てきます。MXで、IDEの設定ファイルを出力させることができます。IDEA用の設定ファイルを出力します。intellijinitで出力したためです。eclipseinitで出力できるようです。IDEへ対応させる方法は、こちらのドキュメントにあります。GitHubMXをセットアップしておくと便利、というのは、このためでした。JITコンパイラなど、すべての機能のソースコードに対して使えます。MXのビルドスクリプトMXのビルドスクリプトは、なんとPythonで書きます。mx.xxxディレクトリに、スクリプトがあります。-1eclipse-settingsmx.substratevm.imlmx_substratevm.pymx_substratevm.pycmx_substratevm_benchmark.pymx_substratevm_benchmark.pycrebuild-images.shsuite.pysuite.pyctools-chromeinspector.propertiestools-junit.propertiestools-native-image.propertiestools-profiler.propertiestools-regex.propertiestools-truffle.propertiesネイティブイメージライブラリのビルドを見ていきます。このビルドは、アプリケーションのネイティブイメージを生成するものではないことに、注意してください。ライブラリ自体をビルドする処理です。mx_substratevm.pyを見ます。**kwargs)run_javaの詳細は省略しましすが、Javaのmainメソッドを実行しています。実行するクラスは、substratevm:SVM_DRIVERの値です。suite.pyに定義されています。実質これはJSONです。},...com.oracle.svm.driver.NativeImageがメインクラスとわかりました。}mainメソッドがあります。MXからこのメインメソッドが呼び出され、ビルドしてライブラリが生成されます。mxbuildディレクトリに出力されます。まとめ今回は、GraalVMのソースを読むために、主にMXについてまとめました。MXを使えば、GraalVMのソースをIDEで読みやすくなります。MXのビルドスクリプトはPythonで書かれており、ここから、ライブラリ生成時のメインクラスがわかりました。ネイティブイメージ自体を生成している処理を見てみたいですね。2019の2日目が終わりました。Time)コンパイルしました。前回はグラフノードの生成を見ました。関西Javaエンジニアの会の代表/発起人です。JVMやJavaについて書きます。(51)スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。