2015/06/12 このエントリーをはてなブックマークに追加 はてなブックマーク - JavaのREPL、project kullaがスッゴイ便利!

JavaのREPL、project kullaがスッゴイ便利!







※注意

本記事は2015/06/12現在のproject kullaに関する情報です。
今後のJava SE 9のリリースやproject kullaの開発状況によっては内容が変わる可能性もありますのでご了承ください。




Java SE 9ではJavaにREPLが入る予定となっています。

その名もproject kulla!!


とある記事を読み、リリース前ですが今でも使えることを知りました。
これは使ってみたい!ということでトライしてみました。






REPLとは
Read-eval-print loopの略
字のごとく読んで評価して表示して繰り返す。対話型評価環境を指す。ただし、インタープリタと同義ではない。
多くの関数型言語やスクリプト言語では利用出来る。
http://d.hatena.ne.jp/keyword/REPLより引用)



REPLについては以前にもWeb上にあるREPLをまとめた記事を書きました。

JavaのWeb REPLもあるにはあるのですがちょっと反応が遅いのが個人的にはネックでした。



対話環境なので、一つ一つのプログラムの評価が早く、
書いたタイミングですぐに挙動の確認が出来ます。

また、ビルド、デプロイやテスト実行などの必要もなく
インプットに対してのアウトプットをすぐに知ることが出来ます。
これは素早い開発を行いたいときにかなり便利だと感じています。

kullaに関してはコンパイルもあまり意識させず、
スクリプト言語のような体感でJavaのプログラミングが出来ると言えます。





・写経

プログラミングにおける写経です。
説明を読みながらサンプルプログラムを真似て書いてみる。
僕は書いた方が断然理解が早まるのでありがたいです!


例えば最近だと、櫻庭さんのJava技術最前線
Date and Time APIの記事を読みながら写経していました。

画面半分をブラウザで記事表示、もう半分をREPLって感じでなるべくウィンドウの行き来を意識しない感じでやるようにしてます。



イメージ)






















・IDEでの開発

IDEのプラグインだったりしますが、
軒並みJavaの提供するIDE(Eclipse、NetBeans、IntelliJ IDEA)では
コマンドプロンプト/ターミナルが使えます。
利点については前述したものと同様ですが、コンパイルチェックで
確認できないようなものをさっと確認するのに役立つはずです!
(ただクラスパス通したりがちょっと面倒かな…?)


・設計段階でのAPIの動作確認

IDE立ち上げるのもめんどいわ!ってときもあると思います。そういうときもREPLなら即起動、即確認ができます。



・テストを書くほどでもない確認

テスト書かないとか…ってサバンナ方面から言われそうですが、細かな動作確認ぐらいのものならREPLで充分ってことはありえると思います。






・環境構築

さて、本題のkullaの使い方です。
これに関してはすでにいくつか記事にある通りで、
JDK9とkullaの実行可能jarを用意するだけです。

JDK™ 9 Early Access Releases
project kullaのナイトリービルド



JDK9のJAVA_HOMEにパスを通した状態で


java -jar kullaxxxxxxx.jar

とjavaコマンドを実行するだけで対話モードに入ります。簡単ですね!



動作確認はWin 7 32bit、Mac OSXで行いました。
Winの方が今のところ安定しないかも。。。充分使えるんですが。
Mac OSXの方が快適です笑


・使い方

REPLモードに入ればもうすぐにJavaのプログラミングが出来ます。

例えば

import java.util.stream.*;
IntStream.range(1, 10).forEach(System.out::println)

なんてのもすぐ書けちゃいます!!


Shiftキーを押すとコードアシストまでしてくれて賢い!しかもスピーディーです。


ちなみにREPLはデフォルトの状態で
java.lang以外のパッケージに関しても7つのパッケージをimportしています。

import java.util.*;
import java.io.*;
import java.math.*;
import java.net.*;
import java.util.concurrent.*;
import java.util.prefs.*;
import java.util.regex.*;
などがimportされているので、なにも考えずにコレクションの操作なども可能です。

/hまたは/helpを押すと各コマンドのヘルプを出力してくれます。
これ見れば大体は分かると思います。
-> /help
Type a Java language expression, statement, or declaration.
Or type one of the following commands:

/l  or /list [all]                -- list the source you have typed
       /seteditor <executable>    -- set the external editor command to use
/e  or /edit <name or id>         -- edit a source entry referenced by name or id
/d  or /drop <name or id>         -- delete a source entry referenced by name or id
/s  or /save [all|history] <file> -- save the source you have typed
/o  or /open <file>               -- open a file as source input
/v  or /vars                      -- list the declared variables and their values
/m  or /methods                   -- list the declared methods and their signatures
/c  or /classes                   -- list the declared classes
/x  or /exit                      -- exit the REPL
/r  or /reset                     -- reset everything in the REPL
/f  or /feedback <level>          -- feedback information: off, concise, normal, verbose, default, or ?
/p  or /prompt                    -- toggle display of a prompt
/cp or /classpath <path>          -- add a path to the classpath
/h  or /history                   -- history of what you have typed
       /setstart <file>           -- read file and set as the new start-up definitions
       /savestart <file>          -- save the default start-up definitions to the file
/?  or /help                      -- this help message
       /!                         -- re-run last snippet
       /n                         -- re-run n-th snippet
       /-n                        -- re-run n-th previous snippet

Supported shortcuts include:
<tab>       -- show possible completions for the current text
Shift-<tab> -- for current method or constructor invocation, show a synopsis of the method/constructor

/lを押すと今まで宣言した変数の確認が出来ます。
/rで今まで入力した内容をリセットします。


こぼれ話ですがこんなことも出来ます…楽しいですよ!




ということで、/debugと打ち込めば、kullaのデバッグログが表示されるようになります!!



-> /debug
|  Debugging on

-> import java.util.stream.*
Compiling: import java.util.stream.*;
Kind: IMPORT -- import java.util.stream.*;

Successful compile ===
import java.util.stream.*;
Status: Active, Kind: ImportKind
Requesting redeclare printf
Compiler generating class REPL.$REPL8
Successful compile ===
package REPL;
import java.util.*;import java.io.*;import java.math.*;import java.net.*;import java.util.concurrent.*;import java.util.prefs.*;import java.util.regex.*;import java.util.stream.*;public class $REPL8 {
    public static
    void printf(String format, Object... args) { System.out.printf(format, args); }}

Status: Active, Kind: MethodKind
Redefinition of printf.



あと、宣言した変数は全て実行毎に別々のクラスのフィールドとしてstaticに宣言されているようです。


このあたりはOpen JDKのコミッターであるきつねさんに教えてもらいました!
皆さんも使う際にはフィードバックするとより良いツールになってくれると思います。





今回はJava SE 9で導入される予定のproject kullaが楽しかったので紹介として記事を書いてみました。

僕は主に写経用に使う予定ですが、
すぐに調査したい(例えばいきなり質問されてすぐ確認したい)時とか
役に立つこと間違いなしだと思ってます!

REPL文化のあるClojureだとかはハッカソンでREPLを使いながら
動くアプリケーションを作ったなんて事例も聞いたことがあります。


Javaでも受け入れられてコーディングのスタイルが広がれば、
もっと楽しくなりますね!


開発もスムーズになるはず!




1 件のコメント:

  1. Excellent ! I am truly impressed that there is so much about this subject that has been revealed and you did it so nicely.
    PHP Training in Chennai

    返信削除