2. 前史

ワールドワイドウェブの概念と基礎技術は 1989 年から 1991 年にかけて CERN の Tim Berners-Lee [2003] によって考案された。Berners-Lee のウェブ技術は数年で高エネルギー物理学コミュニティ内に広まったものの、その外側ではあまり注目されずにいた。しかしイリノイ大学アーバナ・シャンペーン校の学部生 Marc Andreessen と同校米国立スーパーコンピューター応用研究所 (NCSA) 勤務の Eric Bina が 1992 年から 1993 年の間に Mosaic (NCSA Mosaic) を開発すると話が一変する。

Mosaic は簡単にインストールできて簡単に使える、グラフィカルユーザーインターフェースを備えたウェブクライアントだった。これは事実上「ウェブブラウザ」というソフトウェアのカテゴリを定義したソフトウェアであり、ワールドワイドウェブの概念を物理学コミュニティの外に普及させた。Mosaic は広く配布され、1994 年初頭にはブラウザの熱狂で一儲けすることを考えた人々が Mosaic をライセンスするか Mosaic に触発されたブラウザを一から作ろうと躍起になっていた。Silicon Graphics Inc. の創業者 Jim Clark はベンチャーキャピタルからの出資を獲得して Marc Andreessen と Eric Bina を雇い入れ、後に Netscape Communications Corporation となる会社を 1994 年 4 月に共同創業した。Netscape は Mosaic を置き換える世界で最も利用されるブラウザを作ることを目標に掲げた。Netscape は機能を拡張した次世代の Mosaic 風ブラウザ Netscape Navigator を一から開発し、1994 年 10 月に広く配布を開始した。1995 年初頭までに Netscape Navigator は当初の目標を達成し、Mosaic を急速に置き換えていった。

Tim Berners-Lee が考案したウェブ技術の中心にあったのは、ウェブページとして表示される文書の記述に宣言的なマークアップ言語 HTML を使うというアイデアだった。これとは対照的に、産業界ではスクリプト言語を利用してエンドユーザーからアプリケーションの操作を可能にする技術への関心が非常に高かった [Ousterhout 1997]。Microsoft Office における Visual Basic や Apple が開発した AppleScript [Cook 2007] は、複雑なデータ構造やアルゴリズム的なコンポーネントといった様々なアプリケーションで中核となる部分を実装するために作られたのではない。そうではなく、こういった言語はアプリケーションの中核にあるコンポーネントを新しい形でつなぎ合わせる手段をユーザーに提供するために存在する。Netscape がワールドワイドウェブの利用者を増大させるにつれて、スクリプティングがウェブページに統合されるかどうか、そして統合されるならどのように行われるかが重要な問題となった。

2.1 Brendan Eich が Netscape に入社

Brendan Eich1 は 1985 年にイリノイ大学アーバナ・シャンペーン校で修士号を取得し、すぐに Silicon Graphics Inc. (SGI) で働き始めた。彼は主に Unix カーネルとネットワークレイヤーに取り組んだ。1992 年に彼は SGI を離れ、ビデオメディアプロセッサを開発する潤沢な資金を持ったスタートアップ MicroUnity に入社する。両方の会社で彼はカーネルやネットワークにおけるプログラミングの仕事を補助する特殊用途の小さな言語を実装した。MicroUnity では GCC コンパイラの開発にも取り組んだ。

1995 年の初め、Brendan Eich は「ここに来てブラウザで動く Scheme2 を作ってくれ」という言葉に誘われて Netscape への入社を決める。しかし 1995 年 4 月に Eich が Netscape に加わると、彼はプロダクトマーケティングとプログラミング言語が複雑な状況にあることを発見する。Netscape は 1994 年の末に Microsoft からの安価な買収オファーを拒絶しており、今後 Microsoft の「包容・拡大・抹殺」戦略 [Wikipedia 2019] による直接的な攻撃を受けると予期していた。Bill Gates による直接の指揮の下、Microsoft は仮にクロス OS プラットフォームとしてのウェブが台頭すれば、情報利用のためのプロプライエタリなウォールガーデンを作る進行中のプロジェクト Blackbird [Anderson 2007] が価値を失うことを素早く察知した。Gates は「インターネットの大波」と題されたメモ [Gates 1995] を社内に配布し、Blackbird を Internet Explorer とサーバープロダクト一式として再始動させた。Netscape が同じマーケットを開拓しようと急いでいたまさにその時期のことである。

ウェブページ用スクリプト言語の候補には Scheme といった研究用言語、Perl, Python, Tcl といった Unix ベースの実用的言語、そして Microsoft の Visual basic といったプロプライエタリな言語が含まれていた。Brendan Eich は Scheme をブラウザで実装するのだろうと考えていた。しかし 1995 年の初頭に Sun Microsystems が未リリース3のプログラミング言語 Java のゲリラ的な広告キャンペーン [Byous 1998] を開始する。Sun と Netscape はすぐに接触し、Java を Netscape 2 に組み込むことで合意した。Netscape のミーティングで Marc Andreessen が「Netscape と Java が合わさって Windows を殺す」というスローガンをはっきりと声に出して言ったことを Eich は記憶している。Sun が Java を公開した 1995 年 5 月 23 日、Netscape はブラウザでの利用を念頭に Sun の Java 技術のライセンスを取得する意思を表明した [Netscape 1995a]。

スクリプト言語の選択について Netscape 内で素早く戦略立案が行われ、そこで Scheme, Perl, Python, Tcl, Visual Basic はビジネス的関心が低く、さらに時間やマーケットの観点からも相応しくないとして大きなハンディキャップを負った。Netscape と Sun のシニアマネージャ、特に Marc Andreesen と Sun の Bill Joy が実現可能と考えた唯一のアプローチは、Java を補完する小さな言語4の設計と実装だった。

Sun のほぼ全員、Netscape でも大半は懐疑的であり、Java より単純なスクリプト言語の必要性を疑問視した。スクリプトも Java で十分ではないか? 言語を二つ用意する方が一つで済ませるより優れる明確な理由は何か? Netscape は新しい言語を作るのに必要な専門知識を持っているのか?

一つ目の反対意見には簡単に反論できた。1995 年 4 月の Java は初心者に優しい言語ではなかったのである。メインプログラムのコードを main という名前の静的メソッドにしてパッケージ内のクラス宣言の中に入れなければならず、さらにパラメータ、返り値、変数には全て静的な型を宣言する必要があった。Visual C++ を補完する Visual Basic、あるいはネイティブコードをベースとするコンポーネントを補完する様々な Unix 言語の経験から考えて、Java だけでは「グルー」スクリプトを書くプログラマにとって十分でないことは明らかだった。

二つ目の反対意見に対しては Microsoft の製品が引き合いに出された。Microsoft はプロの Windows アプリケーション開発者に対しては Visual C++ を販売し、アマチュアあるいはパートタイムのプログラマ、デザイナー、会計士といった人々に対しては Visual Basic を販売していた。Visual Basic は経験の少ないパートタイムプログラマであっても Visual C++ で作られたコンポーネントを組み合わせたりカスタマイズしたりできるスクリプト言語という立ち位置だった。Visual Basic には「Visual Basic for Applications」と呼ばれるバージョンがあり、これを Microsoft Office アプリケーションに組み込むとアプリケーションのユーザー拡張やスクリプティングがサポートされる。

最初の二つの反対意見に反論した後、Marc Andreessen はブラウザ用スクリプト言語のコードネームとして「Mocha」を提案した。Eich によると、順当に事が進めばこの言語がいずれ「JavaScript」に改名されることが期待されていたという。Java を補助するこの言語は「見た目が Java に似ている」必要があるものの、簡単に使うことができ、Java のようなクラスベースではなくオブジェクトベースの言語になることになった。

こうしてもまだ反対意見が一つ残っている: 効率的なスクリプト言語を作り、1995 年 9 月に予定される Netscape 2 のベータ版までに開発をある程度進めるだけの専門知識を Netscape は持っているのか? Brendan Eich に課されたのは Mocha を実際に作ることでこの疑問に答えるという仕事だった。

2.2 Mocha の開発

Java の発表が差し迫る中、Brendan Eich は時間こそが重要であり、手の中にいる一羽の鳩は茂みにいるたくさんの鳩より価値があると判断した。そこで彼は最初の Mocha の実装に十日間連続で取り組み、プロトタイプを完成させた5。この作業が急がれたのは実現可能性を判断するデモの締め切りに合わせるためである。このデモでは最小限だけ実装された Mocha を Netscape 2 ブラウザのプリアルファに最小限だけ統合したものが披露された。

Eich は Mocha のプロトタイプを Silicon Graphics Indy [Netfreak 2019] という Unix ワークステーション上で開発した。このプロトタイプは手書きの字句解析器と再帰降下構文解析器を持ち、構文解析器は構文木ではなくバイトコードを生成する。バイトコードのインタープリタは単純で低速だった6

バイトコードの生成は Netscape 製のサーバー向けソフトウェア LiveWire を開発するチームから伝えられた要件だった7。LiveWire 開発チームはプロトタイプが完成する前から Mocha の組み込みに興味を持っていたのである。このチームには元 Borland のマネジメント兼エンジニアリングスタッフがいて、動的スクリプト言語を高く評価していた。ただアプリケーションの読み込みを高速にするために、ソースコードの構文木ではなくバイトコードが望まれた。

Marc Andreessen は「Mocha は非常に簡単に使えるべきで、誰でも数行のプログラムを HTML ドキュメントの中に直接書けるほど簡単であるべきだ」と強調した。Sun と Netscape の上層部は Mocha が「Java と同じ見た目をしていなければならない」という要件に繰り返し言及し、BASIC が持つような要素を明示的に排除した。しかし Java に似た見た目は Java に似た振る舞いを想起させたので、boolean, int, double, string といった「プリミティブ型」の意味論やオブジェクトモデルの設計はここから影響を受けた。

Brendan Eich は見た目を Java に似せることを除けば言語設計の詳細を自由に選択できたので、Netscape に加わった後に彼は「簡単に使える」言語や「教育的な」言語をいくつか調査した。調査された言語には例えば HyperTalk [Apple Computer 1988], Logo [Papert 1980], Self [Ungar and Smith 1987] がある。Mocha を「オブジェクトベース」の言語とすることに皆が同意した。ただしクラスのサポートは時間がかかりすぎると思われた上に Java と競合するリスクもあったため、Mocha はクラスを持たないことになった。Eich は Self を気に入っていたので、単一のプロトタイプリンクによる委譲を使った動的オブジェクトモデルから実装を始めた。こうすれば実装の時間も節約できるだろうと彼は考えていたが、最終的には時間が足りず Mocha のプロトタイプでこのメカニズムが公開されることはなかった。

オブジェクトはコンストラクタ関数new 演算子を適用することで作成される。デフォルトのオブジェクトを作成するコンストラクタ関数は Object と呼ばれ、他のビルトインオブジェクトと共に最初から環境へ組み込まれる。各オブジェクトはゼロ個以上のプロパティから構成される。各プロパティは名前 (別名プロパティキー) と値を持ち、プロパティの値は組み込みデータ型の値、オブジェクト、関数のいずれかである。プロパティは未使用のプロパティキーに値を代入することで作成され、プロパティに可視性の規則や代入の制限は存在しない。コンストラクタ関数はプロパティの初期値を設定でき、作成したオブジェクトに後からプロパティを追加することもできる。この非常に動的なアプローチは LiveWire チームに特に好評だった。

Scheme の誘惑は無くなっていたものの、Brendan Eich は依然として Lisp 風なファーストクラスの関数に魅力を感じていた。Mocha にはメソッドを格納するためのクラスが存在しないので、ファーストクラスの関数が Scheme から影響を受けた様々なイディオムを実装するためのツールとなった: 例えばトップレベルプロシージャ、関数の引数に対する関数の受け渡し、オブジェクトのメソッド、イベントハンドラはファーストクラスの関数によって可能になる。時間の制約により関数式 (別名ラムダ式あるいは単にラムダ) は延期になったものの、そのためのキーワードが文法で予約された。イベントハンドラとオブジェクトのメソッドは Java (元をたどれば C++) から借用した this キーワードによって統合された。任意の関数において this はその関数をメソッドとして呼び出したオブジェクトを表し、文脈によって値を変える。

Marc Andreessen および数人の Netscape エンジニアとの非公式な議論8に刺激され、Mocha のプロトタイプは eval 関数をサポートした。この関数はプログラムを表す文字列を受け取り、それをパースして実行する。eval を使って動的に文字列をプログラムとして解釈するプログラミング技法はウェブブラウザおよびサーバー上のアプリケーションの一部で重要になるだろうと直感的に思われた9。しかし、この機能をサポートする判断の影響はすぐに明らかになった。一部の処理では Java 風の toString メソッドを通して関数のソースコードを文字列として提供しなければならない。Eich は 10 日間のスプリント10でバイトコードのデコンパイラを実装することを選択した。ソースコードを主記憶装置に記録したり補助記憶装置から読み直したりするのは、ターゲットとされたアーキテクチャの一部でコストが大きすぎるように思えたためである。この問題は 16 ビットのセグメントを利用する Intel 8086 のメモリモデルの制約を受ける Windows 3.1 搭載のパソコンで特に顕著で、インメモリの巨大な (あるいはサイズに上限のない) 構造体に対応する複数セグメントにまたがるメモリ領域を手動で管理しなければならなかった。

Eich が Mocha のプロトタイプを開発した 10 日間の最終日に、Netscape エンジニアリングスタッフ全員が出席するミーティングでプロトタイプのデモが行われた (図 2)。デモは成功し、9 月に予定されていた Netscape 2 の最初のベータリリースでより洗練されたバージョンを完全に統合された形で公開できるだろうという過度な楽観視につながった。この年の夏に Brendan Eich が第一に焦点を当てたのは Mocha をブラウザに統合する作業だった。このためには Mocha のプログラムがウェブページと対話するための API を設計、実装しなければならない。同時に彼は Mocha のプロトタイプ実装を出荷できるクオリティのソフトウェアに磨き上げ、Netscape 内部の初期ユーザーからのバグ報告、変更の提案、機能のリクエストに対応しなければならなかった。

Mocha Console
図 2. Mocha コンソール。Brendan Eich が行った最初のデモでは、SGI Unix ワークステーションで動作するプリアルファバージョンの Netscape 2 上で実行される「Mocha コンソール」が披露された。同じ Mocha コンソールは名前だけが変更され、他の部分は本質的にそのまま Netscape 2 のプロダクションリリースの一部として出荷された。この画像は Windows 95 上で実行される Netscape 2.02 である。Mocha コンソールは mocha: とブラウザのアドレスバーに入力することで起動される ── 出荷された Netscape 2 では javascript: に変更されたものの、mocha: も動作した。コンソールを起動すると上下に二つのフレームを持ったページがブラウザで開かれる。下のフレームに Mocha の式を入力すると、上のフレームのコンテキストで評価が行われる。この例では計算された式の値を含むポップアップを組み込みの alert 関数を使って表示させている。オリジナルのデモでは「JavaScript Alert」ではなく「Mocha Alert」と表示されたはずである。

Mocha を作った十日間のさらに詳細な話は Brendan Eich が過去に何度か語っている [Eich 2008c, Eich 2011d; JavaScript Jabber 2014, Walker 2018]。製品バージョンの Mocha のソースコードは Internet Archive から入手できる [Netscape 1997b]。Jamie Zawinski が記した the netscape dorm [Zawinski 1999] には、この時期にソフトウェア開発者として Netscape で働いた経験が記されている。


  1. 書籍 Coders At Work [Seibel 2009, 第 4 章] に Eich の若いころの経歴が詳しく載っている。 ↩︎

  2. プログラミング言語 Scheme [Sussman and Steele Jr 1975] のこと。 ↩︎

  3. Java のアルファリリースは 1995 年の 3 月と 4 月に目立たない形で行われた。 ↩︎

  4. 「小さな言語 (little language)」は Jon Bentley [1986] が考案したフレーズで、「特定の問題領域に特殊化された、通常の言語が持つ機能の多くを持たない」すぐに学べる小規模な言語を指す。 ↩︎

  5. 正確な日付の記録は残っていないが、Brendan Eich は 5 月 6 日から 15 日だと記憶している。 ↩︎

  6. 異なる種類のデータ値を表すのに巨大な判別可能 union を、メモリ管理に参照カウントを使っていた。 ↩︎

  7. Brendan Eich は Netscape での最初の数か月を公式にはサーバーグループで過ごした。 ↩︎

  8. この議論には John Giannandrea が参加していた。彼は General Magic という会社で働いことがあり、この会社ではクライアントとサーバーの両方で利用できるプログラミング言語が二つ開発されていた。 ↩︎

  9. 例えば部分評価の一種が可能になったり、クライアントが提供したコードをサーバーで実行できるようになったりする。これは Telescript エージェント [General Magic 1995] と似た機能である。 ↩︎

  10. 1995 年の開発者は「スプリント」という表現を使わないだろう。しかし Eich が注いだ労力を表すのには適した単語である。 ↩︎

関連書籍 (Amazon アソシエイト)
プロを目指す人のためのTypeScript入門 安全なコードの書き方から高度な型の使い方まで
JavaScript Primer 迷わないための入門書
JavaScript 第7版
「ものづくり」の科学史 世界を変えた《標準革命》