Java
memo
shell
Java9
jshell

[Java9 新機能] jshell入門

More than 1 year has passed since last update.


1. Introduction

スクリーンショット 2016-08-06 16.36.35.png

JDK9のリリースまで残すところあと半年ちょっとになりました。

JDK9の新機能、 Project Jigsaw によるモジュール化が取り上げれることが多いですが、

Javaの REPLjshell が搭載されたのが気になりました。

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


  • 筆者環境はMac OS Xです


1.1 REPL??

読んで字のごとく、



  • R : Read 読んで


  • E : Eval 評価して


  • P : Print 出力して


  • L : Loop 繰り返す

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

jdk9-repl.png


1.2 jshell??

他言語ではこのREPLという仕組みが一般的で、

RubyやScalaには標準で付属しています。

いよいよJavaにもこのREPLが導入されました。

そもそもJavaには言語の完成度は置いておいて、実行までの手順の複雑さ がありました。

北米の情報系の大学でも、入学試験でJavaではなくPythonが用いられることが多く、理由の一つに 実行までの煩わしさ が含まれているそうです。

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


2. Download


  1. こちらから Open JDK9 Early Access Releases が入手できます

  2. ダウンロードしたらインストーラーを起動してインストール

スクリーンショット 2016-08-06 16.36.35.png

これで完了です


3. Hello World

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


3.1 Start-up jshell !!

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

/Library/Java/JavaVirtualMachines/

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

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

スクリーンショット 2016-08-07 18.17.31.png

jdk9配下に、

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

binの配下に、

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

スクリーンショット 2016-08-07 18.19.13.png

スクリーンショット 2016-08-07 18.20.40.png

無事起動しました!!!!

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


3.2 Hello World

Hello Worldしてみます!


3.2.1 そのまま

スクリーンショット 2016-08-07 18.21.56.png

一番シンプルな方法です、タブ補完が効くのでスイスイ入力できました。

ちなみにセミコロン無しで実行できました。


3.2.2 変数

スクリーンショット 2016-08-07 18.23.31.png

一度変数に格納してから出力しました。

2行目では変数名のタブ補完が効いたのが快適でした。


3.2.3 /open

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

スクリーンショット 2016-08-07 18.24.30.png


Hello.java

System.out.println("Hello World")


ファイルを読み込めるのであれば、スクリプトとして実行できるかな?とおもったのですが。

読み込んだファイルを一行ずつ評価してるようなので、以下のjavaファイルでは何も実行されませんでした。

スクリーンショット 2016-08-07 18.25.26.png


Hello.java

class Hello {

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

というか、一行ずつ読まれてるんなら読み込むファイルはテキストファイルでもいいのか?

と、思ったので適当な拡張子で読み込んでみました。

スクリーンショット 2016-08-07 18.26.04.png


Hello.txt

Sysytem.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 クラス作ってみる

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

スクリーンショット 2016-08-07 17.30.30.png

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

スクリーンショット 2016-08-07 17.32.50.png

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

スクリーンショット 2016-08-07 17.34.29.png

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

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

スクリーンショット 2016-08-07 17.35.19.png


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以降大幅な書き換えが行われるのか?と、思えるレベルのインパクトを感じました。

また、コマンドもあまり触ってないので今回触ってないもっと便利な使い方も確実に存在します。

もうちょっと触ってみて、まだ便利そうな使い方があればまた記事にしてみたいと思います!

コメントでもご指摘などいただけると幸いです!

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