The Dragon Scroll

Be just and fear not.

Javaの新しい局面-JavaSE6。

先日、JavaSE6(Mustang)に関するセミナーに参加してきました。
講師は、横河電機の櫻庭祐一氏。
正直言って、まだSE5(Tiger)も全然追いきれていないのですが、
もうSE6(2006/12/11 リリース)です。

SE6のコードネームMustangは野生馬という意味だそうで。
どんな暴れっぷりか、リリースされた機能を俯瞰してみましょう↓。
http://java.sun.com/javase/ja/6/webnotes/features.html


なんか、全体的に小粒な印象を受けるのですが。
Javaの登場から、約11年。進化を遂げてきた今、劇的な機能拡張というのは
少なくなってきているようです。
しかし、たった11年しか経ってないのですね。
C言語は、1973年(Dennis M. Ritchie氏)誕生したわけですから、33年。
C++は、その10年後の1983年(Bjarne Stroustrup氏)です。23年。
(ちなみに、Rubyは、1993年(Matz氏)生誕)
Javaの歴史はまだまだこれからですね。C言語のように長く後世に伝わる言語で
あって欲しいものです。
(その割には既に、Java専用雑誌が消滅していたりするんだよな…)


SE6における劇的な機能拡張といえば、Scripting for the Java Platformでしょう。
Javaスクリプト言語を扱う、またはその逆で、スクリプト言語Javaのクラスを使う。
いまいち用途が不明な部分もあるのですが、それは後述するとして。
セミナーで紹介されていた新機能のうち、個人的に関心をもったものをいくつか
紹介したいと思います。

OutOfMemoryErrorのハンドリング

いままでハンドリングできていなかったんですよね。
SE6から、OutOfMemoryError発生時のスタックトレースを表示してくれるように
なります。これは、SE6以前のJDKコンパイルされたクラスファイルでもOKだと
いうことです。SE6に乗り換えるだけで、この恩恵を得られるわけですね。
まあ、きちんとプログラムを組める人には、あっそう、みたいなところがありますが
私みたいに、頭のヒープ領域に自信がないモノにとっては、必須の機能です。

on Demand Attach

実行中のアプリケーションにデバッガをアタッチする機能。
具体的には、jconsoleでJava VMにアタッチできます。
というわけですが、恥ずかしながらjconsoleの存在すら知らなかった。
jconsoleを使うことで、CPU使用率やヒープメモリの使用率などをグラフで見ることができる。
これは、SE5から導入された管理ツールなんですね(SE6で正式サポート)。
では、SE5との違いは何か。
システムの起動時に-Dcom.sun.management.jmxremoteというオプションが必要だったのが
SE6では不要になったということです。
確かに、このオプションの存在に関係なく、あとから、アタッチできるというのは
中々便利。再起動が不要ですものね。


この機能を実現しているAPIがAttachAPIというもの。
エージェントを送り込んで、起動中のVMの情報を見ることができます。
つまり、これを使えば、がんがんにハックできる。
というわけではなく、同一マシン、同一ユーザに限って、エージェントをロード
することができるようです。
参考:http://itpro.nikkeibp.co.jp/article/COLUMN/20061208/256374/

Compiler API

プログラムを実行中に、ソースをコンパイルすることができるAPI
ClassLoaderを使えば、実行中にモジュールも追加できる。
これはスゴイ。
実際の案件の中で、使う機会はまず無さそうですが、
「プログラムがプログラムを作り、それを動的に使用する。」
というのに、とても夢を感じます。
まあ、それだけなんですが。

Scripting for the Java

Mustangの本命といえば、コレになるのではないでしょうか。
Javaの新しい局面を開いたようにおもいます。
スクリプトエンジンを開発するプロジェクトを見ると、JavaScriptだけでなく
RubyやPytonと言った言語も見られます。
Perlはないようですね。
http://scripting.dev.java.net/


この機能の良いところは、とても手軽なところ。
まず、ScriptEngineManagerを生成する。
ScriptEngineManager manager = new ScriptEngineManager();
次に、ScriptEngineをマネージャで生成する。
ScriptEngine engine = manager.getEngineByName("js");
あとは、文字列でスクリプトを書くなり、Readerで読み込むなり。
String script = "print('This is ScriptLanguage !');";
engine.eval(script);


後は、使い道です。
有効な用途はなんでしょうね。意外にもぱっと思いつかないのですが。
私は、せいぜいスクリプトファイルをJava読み込ませ、設定系の内容を
外部のスクリプトに持たせるくらいしか思いつきませんでした。


悩んでいると、今は亡きJavaWorldの2006年11月号に、スクリプト言語
活用方法について記載されていたことを思い出しました。
スクリプトの活用にもいくつかのデザインパターンがあります。
そのうちの一つにOuterjellyPatternという、アプリケーション本体に
スクリプト言語を使用するのではなく、支援的に用いるパターンが
あります。上記の設定系の外だし、テストケースの外だしは、
このパターンにあたります。


Scripting for the Javaの機能によって、スクリプトを扱う土台は
できました。これからは、それをどのように利用するかを考える
段階です。ここで、注意しなければならないののは、無理やりJava
スクリプト言語を結びつけてしまうことだと思います。
できることと、やっても良いことは別だと考えていて、スクリプト
無理やり駆使するのであれば、最初からスクリプト言語で開発を
すれば良い話です。
スクリプト言語の持つ最大の利点である、「お手軽さ」の
恩恵にあずかれるよう、on Javaでも、難しく考えずに、とりあえず
手軽に、支援的に使えばいいじゃないかと思っています。
よりCoolな使い道は、使っているうちに思いつくかもしれませんしね。