2000-03-08  悪魔の公開メール

手元に「JavaScriptプログラミング」(http://www.oreilly.co.jp/BOOK/jscriptp.htm)があるので,引用を交えて私の見解を少々。

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

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

動物本がこう言い切ってしまっているので,逆らえそうにありません。(^^;

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

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

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

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

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系OS のシェルスクリプトは

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

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

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