道化的プログラミング

GraalVMのEarly Adopter Windows Supportでnative-imageを試す

GraalVM CE 19で待望のWindows版がリリースされたので早速試した所、途中で色々つまづきつつもなんとか実行ファイルをビルドできた。
試した環境はWindows 10 Home Edition 64 bit。

やること

  • インストール
  • Javaコードを書きjavacでコンパイル
  • native-image化
    • Windows SDK for Windows 7をインストール
    • Windows SDK 7.1 Command Promptから実行

インストール

こちらから graalvm-ce-windows-amd64-19.0.0.zip をダウンロードし適当なディレクトリに解凍。

Javaコードを書きjavacでコンパイル

面白みのないコードだけど。お行儀悪くGraalVMインストールディレクトリにtestディレクトリを掘ってそこに作成した。

public class Hello {

  public static void main(String[] args) {
    System.out.println("Hello Windows Graal!");
  }

}

GraalVMをインストールしたディレクトリでコマンドプロンプトを開き、コンパイル。.class ファイルが .java と同じディレクトリに生成される。

>.\bin\javac Hello.java

native-image化

いよいよnative化にトライ。
なお今回からLinuxやMacでは native-image が同梱されなくなったが(後述)、Windows版では最初から入っている。

GraalVMをインストールしたディレクトリでコマンドプロンプトから以下を実行したところ、エラーとなった。

> .\bin\native-image.cmd -cp test Hello
[hello:11816]    classlist:   3,421.71 ms
[hello:11816]        (cap):     557.59 ms
[hello:11816]        setup:     878.50 ms
Error: Unable to compile C-ABI query code. Make sure GCC toolchain is installed on your system.
Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception
Error: Image build request failed with exit status 1

GCCを入れろとのメッセージ。しかしこれは嘘で、GithubのIssue によると、Windows SDK for Windows 7に付属の Windows SDK 7.1 Command Promptから実行せよとのこと。

試しにインストール済みだったVisual Studio 2017 開発者コマンドプロンプトから試したけれどダメだった。

Windows SDK for Windows 7をインストール

というわけでこちらからインストールする。

ここでDownloadをクリックすると3つ出てきてどれをダウンロードすればよいかわからないが、こちらによると

GRMSDK_EN_DVD.iso は x86。GRMSDKX_EN_DVD.iso は x64。GRMSDKIAI_EN_DVD.iso はAMD64

とのことなので、 GRMSDKX_EN_DVD.iso をダウンロードした。

早速インストールと行きたいのだがここでも罠があり、ISOファイル直下のsetup.exeではなく、Setupディレクトリの中のSDKSetup.exeを実行する必要があるらしい

実際手元でsetup.exeを起動した場合、なぜかC++関連のチェックを有効化できなかった。

無事インストールが成功すれば、Windows SDK 7.1 Command Promptが起動可能のはず。

Windows SDK 7.1 Command Promptから実行

気を取り直してWindows SDK 7.1 Command Promptを起動し、GraalVMをインストールしたディレクトリで以下を実行。

>.\bin\native-image.cmd -cp test Hello
[hello:12552]    classlist:   3,172.26 ms
[hello:12552]        (cap):  56,918.37 ms
[hello:12552]        setup:  58,294.43 ms
[hello:12552]   (typeflow):   9,461.19 ms
[hello:12552]    (objects):   6,182.68 ms
[hello:12552]   (features):     632.13 ms
[hello:12552]     analysis:  16,523.92 ms
[hello:12552]     (clinit):     217.78 ms
[hello:12552]     universe:     615.45 ms
[hello:12552]      (parse):   1,383.63 ms
[hello:12552]     (inline):   3,869.78 ms
[hello:12552]    (compile):  14,177.54 ms
[hello:12552]      compile:  20,117.05 ms
[hello:12552]        image:   1,145.81 ms
[hello:12552]        write:   6,774.28 ms
[hello:12552]      [total]: 106,857.29 ms

今度は無事成功した。さっそく実行してみる。

>hello.exe
Hello Windows Graal!

めでたい 🎉 🎉

さいごに

紆余曲折ありつつもなんとかnative化に成功できてよかったよかった。というかGraalVMすごい。夢が広がる。

現時点ではエラーメッセージがおかしかったり、WindowsSDK 7のインストールが辛かったりするけれど、今後改善されるはず。
とりあえずはVisualStudio 2017 開発者コマンドプロンプトからビルド可能になって欲しい。

Linux/Mac版GraalVMでnative-imageを追加インストールする

今回からLinuxやMacでは native-image が同梱されなくなったため、追加インストールする必要がある。

以下のコマンドで追加可能なものを一覧できる。

$ bin/gu available
Downloading: Component catalog from www.graalvm.org
ComponentId              Version             Component name      Origin 
--------------------------------------------------------------------------------
native-image             19.0.0              Native Image        github.com
python                   19.0.0              Graal.Python        github.com
R                        19.0.0              FastR               github.com
ruby                     19.0.0              TruffleRuby         github.com

インストールするには以下のコマンドを実行。

$ bin/gu install native-image
Downloading: Component catalog from www.graalvm.org
Processing component archive: Native Image
Downloading: Component native-image: Native Image  from github.com
Installing new component: Native Image licence files (org.graalvm.native-image, version 19.0.0)

インストール先は今までどおり bin の中。

$ bin/native-image
Please specify options for native-image building or use --help for more info.