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