2000-03-08  JavaScript は本当にスクリプトなのか

某Kさんの話によると,JavaScriptのことをプログラム言語だと解説しているウェブページがあるらしい。私にしてみれば,JavaScriptがスクリプト言語だろうかプログラム言語だろうが,そんなことはどうでもいいことです。まあでも,よい機会なので私なりに調べてみました。手元に「JavaScriptプログラミング」があるので,引用を交えて私の見解を述べたいと思います。

<p.1,「第1章 JavaScriptの概要」より>

JavaScriptは,基本的なオブジェクト指向機能を備えたインタプリタ型の軽量なプログラミング言語です。

かの動物本がこう言い切ってしまっているので,JavaScriptはプログラム言語だと言っても間違いではなさそうです。

<p.5,「1.2.2 JavaScriptは簡単か」より>

JavaScriptは「プログラム言語」ではなく,「スクリプト言語」だと言われています。スクリプト言語のほうがプログラム言語よりも簡単であるという前提に立って,専門的なプログラマでなくても簡単に使えるプログラム言語であるという意味で,このような言い方がされるようです。

プログラム言語とスクリプト言語の境界線はかなり曖昧だと思います。私の感覚では,「スクリプト」というのはインタプリタの専売特許みたいなもので,コンパイラ型言語のことを「スクリプト」とは言わない気がします。

しかし,実際に使ってみると,それほど簡単ではないことに気づくはずです。例えば,引数としてオブジェクトを関数に渡す場合,「値による(by value)」方法と「参照による(by reference)」方法があるので,両者の違いを理解しておく必要があります。

JavaScriptでは,プリミティブ型は値渡しでオブジェクト型は参照渡しです。このあたりから,「JavaScriptは,スクリプトにしては真っ当な言語仕様を備えた処理系」ということになるんでしょう。

さて,「スクリプト」と「プログラム」の起源ですが‥‥,私もよく分かりません。ただUNIXのシェルスクリプトから派生した言語とAlgol系言語とでは,文法や変数の型に関する扱いがかなり違います。例えば,「スクリプト」と呼ばれるものは,実行時動的に(行き当たりばったりで)型を決定するものが多いです。Perlの場合,数値と文字列の区別がありません。

いま気づいたことですが,JavaScriptは「スクリプト言語」と「プログラム言語」の二面性を併せ持った処理系です。決定的なのがforキーワードの用法です。JavaScriptのfor文には二つの使い方があります。

一つはC,C++, Javaと全く同じfor文です。これは説明するまでもないでしょう。

for (初期化コード ; 式 ; 更新コード)
    文

もう一つのfor文は,

for (変数 in オブジェクト)
    文

です。これは,「変数」に「オブジェクト」の属性名(変数名)の列挙を順番にセットし,「文」を評価するというものです。Javaの

for (Enumeration e = vector.keys(); e.hasMoreElements();)
    Object o = e.nextElement();

と似たようなものです。

JavaScriptのfor(... in ...)という表現は,たぶん(どころじゃなくて確実に)シェルスクリプトのfor文が起源です。例えばshのシェルスクリプトのfor文は

for filename in *.txt ; do
    cat $filename ;
done

こんな感じです。これと同じ動作をするDOSのシェルスクリプト(MS-DOSコマンド)は

for %I in (*.txt) do type %I

こんな感じだったハズです。

他にもJavaScriptでは,バージョン1.2から正規表現がサポートされました。どうもこのあたりの性格からすると,「やっぱりスクリプトかな」という気がします。