去る7月20日(米国時間)、JavaFX Scriptのオープンな実行環境の開発を行っているプロジェクトOpenJFXは、その活動の一環として「OpenJFX Compiler」の開発をインキュベータプロジェクトとして開始した。OpenJFX Compilerは、JavaFXスクリプトをJava VM上で動作するバイトコードに変換するコンパイラ。通常のJavaFXスクリプトも最終的にはJava VMの上で動作するが、インタプリタ方式なのでスクリプトからバイトコードへの変換、そしてクラスローダによる読み込みまでの一連の作業は全てランタイムで行われる。

OpenJFX CompilerはJavaFXアプリケーションの開発にコンパイラ方式を採り入れるもので、スクリプトからバイトコードを生成する部分までを独立して行えるようにする。このコンパイラはJDKのjavacコンパイラとの互換性を持ち、生成されるバイトコードは当然ながら通常のJavaプログラムから生成された場合と全く同じものになる。

OpenJFX Compilerプロジェクトの公式サイトはjava.net内に開設されている。現在はまだプロジェクトがスタートしたばかりで最低限の実装しか公開されていないが、今回は早速このOpenJFX Compilerを試してみたいと思う。

なお、JavaFX Script自身に関してはこちらこちらの白石俊平氏の記事が詳しいので、合わせて参考にしていただきたい。

リポジトリのチェックアウトとビルド

OpenJFX Compilerの実装は、現時点ではSubversionのリポジトリからのみ入手することができる。したがってまずはSubversionのクライアントが必要だ。公開されているファイル群はNetBeansのプロジェクト形式になっているので、NetBeansのSubversionモジュールを使うと便利である。

現在はメイン(trunk/)開発ブランチのみ用意されている。リポジトリのURLは「https://openjfx-compiler.dev.java.net/source/browse/openjfx-compiler/」でユーザ名は「guest」、パスワードは設定されていない。詳しくはこのページの解説を参照していただきたい。

チェックアウトしたらNetBeansでプロジェクトを開くと図1のような構成になっている。プロジェクトツリーのメニューからこれをビルドすると、ファイルツリーのdistフォルダ以下に図2のように「javafx.jar」が生成される。これがコンパイラの本体となる。

図1: OpenJFX CompilerのNetBeansプロジェクト

図2: ビルドするとjavafx.jarが生成される

JavaFXスクリプトをコンパイルする

それでは、OpenJFX Compilerを使って実際にJavaFXスクリプトをコンパイルしてみよう。ただし、現時点ではまだ非GUIのスクリプトしかコンパイルすることができない。すなわち、javafx.uiパッケージ以下のコンポーネントは一切利用できない。GUI部分のデザインと開発はこれからスタートするという話で、利用できるようになるまでにはまだもう少し時間がいりそうだ。

今回はひとまずコンパイラを試してみるということで、GUIを使わないリスト1のようなスクリプトを用意した。「大吉」「中吉」「小吉」の中からランダムで1つ選んで表示するという、ごく単純なスクリプトである。

リスト1: CompilerTest.fx - テスト用の'おみくじ'スクリプト

import java.lang.String;
import java.lang.System;
import java.lang.Math;

public class Omikuji {
  operation hiku():String;
}

operation Omikuji.hiku() {
    var x = Math.random() * 3;
    return if (1 > x)
       then "小吉です。"
       else if (2 > x) 
           then "中吉です。"
           else "大吉です。";
}

var omikuji = new Omikuji();
System.out.println(omikuji.hiku());

コンパイルは、カレントディレクトリと先程生成したjavafx.jarをクラスパスに追加して、javaコマンドを用いてプロンプト1のように行う。JavaFX Script仕様に沿っていてもエラーになることがあるが、そこはまだ開発版ということでいろいろ試して欲しい。

プロンプト1: OpenJFX Compilerを使ったコンパイル

> java -classpath ".;.\javafx.jar" -jar javafx.jar CompilerTest.fx

コンパイルに成功すると、Javaのソースファイルとクラスファイルが生成される。今回の例ではCompilerTestとCompilerTest$Omikujiのものだ(プロンプト2)。詳細は割愛するが、ソースコードを見る限りでは生成されるクラスはcom.sun.javafx.runtime.Contextインタフェースをimplementsしたものになるようだ。

プロンプト2: Javaソースファイルとクラスファイルが生成される

> dir
2007/07/26  20:11    <DIR>          .
2007/07/26  20:11    <DIR>          ..
2007/07/26  20:11             1,092 CompilerTest$Omikuji.class
2007/07/26  20:11             1,185 CompilerTest$Omikuji.java
2007/07/26  20:11             1,250 CompilerTest.class
2007/07/26  20:06               385 CompilerTest.fx
2007/07/26  20:11             1,346 CompilerTest.java
2007/07/26  20:08         3,906,126 javafx.jar
               6 個のファイル           3,911,384 バイト
               2 個のディレクトリ   8,163,250,176 バイトの空き領域

生成されるのはJavaバイトコードなので、実行は通常通りjavaコマンドで行うことができる。ただし、JavaFX関連のクラス/インタフェースを利用したプログラムになっているので、javaxf.jarをクラスパスに追加して実行する必要がある(プロンプト3)。

プロンプト3: 実行方法は通常のJavaプログラムと同じ

> java -classpath .;javafx.jar CompilerTest
中吉です。

OpenFX Compilerはまだ開発がスタートしたばかりなので満足に使えるレベルにはなっていないが、JavaFX活用のひとつの形として注目する価値がある。開発者向けのWikiなども用意されプロジェクトへの協力を募集しているので、興味のある人は積極的に参加してみて欲しい。