皆さんは、 Java仮想マシン(以下、JVM)と聞いて何を思い浮かべますか。多くの読者は、Javaプログラムを動かすために必要な実行環境と思うことでしょう。 Javaで書いたプログラムは、JVMを利用することでプラットフォーム(WindowsやMac、Linux)が異なっていても、同じJavaプログラムを同じように動かすことができます。

 このようにJVMはJavaのためにあると思いがちですが、最近Java以外のプログラミング言語を動かす実行環境としても注目されています。それが、JavaScriptやRubyといったスクリプト言語を動かすためのJVMです。このような流れは、2008年頃から盛んになっています。例えば、NTTソフトウェアはスクリプト言語のGroovyを既存のJavaプログラムと組み合わせて、 JVMで使うシステム開発を行っています。

 スクリプト言語+JVMを注目しているのは、企業だけではありません。 Javaの言語仕様を策定している開発者もスクリプト言語をJVMで動かすニーズに注目しています。それを端的に表しているのが、2011年に登場したJava SE 7でしょう。 Java SE 7には、 JVM上でスクリプト言語を効率よく動かすための機能「InvokeDynamic」が搭載されました。このInvokeDynamicは、JVMとしては初となるJava以外の言語をサポートするための機能です。現段階では、 InvokeDynamicを利用できるスクリプト言語はありませんが、今後InvokeDynamicに対応したスクリプト言語(言語の処理系)が多く登場することでしょう。

 このように、企業だけでなくJava開発者にもJVMでスクリプト言語を動かすということが注目されているのです。本特集では、これからますます脚光を浴びそうなJVM+スクリプト言語について学んでいきます。

JVMで動かせるように変更

図1●JVMで動くように処理系が変換する
図1●JVMで動くように処理系が変換する
[画像のクリックで拡大表示]

 どうしてJVMでスクリプト言語が動くようになるのでしょうか。その答えは、スクリプト言語をコンピュータが実行できるように変換する処理系(インタプリタと呼びます)にあります。もちろんJavaScriptやRubyのプログラムをそのまま持ってきてもJVM上では動きません。一般的なスクリプト言語は、実行時にそれぞれのプラットフォームの処理系によってマシン語に変換されて実行されます(図1)。一方のJVMでスクリプト言語を実行するには、変換時にJVMで実行できるバイトコードにします。

 ここ数年でJavaScriptやRubyを実行時にJVM上で動くように変更できる処理系が登場しています。これをスクリプト言語の「Java実装」と呼びます。代表的なものには、RubyのJava実装であるJRubyや、PythonのJava実装であるJythonなどです。

 他にもJavaScriptをJVMで動かせるRhinoや、 Javaに似た文法を持つGroovy、オブジェクト指向を取り入れたScalaなど、比較的新しいスクリプト言語もあります。 JVMで動かせる主なスクリプト言語を表1に挙げました。多くのスクリプト言語がJVMを使って動かせることがわかりますね。

表1●JVMで動く主なスクリプト言語
スクリプト言語
または処理系
概要
Groovy Javaと同じ文法のスクリプト言語。オブジェクト指向を取り入れて、Javaとの親和性が高い
Jython ブジェクト指向スクリプト言語であるPythonのJava実装。JVMでPythonを動かすための処理系
JRuby RubyのJava実装。RubyプログラムをJVMで動かすためにJava書かれた実行環境。基本的には、Rubyインタプリタだが、一般的なRubyインタプリタよりは実行速度が落ちる。JRubyコンパイラはJITコンパイル方式と事前コンパイル方式をサポートしている。Ruby on Railsも動作可能
Noop 米Googleが開発したJavaに似た記法を提供するスクリプト言語。Noopのプログラムは、Javaバイトコードにコンパイルできるほか、Javaのソースコードへ変換したり、コマンドラインインタフェースが実現できるようにインタプリタとしても稼働する
Quercus PHPのJava実装。PHP5を実行できる
Rhino JavaScriptのJava実装。Java SE 6から導入されたRhinoには、JavaスクリプトAPIが含まれていて、このAPIを利用して簡単にJavaプログラムからJavaScriptのプログラムを動かせる