リスト3●Excel 2000で作成したマクロの例。
言語仕様はVisual Basic for Applications(VBA)。普通のプログラミング言語と何ら変わらない。
 最近のマクロの代表的な例が,VBAだろう(リスト3[拡大表示])。もはや以前のマクロのように,個々の特殊な文法を覚える必要はない。近代的なプログラミング言語と同じ文法を備える。VBAの場合は,Visual Basicと同じ開発環境と実行エンジンを個々のオフィス・アプリケーション向けにカスタマイズして利用するという形態を採っている。このため,マクロ言語の仕様はオフィス・アプリケーションすべてで共通で,違うのはオブジェクト・モデルだけということになっている。

エディタで手軽に作れるスクリプト

 一方スクリプトは,前述のように「テキスト・ファイルに書いた手順書(台本)」である。いわゆる「開発環境」のような大袈裟なものは不要で,手軽にエディタで書いていくものだ。ただ最近のスクリプトは機能が高くなり,ライブラリも広範にある。ツールの支援なしにスクリプトを書くのは意外に大変だ。またデバグが面倒だったりする。例えば,文法エラーがあっても実行するまでわからない。エディタは文法をチェックしてくれるわけではないからだ注3)。またスクリプトの場合,変数をいちいち宣言しなくても使えるので,スペルミスに気づかないことも少なくない。さらに最近のオブジェクト指向言語のIDE(統合開発環境)では,クラスで定義してあるメソッド名やメンバ変数の名前を自動的に表示する「Intellisense」や「CodeInsight」と呼ばれる技術が盛り込まれている。こういった環境に慣れてしまうと,かえってスクリプトを書く方が面倒なこともあるだろう。

図4●Zend Studio。
PHP(HyperText PreProcessor)の開発環境。スクリプト言語でもこういった開発環境を使えるものがある

 そこで最近では,スクリプト言語用の開発環境も登場してきている。特にWebアプリケーション開発にスクリプトを使うことが多く,その開発期間短縮のために適切な開発環境が求められている。イスラエルZend社が開発した「Zend Studio」はその一例だ(図4[拡大表示])。Zend StudioはPHP(HyperText PreProcessor)というスクリプト言語に対応している。また,Microsoft社の「Visual InterDev」は,ASP(Active Server Pages)用のスクリプトを開発するためのツールである。

「Webアプリケーション用のプログラムは,みんなスクリプトなんですか」
「ものによりけりだね。JavaScriptやVBSを使ってるならスクリプトだよ。だけど,Javaを使ってたらスクリプトとは限らない」
「おんなじJavaでも違うんですか」
「JavaとJavaScriptは,結構違うんだ」

 たぶん,現在パソコン・ユーザにとって一番なじみ深いプログラミング言語は,JavaScriptかVBSだろう。実際に自分で記述するかどうかはともかくとしても,Webブラウザでさまざまなサイトを閲覧していると,いつの間にかブラウザの上でプログラムが動いていたりする。たいていの場合,これはJavaScriptかVBSである。こういったスクリプト言語が登場する前に,ブラウザでプログラムを実行するプラットフォームとして考えられていたのはJavaだった。今でも一部のWebサイトではJavaを使っているところもあるが,あんまり使われていない。Javaは仮想マシンの起動に時間がかかったりして期待したほどの性能が得られなかったためだ。

 ではJavaとJavaScriptはどこが違うのだろうか。VBSとVisual Basicは,どちらもMicrosoft社が開発したものである。VBSはVBのサブセットとして定義された。ところがJavaScriptの方は,Javaの生みの親である米Sun Microsystems社が作ったものではない。米Netscape Communications社(当時)がNetscape Navigator 2.0の機能として開発した「LiveScript」がそもそもの始まりである。言語仕様はJavaに似せてはいたが,これはJavaがC++に似ているというのとそう変わらない程度のことだ。

 また,実行モデルもかなり違う。JavaScriptやVBSの場合,完全なインタプリタによる実行形態を採っている。インタプリタとは,逐次プログラムを解釈して実行するソフトのことである。いわばインタプリタは同時通訳で,その場で1文ずつ解釈して実行する(図5[拡大表示])。だから,プログラムを自動生成してその場で振る舞い方を変えることだって可能だ。これに対しJavaは,一度コンパイル作業を実施する。コンパイルは,いわば本の翻訳作業みたいなものである。したがって翻訳結果に推敲を重ねられるのと同じように,より質の高いコード生成が可能だ。同じ文章が繰り返し登場すると,一度出したものを再利用する。同時通訳だとこうはいかない。

 ただJavaの場合,コンパイルした結果は「バイト・コード」と呼ぶ仮想的に定義されたコンピュータ用のバイナリ・コードになる。そのコードを理解できる仮想的なコンピュータ(仮想マシン)で実行される。このような実行形態を中間言語コンパイラ方式と呼ぶ。

 この中間言語コンパイラ方式はJavaの専売特許ではない。古くはUCSD-Pascalや,Microsoft社製の各種BASICインタプリタなどもそうだ。そして現在その代表例がJavaとVisual Basic,および.NET Frameworkである(図6[拡大表示])。これらのうち,Javaと.NET Frameworkの場合は,明示的に「コンパイル」する作業がある。.NET Frameworkでは「MSIL」と呼ぶコードを生成する。Visual Basicの場合は,1行ずつエディタで入力していくたびに,バックグラウンドで中間言語形式に変換している注4)。

 中間言語コンパイラ方式の場合,性能は中間言語そのものの出来とそれを実行する仮想マシンの出来に左右される。Javaのバイト・コードは,スタック型のアーキテクチャを採用している。スタック型とは,すべてのデータのやり取りをスタックを介して実行するアーキテクチャである。スタック型のCPUは,現在存在しない。というのも多くのコンピュータで採用されているレジスタ型のアーキテクチャに比べ,性能が出しにくいからだ。

図5●インタプリタは効率が悪い。
インタプリタは逐次入ってきたものを解釈して実行する。このため,一度翻訳したものであっても何度も繰り返して翻訳することになる。一方コンパイラは書籍の翻訳のように,あらかじめすべて翻訳してしまうので推敲を重ねたものにできる
 
図6●Javaや.NET Frameworkの実行モデル。
かなりトリッキーで,可読性は低い。コンパイラが中間言語のバイナリ・コードを生成する。これを仮想マシンが実行する
(北郷 達郎、八木 玲子)