連載
» 2006年08月18日 00時00分 公開

小山博史のJavaを楽しむ(1):JavaとJavaScriptの親しい関係

教育界、技術者コミュニティでJava言語の教育と啓蒙に長年携わってきた 筆者が、独自の視点からJavaの面白さを掘り下げていく。(編集局)

[小山博史,ガリレオ]

注目を浴びるJavaScript

 JavaScriptが世に広まって10年近くたちますが、最近話題に上ることが多くなってきています。なぜ、いまさらJavaScriptが注目を浴びているのでしょうか?

 JavaScriptはECMA(ヨーロッパ電子計算機工業会)によって、ECMAScriptとして標準化されていて、Standard ECMA-262 ECMAScript Language Specification 3rd edition (December 1999)や、Standard ECMA-357 ECMAScript for XML (E4X) Specificationといった仕様が公開されています。これらの仕様を見て分かるように、JavaScriptはオブジェクトベース(プロトタイプベースともいわれることもあるようです)のオブジェクト指向言語です。

 JavaScriptは、世間ではスクリプト言語としての手軽さの方ばかりが注目されていて、オブジェクト指向言語としての魅力について語られることは多くありませんでしたが、筆者は以前からプログラミング教育の視点からJavaScriptがオブジェクト指向言語である点に注目をしていました。プログラミング初心者がオブジェクト指向プログラミングを学習し始めるきっかけにJavaScriptが良いと、ずっと思っていたのです。なぜなら、Webブラウザに実行環境が搭載されているJavaScriptを使えば、パソコンを購入すれば必ず付いていて、開発環境や実行環境をわざわざ用意しなくても、手軽にプログラミングができるからです。しかし、なかなかJavaScriptはオブジェクト指向言語として扱われる時代は来ませんでした。

 そんな中、AJAX(Asynchronous JavaScript + XML)の登場によって状況は変わりました。AJAXの出現により、オブジェクト指向言語として設計されているJavaScriptの特長を利用した実用性の高いライブラリが開発され、使われるようになってきたのです。例えば、有名なライブラリとしては、Ruby on Railsで採用されているprototype.jsといったものがあります。このライブラリでは、JavaScriptのオブジェクト指向言語機能を利用しています。ライブラリに含まれるbase.jsを見ると、Objectという基本的なオブジェクトは拡張されていて、extendメソッドとinspectメソッドが追加されていたりします。HTML文書ファイルへ埋め込むスクリプトという視点で開発されたJavaScriptプログラムでは、このようなライブラリは用意されることはありませんでした。

 これからは、オブジェクト指向言語としてとらえたうえで開発をしたり、ライブラリを使用する機会が増えてきます。以前からJavaScriptをオブジェクト指向言語として認識していたので「やっと実用的なオブジェクト指向言語として使うための条件が整った。やはりライブラリは重要だ」と思いましたが、スクリプト言語としてしか見ていなかった開発者にとっては驚きだったはずです。いずれにせよ、JavaScriptはオブジェクト指向言語として注目を浴びているのです。

 ここでJavaとJavaScriptの関係を思い返してみましょう。最初に名前についてですが、JavaScriptが開発された当初はLiveScriptという名前でした。1995年のJava発表の影響を受けてJavaScriptという名前になったといわれています。しかし、インターネットが普及し始めて、ネットサーフィンという言葉がよく使われていたころ、Netscape Navigator、Internet Explorerといったブラウザで動作するようになってからは、Javaよりも有名になってしまいました。HTML文書ファイルへ組み込むことができるJavaScriptの方が普及してしまったのです。

 こういった経緯のためか、コンピュータに関係する仕事をしている人でも「JavaはJavaScriptの略」と勘違いすることが多く、当時は「JavaはJavaScriptとは違います」といったものです。しかし、Java誕生10周年を過ぎたいまでは、WebプログラミングにおいてのJavaの人気は非常に高く、普及していますから、プログラミングを知っている人であれば、わざわざ「JavaとJavaScriptとは違います」という必要もなくなりました。

 次に連携方法についてです。Javaは発表当時アプレットの方が注目されていたため、JavaアプレットとJavaScriptを連携するためのLiveConnectという技術への期待も非常に高かったことを覚えています。残念なことに、いまやサーバサイドWebアプリケーションの方が一般的となっているため、この技術はあまり話題にならなくなってしまいました。

 サーバサイドWebアプリケーションにおいては、JavaScriptはブラウザ互換性の問題があったり、携帯電話用ブラウザでのサポートが十分されていなかったことなどにより、Java開発者からは敬遠されがちな存在となっていました。そのため、ターゲットブラウザが限定されていない場合には、あまりJavaScriptを使わないで、サーブレット側で対処するという傾向がありました。このようにJava開発者にとってJavaScriptは名前にJavaを使っているものの、Javaとは直接関係がありませんでした。しかし、この状況はJavaの次期バージョンであるMustang(Java SE 6)からは変わりそうです。Mustangのscripting frameworkで動作するスクリプトとしてJavaScriptが同梱されることになったのです。同梱されるとなると、従来とはJavaScriptの位置付けが変わってきますので、この意味からも話題となっているのです。

JavaScriptインタプリタ Rhino

 それでは、Javaで実装されたJavaScriptインタプリタとして有名なRhinoを使ってオブジェクト指向言語JavaScriptの世界をちょっとのぞいてみましょう。Rhinoの使い方は簡単で、Rhinoのダウンロードページからrhino1_6R2.zipをダウンロードした後に展開してから、次のようにjs.jarを使ってjavaコマンドでインタプリタを起動します。するとJavaScriptプログラムを対話的に実行することができるようになります。help()と入力すると使えるコマンドが表示されるので、見ておきましょう。終了をするにはquit()を使います。

> java -jar js.jar
js> var a = 1 + 1;
js> print a;
js> print(a)
2
js> 
js> help()
(略) 
js> quit()

 最初に、JavaScriptで時刻の操作をしてみましょう。Dateオブジェクトを new 演算子を使って生成し、そのオブジェクトのgetHoursメソッドを使って時間をhourへ、getMinutesメソッドを使って分をminuteへ、その後printコマンドでhourと":"とminuteとを連結した結果を表示しています。printコマンドを使っている部分はオブジェクト指向プログラムらしくありませんが、ほかの処理はJavaとほとんど変わりありません。

js> var now = new Date();
js> var hour = now.getHours();
js> var minute = now.getMinutes();
js> print(hour+":"+minute);
1:53
js>

 次に、JavaScriptでユーザー定義オブジェクトの宣言をしてみましょう。Javaのようにクラス単位でプログラムを作成するわけではないので、コンストラクタの定義がちょっと変わっています。JavaScriptではfunctionキーワードでオブジェクトのコンストラクタを定義します。次の例では、点を表すPointオブジェクトのコンストラクタを用意して、new演算子で原点を表すPointオブジェクトの生成をしています。

js> function Point(_x, _y) { this.x=_x; 
this.y=_y; }
js> var point = new Point(0,0);
js> print(point.x + "," + point.y);
0,0
 
js>

 オブジェクトpointへxの値を1増加させるaddXメソッドを追加するには次のように最初にメソッドの処理をfunctionとして宣言しておき、それをオブジェクトpointのaddXメソッドとして登録します。ちなみに、コンストラクタでメソッドを登録することもできます。また、ここでは紹介しませんがprototypeを使って継承をすることができます。オブジェクト指向といってもJavaScriptはクラスベースのJavaとはかなり違っています。

js> function addX() { this.x++; }
js> point.addX=addX;
 
function addX() {
    this.x++;
}
 
js> point.addX();
js> print(point.x+","+point.y);
1,0

 どうでしょう、詳しい文法については解説しませんでしたが、ちょっとだけでも雰囲気が分かったでしょうか。これまでHTMLを補助するものとしてJavaScriptを見ていた人も多いかもしれませんが、オブジェクトベースのオブジェクト指向言語という視点でJavaScriptを使ってみると、Javaのようなクラスベースのオブジェクト指向言語とは違ったテクニックに出合うことができるはずです。意外に面白くてプログラミングの幅が広がります。

JavaとRhinoのおいしい関係

 ところで、RhinoではJavaのパッケージをインポートして利用するということもできてしまいます。これを使ってJavaのプログラムを対話的に実行することができます。また、JavaプログラムからRhinoを呼び出すこともできるので、JavaScript実行環境を独自アプリケーションへ追加することもできます。例えば、java.lang.SystemクラスのgetPropertyメソッドを使ったり、Swingを使って対話的に画面を表示する場合は、Rhinoを起動してから、次のようにします。

js> importPackage(java.lang)
js> print(System.getProperty("user.dir"))
/home/koyama/rhino1_6R2
js> importPackage(java.awt, java.awt.event, Packages.javax.swing)
js> f = new JFrame("Rhino");
javax.swing.JFrame[frame0,0,64,0x0,invalid,hidden,
layout=java.awt.BorderLayout,t
(略)
Size=],rootPaneCheckingEnabled=true]
js> f.setBounds(100,100,300,150);
js> f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
js> f.setVisible(true);

 Rhinoの情報は「Rhino: JavaScript for Java」や、この日本語版の「Rhino: Java による JavaScript」などにたくさん紹介されています。充実していますからぜひアクセスしてみてください。

 さて、Rhinoを使うとJavaとJavaScriptの連携が簡単にできることは分かりましたが、これだけではありません。Javaの次期バージョンであるMustang(Java SE 6)にはJSR 223: Scripting for the JavaTM Platformのサブセットであるscripting frameworkが含まれることになっています。実は、このフレームワーク上で動作するJavaScriptの実行用プログラムとしてRhinoが同梱されます。ただし、scripting frameworkのAPIパッケージであるjavax.scriptは特定スクリプト言語のためのものではないため、scriptingプロジェクトを見ても分かるように、さまざまなプログラミング言語が使えることになりそうです。例えば、AWK(jawk)、Python(Jython)、Ruby(JRuby)などが一覧に含まれています。MustangではJava Compiler API(JSR 199: JavaTM Compiler API)を使用することにより、ソースコードのコンパイルを簡単に行えるようになりますから、Javaそのものも一覧に含まれています。このように仕様上ではJavaのスクリプトは決まったものがあるというわけではありませんが、Mustangに同梱されるものを利用する機会が一番多くなりそうです。そういう意味で、JavaとJavaScriptは従来よりもぐっと近い関係になるといえるでしょう。しかし、「JavaのスクリプトといったらJavaScript」といえるほどになるかどうかは、まだ分かりません。Groovy、Python、Rubyはどれも人気がありますから、scripting frameworkでこれらが使われる開発事例の方が多くなるかもしれません。

 いずれにせよ、Mustangがリリースされると、scripting frameworkを使っていままでよりも簡単にプログラムのカスタマイズが可能になります。例えば、従来は初期設定のためにはPropertiesファイルやXMLファイルを使っていましたが、JavaScriptファイルを使うこともできるようになります。ちょっとした拡張機能を実現するのに、JavaScriptプログラムをプラグインとして登録できるようにもなります。ただし、良いことばかりではありません。WebブラウザではJavaScriptに起因するセキュリティホールがたくさん発見されてきています。JavaScriptプログラムを無条件で使えるような実装をしてしまわないように注意する必要があるでしょう。それにしても、JavaScriptがJavaを補う形で利用できるようになるのは、やはりうれしいものです。Mustangのリリースがいまから楽しみですね。

筆者プロフィール

小山博史(こやま ひろし)

Webシステムの運用と開発、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。Ja-Jakartaプロジェクト(http://www.jajakarta.org/)へ参加し、コミッタの一員として活動を支えている。また、長野県の地域コミュニティである、SSS(G)(http://www.sssg.org/)やbugs(J)(http://www.bugs.jp/)の活動へも参加している。



Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。