REPLで遊ぼう

こちらもご覧ください -> とっても簡単なJava REPLの始め方 - きつねとJava!

現在OpenJDKではJavaのREPL(Read-Eval-Print Loop)の実装を進めています.
そこで,REPLをビルドして,実行して,いくつかのプログラムを実行するところまで紹介します.

ビルド

環境としてLinux系列を想定します.Macも似た感じでビルドできます.
Windows環境では仮想環境でLinuxを使うかWindowsを手放してLinuxをインストールするのが良いと思います.

まず,リポジトリを取ってきます.

$ hg clone http://hg.openjdk.java.net/kulla/dev ~/kulla
$ cd ~/kulla
$ sh ./get_source.sh

その後,JDK全体をビルドします.

$ sh ./configure
$ make images

もしもconfigureで転けたら以下の事項を確認してください.
特に始めてOpenJDKをビルドする場合はOpenJDKのビルドに必要なパッケージをインストールする必要があります.

1. Java8のJDKがインストールされているか?
    インストールされていない場合はインストールを行う
2. Java8のJDKにパスが通っているか?
    通っていないのであればパスを通す
3. OpenJDKのビルドに必要なパッケージがインストールされているか?
    されていなければインストールする
    aptitude系の例) $ sudo aptitude build-dep openjdk

OpenJDKのビルドができたら次は,jline2をビルドします.
現時点で,補完機能のためにjline2に依存しているためです.
GitHub - jline/jline2: Jline 2.x

$ git clone git://github.com/jline/jline2.git ~/jline2
$ cd ~/jline2
$ mvn install

jline2がビルドできたら,最後にREPLをビルドします.
その前に,パスを確認しておいてください.
まず,ビルドしたOpenJDKのイメージへのパスです.
「~/kulla/build/」の中に「linux-x86_64-normal-server-release/」のような環境に合わせた名前のディレクトリがあり,その中に「images/jdk/」があります.
これがOpenJDKのイメージへのパスです.
また,jline2のJARファイルへのパスは以下の様な物になります.
「~/jline2/target/jline-2.13-SNAPSHOT.jar」

これらが確認できたらREPLのビルドの準備が整いました.
REPLのビルドに際しては,PATHにビルドしたOpenJDKのイメージへのパスを指定し,JLINE2LIBにjline2のJARファイルへのパスを指定します.

$ cd ~/kulla/langtools/repl
$ PATH=~/kulla/build/linux-x86_64-normal-server-release/images/jdk/:$PATH JLINE2LIB=~/jline2/target/jline-2.13-SNAPSHOT.jar sh ./scripts/compile.sh

なんのエラーも出力されずにスクリプトが終了すればビルド成功です.

REPLで遊ぶ

ビルドが成功すれば早速REPLで遊びましょう.

$ cd ~/kulla/langtools/repl
$ PATH=~/kulla/build/linux-x86_64-normal-server-release/images/jdk/:$PATH JLINE2LIB=~/jline2/target/jline-2.13-SNAPSHOT.jar sh ./scripts/run.sh

|  Welcome to the Java REPL -- Version 0.324
|  Type /help for help

-> 

このような出力がされれば,実行成功です.

いくつか簡単なプログラムを実行してみましょう.

-> 1 + 2
|  Expression value is: 3
|    assigned to temporary variable $1 of type int

-> int a = 1
|  Added variable a of type int with initial value 1

-> int b = 2
|  Added variable b of type int with initial value 2

-> a + b
|  Expression value is: 3
|    assigned to temporary variable $2 of type int

-> printf("%d", a + b)
3

メソッドを定義することも可能です.

-> int sum(int a, int b) {return a + b;}
|  Added method sum

-> sum(3, 5)
|  Expression value is: 8
|    assigned to temporary variable $3 of type int

また,タブ補完とドキュメント表示も現在鋭意実装中です.

-> System.out.[TAB]
PrintStream(   append(        checkError()   close()        equals(        flush()        format(        getClass()     hashCode()     notify()       
notifyAll()    print(         printf(        println(       toString()     wait(          write(         

-> System.out.println([SHIFT+TAB]
java.io.PrintStream.println(boolean arg0)
java.io.PrintStream.println(char arg0)
java.io.PrintStream.println(int arg0)
java.io.PrintStream.println(long arg0)
java.io.PrintStream.println(float arg0)
java.io.PrintStream.println(double arg0)
java.io.PrintStream.println(char[] arg0)
java.io.PrintStream.println(java.lang.String arg0)
java.io.PrintStream.println(java.lang.Object arg0)

以上,軽くですがREPLを紹介してみました.

より詳細な情報は以下を参照してください.
OpenJDK: Kulla
The kulla-dev Archives
[JDK-8043364] JEP 222: jshell: The Java Shell (Read-Eval-Print Loop) - Java Bug System