[Java9 新機能] jshell入門


1. Introduction

JDK9のリリースまで残すところあと半年ちょっとになりました。
JDK9の新機能、 Project Jigsaw によるモジュール化が取り上げれることが多いですが、
Javaの REPLjshell が搭載されたのが気になりました。

今回はjshellを触るまでの環境構築と事項してみた所感を書いていきます。

  • 筆者環境はMac OS Xです

1.1 REPL??

読んで字のごとく、

  • R : Read 読んで
  • E : Eval 評価して
  • P : Print 出力して
  • L : Loop 繰り返す

一行書いて実行、一行書いて実行、一行書いて... を繰り返せます。

1.2 jshell??

他言語ではこのREPLという仕組みが一般的で、
RubyやScalaには標準で付属しています。
いよいよJavaにもこのREPLが導入されました。

そもそもJavaには言語の完成度は置いておいて、実行までの手順の複雑さ がありました。
北米の情報系の大学でも、入学試験でJavaではなくPythonが用いられることが多く、理由の一つに 実行までの煩わしさ が含まれているそうです。

Java言語が容易に実行できる環境 (=jshell) が普及すればJavaももっと普及するんですかね。(どうですかね?)

2. Download

  1. こちらから Open JDK9 Early Access Releases が入手できます
  2. ダウンロードしたらインストーラーを起動してインストール

これで完了です

3. Hello World

とりあえずHello World出してみます。

3.1 Start-up jshell !!

インストールが完了したら

/Library/Java/JavaVirtualMachines/

配下にインストール済みのJDKの一覧があるので

jdk-9.jdk があるのを確認します。

jdk9配下に、

jdk-9.jdk/Contents/Home/bin/

binの配下に、

jshell がありますので起動します。

無事起動しました!!!!
以前試したときは英語でしたが、日本語でwelcomeメッセージが表示されました!!

3.2 Hello World

Hello Worldしてみます!

3.2.1 そのまま

一番シンプルな方法です、タブ補完が効くのでスイスイ入力できました。
ちなみにセミコロン無しで実行できました。

3.2.2 変数

一度変数に格納してから出力しました。
2行目では変数名のタブ補完が効いたのが快適でした。

3.2.3 /open

後述しますが、オプションコマンドの /open を使うことで外部ファイルを読み込んで実行できます。

Hello.java
System.out.println("Hello World")

ファイルを読み込めるのであれば、スクリプトとして実行できるかな?とおもったのですが。
読み込んだファイルを一行ずつ評価してるようなので、以下のjavaファイルでは何も実行されませんでした。

Hello.java
class Hello {
  public static void main(String[] args) {  
    System.out.println("Hello World");
  }
}

というか、一行ずつ読まれてるんなら読み込むファイルはテキストファイルでもいいのか?
と、思ったので適当な拡張子で読み込んでみました。

Hello.txt
System.out.println("Hello World")

読めました。

読み込んだ先のファイルを一行ずつ実行するみたいですね。拡張子は.javaじゃなくても良さそうです。

4. もうちょっと触ってみる

単純に一行ずつコードを試して見る。以外の使い方ができそうなので少しだけ見てみました。

4.1 コマンド

Welcomeメッセージで表示される /help コマンドで使用可能なコマンドの一覧が確認できます。

コマンド 説明
/list 入力したソースをリストします
/edit 名前またはIDで参照されるソース・エントリを編集します
/drop 名前またはIDで参照されるソース・エントリを削除します
/save ファイルにスニペット・ソースを保存します
/open ソースの入力としてファイルを開きます
/vars 宣言された変数およびその値をリストします
/methods 宣言されたメソッドおよびその署名をリストします
/types 宣言された型をリストします
/imports インポートされたアイテムをリストします
/exit exit jshell
/reset reset jshell
/reload リセットして関連する履歴をリプレイします
/classpath クラスパスにパスを追加します
/history 入力した内容の履歴
/help jshellに関する情報を取得します
/set jshell構成情報を設定します
/retain 後続のセッションに対してjshell構成情報を保持します
/? jshellに関する情報を取得します
/! 最後のスニペットを再実行します
/< id > IDでスニペットを再実行します
/-< n > n回前のスニペットを再実行します

いろいろありますね。
なんかいろんなことできそうですが、余裕があれば別記事でまとめたいと思います。

別件ですが、/help を見るまでjshellの終了のさせ方がわからずパニックになりました。
/exit で終了できますが、コマンドが全部/から始まるとは..

4.2 クラス作ってみる

一行ずつ実行してもいいですが、クラスを宣言して呼び出す。といった使い方もしてみます。

{} 中括弧を閉じるまで入力が続きます。

引数を受け取って、出力するだけの簡単なクラスです。

無事に呼び出せました!!

さっきのコマンド /types で作成したクラスも確認できます。

5. 所感

今回はjshellの触りだけ体験してみました!!
正直な感想は、「業務レベルで使用することはあるのか?」です。

  1. タブ補完でコードを入力していくことができるが、IntelliJ IDEAなどの強力なIDEの補完にはもちろん及ばない。やや入力がストレス。
  2. 実行時まで構文エラーに気付けない => Javaでやらなくて良くない?
  3. と、思いました。Paiza ioのようなオンライン実行環境ありますし。

ただ、Javaを新しく始める。といったような場合には、今までのように
1. JDKインストール
2. Eclipseインストール
3. パッケージ作成
4. クラス作成
5. Hello World

といった煩わしい手順を踏まずに、
1. JDKインストール
2. jshell起動
3. Hello World

というように非常に容易にJavaコードの実行ができます。
これはJavaの入門書が9以降大幅な書き換えが行われるのか?と、思えるレベルのインパクトを感じました。

また、コマンドもあまり触ってないので今回触ってないもっと便利な使い方も確実に存在します。
もうちょっと触ってみて、まだ便利そうな使い方があればまた記事にしてみたいと思います!
コメントでもご指摘などいただけると幸いです!

最後までご覧いただきありがとうございました!