BCPL の話、完全に趣味の領域に入っています。
当初の疑問は解けたのですが、気になった部分の追跡調査。
前回調査で、僕は BCPL の Alto 版マニュアルが 1979年だったのを見て、一部の記号の定義などが Smalltalk の影響下にある、と考えました。
でも、むしろ Smalltalk が BCPL の影響下なのではないか、という指摘を受けました。
なるほど、そういえば、アラン・ケイは Smalltalk を BCPL に変換するプログラムを書いたことがある、と言っていました。
Smalltalk と BCPL は、どちらが先かは不明ながら、深い関係があるのでしょう。
Smalltalk の最初のバージョンは NOVA で作られ、その後 Alto に移植されています。
NOVA 版の BCPL があったのであれば、Smalltalk が影響を受けている、ということもあり得そう。
まず、NOVA について書いておきましょうか。
NOVA を作った Data General 社は、1969年創業。
「世界初のミニコン」と呼ばれる、DEC PDP-8 の開発責任者が興した会社です。
PDP-8 は、当時としては驚くほど廉価なマシンでしたが、安くするために 12bit を処理単位としていました。
このため、処理速度は遅く、搭載できるメモリ量にも厳しい制限が出ます。
Data General は、PDP-8 を 16bit にしたようなコンピューターを作る、という目的をもって設立されています。
NOVA は創業したその年のうちに発売。
PDP-8 のように安く、16bit でよりパワフルだったために、結構普及したようです。
ただ、会社としての開発力は DEC のほうが上。NOVA が売れた、とはいっても、PDP-8 のほうがやっぱり強い。
その上、NOVA は PDP-8 のライバルにすぎず、PDP-11 が主流になると Data General 社は苦戦します。
(もちろん、NOVA に変わる別のマシンなどを発売してはいるのですが)
つまるところ、NOVA は一時期普及したマシンではあるものの、今から見るとマイナー機種の一つです。
Xerox では、NOVA を発売直後に購入し、研究に使っていたようです。
影響関係を知りたいのですから、BCPL と Smalltalk のどちらが先に作られたのか、が重要です。
まずは Smalltalk の一番古いバージョンがいつ作られたのかを確認しておきましょう。
Smalltalk の最初のバージョンは、1973 年に、NOVA の上で作られています。
さらにその前に、BASIC で書かれた簡単なプロトタイプもあり、1972年10月に動作しています。
Alto が完成したのは 1973年の春だそうですが、Smalltalk はその年のうちには移植されています。
このバージョンは、Smalltalk-72 と呼ばれています。
#研究プロジェクトだったため、2年ごとに成果をまとめなくてはなりませんでした。
Smalltalk は、 72 74 76 78 80 が存在します。
Smalltalk-72 エミュレータで遊んだ話を書いている方がいました。
後の Smalltalk のような統合環境ではなく、まだ「言語」にすぎませんが、その言語仕様は後のものと大きくは変わらないようです。
ブロックの指定には [ ] が使われています。
#翌日訂正:
うわ、自分の目が節穴でした。[ ] じゃなくて、( ) を使ってますね…
上のページでリンクされていた 72 のマニュアルはリンク切れなのですが、1976年に書かれたSmalltalk-72マニュアルを発見しました。
この中でも、ブロックの指定は ( ) で書いています。
これ以降、Smalltalk は [ ] 、で話が進みますが、結論としてはあまりこの違いは重要ではないので、「間違えてやがる」と笑いながら読み進んでください。
つづいて、BCPL の移植時期を調べます。
前回、Alto への BCPL 移植は 1979 年…と考えていたのですが、1973年の Alto 版 BCPL マニュアルを見つけました。
いろいろ違いはありますが、基本的には 1979年のものと変わりません。
ずっと後の1983年に書かれた文書ですが、9ページ目に BCPL という項目があり、「Alto で最初に動作した高級言語は BCPL だった」となっています。
というわけで、Alto 上では、Smalltalk に先駆けて BCPL が動作していたことは間違いありません。
しかし、先に書いたように Smalltalk は先に NOVA で作られています。
BCPL も、Alto 版は NOVA から移植された、とわかっています。
ということで、NOVA では、どちらの言語が先に作られたのかが焦点となります。
ただ、その前に解決しなくてはならない問題が一つ。
NOVA への BCPL 移植、BCPL 作者のマーティン・リチャーズが行ったのは、1978年なんですよね…
なんで 1973 年に NOVA から Alto へ移植されているんだ?
探していたら、思わぬところに情報がありました。
なんと、Smalltalk をつくった中心の2人…アラン・ケイと、ダン・インガルスが、Squeak 開発者の掲示板で思い出を語っているのを見つけたのです。
まず、ケイの証言から、一部を抜粋します。
「NOVA の発売から2年間、NOVA には高級言語がなく、プログラムが作りにくい状況が続いていました。
そのため、PARC のジム・カリーが BCPL を移植しました。
最初は、アセンブラで BCPL のバイトコードインタプリタを作り、ゆっくりと BCPL で書かれたプログラムが動き始めます。
その後、機械語コードを生成するバックエンドが BCPL で書かれ、効率よく動くようになりました」
後で書きますが、NOVA の発売は 1969年です。
それから2年なので、移植は 1971年ごろですね… Smalltalk よりも先に開発されていることが裏付けられました。
「BCPL は Alto でもいくつかのソフトを作るのに使われた。
Smalltalk か Lisp で書かれなかったソフトは、すべて BCPL だろう」
つまり、この3つですべてのソフトが作られた、と。
BCPL は非常に低レベルな(アセンブラで書くような)プログラムを作れたので、Alto にアセンブラはなかった、という意味合いかと思います。
もう一つ、ダン・インガルスの証言する、Smalltalk のプログラムを BCPL に変換するプログラムの証言です。
「テッド・ケーラー、グレン・クラスナーと共に、Smalltalk から BCPL への変換器を作りました。
これは、Dorado Smalltalk に搭載することができました。」
Dorado は、Alto の後継に当たる機械で、Dorado Smalltalk は 1978年に作られています。
「テッドは当初、機械語を生成するコンパイラを作っていた。
しかし、BCPL なら Xerox のすべてのハードウェアで使えるので、BCPL を生成するように変更した。
この変更は1日で完了したが、書き出されるのは完全な BCPL ではなく、80% 程度の品質だった。
テッドとグレンは、それを元に手で完全な BCPL プログラムを完成させた」
ここまでで、Xerox 内での開発経緯がわかりました。
時系列でまとめておきましょう。
・NOVA BCPL(1971)
・NOVA Smalltalk (1972)
・Alto BCPL(1973)
・Alto Smalltalk(1973)
・Smalltalk to BCPL translater(1978)
前回僕は、Alto 版 BCPL の { } が [ ] に変わったのは、Smalltalk の影響だろう、と書きました。
しかし、この開発経緯を見る限り、Smalltalk の影響で BCPL が改変された、ということはなさそうです。
ここでもう一つの疑問。
BCPL が TX-2 - NOVA - Alto と移植されるうちに { } が [ ] に変わったのはなぜでしょう?
また、どこの段階で変わったのでしょう?
ここで、NOVA に接続されていた端末は、そもそも { }が使えたのだろうか、という疑問が出ます。
しかし、調べてみても、NOVA に使われた標準端末がわかりません。
NOVA の元となった、PDP-8 では、Teletype 社の ASR33 が標準的に使われていました。
まずは、NOVA も、おそらくこれを使っていたのではないかと推察。
1977年になって、Dasher 端末という、CRT を備えた純正端末が発売されます。
詳細不明なのですが、マニュアルは 1977年に発行されていて、タイトルが Dasher display terminals models 6052, 6053 operator's manual であることはわかりました。
ここで、6052 は D1 、6053 は D2 と呼ばれる端末です。
海外のキーボードマニアの集まる掲示板に、Dasherレイアウトが示されていました。
D1 は非アスキー、D2 はアスキーキーボードであることがわかります。
D1 の配置と、先に書いた ASR33 のキーボードを比べると、特殊キーの配置まで含めてほぼ同じであることがわかります。
おそらくは、D1 は今まで使い続けてきたユーザーのための、キーボード配列の互換性を保った商品。
NOVA で初期に使われた端末は ASR33 、ということでほぼ間違いないでしょう。
そして、ASR33 には { } がありません。
おそらく、TX-2 版の BCPL を NOVA に移植する際に { } を使えなくて [ ] にしたのでしょう。
Alto 版は、NOVA 版をそのまま移植したので [ ] のままになった、と考えられます。
しかし、それなら NOVA 版はオリジナルの $( $) に戻せばよかったのでは? とも思います。
いや、TX-2 版の BCPL しか知らず、オリジナルが $( $) を使ったことすら知らなかったのかもしれません。
BCPL の移植は 1971 年ですから、BCPL の論文 (1969) 発表後です。
論文では $( $) を使っていますから、これを知っていれば $( $) にしたかもしれません。
結局、{ } を使わない理由は ASR33 で入力できなかったから、ですが、その際になぜ [ ] を選択したのかは不明です。
おそらくは、単に論文の発表もオリジナル版も知らず、TX-2 版が入手できたから移植しただけなのではないかな、とも思います。
#もしくは、知っていたとしても $( $) なんて表記は見にくいので、見やすいように変えたか。
ところで、ASR33 には ←↑があります。
こちらは BCPL には使用されていませんが、Smalltalk では多用されます。
←は、右辺の結果を左辺の変数に代入することを意味します。アスキーしか使えない環境では := で代用されます。
↑は、メソッド(手続き型言語の関数に相当)を終了し、戻り値を返すことを意味します。アスキー環境では ^ で代用されます。
おそらくは、Smalltalk の文法は ASR33 を前提として設計されたように思います。
#Alto のキーボードは、おそらく ASCII 対応にしたうえで、さらに ←↑のキーもあります。
…と、ここまで調査したところで、じゃぁ Smalltalk に対して BCPL の影響はあったのでしょうか?
皆無ではないと思います。もしかしたら、Smalltalk の VM が BCPL で書かれた、なんてこともあるかもしれません。
#ケイによれば、Smalltalk か Lisp で書いていないものは、BCPL で書かれているのです。
この3つの言語で VM が書けそうなのは BCPL だけです。
前回「BCPL の Alto 版がブロックに [ ] を使うのは、Smalltalk の影響ではないか」と書きました。
これは間違えていたわけですが、じゃぁ逆に「BCPL の [ ] が Smalltalk に導入された」とは思いません。
ここからは急に話が変わります。
Smalltalk に大きく影響を与えた言語に、LOGO があります。
シーモア・パパートによって設計された言語で、MIT の Project MAC の一環として実装されました。
そして、LOGO は、Project MAC の重要人物の一人である、マービン・ミンスキーの作った Lisp の影響を強く受けています。
Lisp は非常に面白い言語なのですが、紹介し始めるとややこしいので今はしません。
ただ、「リスト」という重要な概念があることだけを紹介します。
リストは、他の言語でいえば「1次元配列」です。
ただし、この中のデータには何でも入れることができます。リストですら入れられます。
リストをリストにしたものがあれば、それは2次元配列と同じように使えます。
Lisp のプログラムもまた、リストの形で示されます。
Lisp にとっては、プログラムもデータの一つに過ぎないのです。
そして、Lisp の命令は、基本的にリストを処理するものばかりです。
この「処理」には、プログラムの実行も含まれます。
たとえば、条件分岐は、複数のリストのどれかを選んで「実行」することで行われます。
繰り返しは、リストを規定回数「実行」することで行われます。
普通のプログラム言語では、プログラムとは実行され続けるもので、その流れを制御するのが条件分岐や繰り返しです。
しかし、Lisp ではそうではなく、「どのように実行するか」の指示を出すことでプログラムを制御します。
LOGO も Lisp の影響を受けているため、リスト型を持ちます。
リストは [ ] で表現され、実行制御もリストで行います。
つまり、実行されるプログラムは [ ] で括られたブロックのように見えます。
Smalltalk も、LOGO の影響を受けた言語なので、同じように [ ] で表現するリストを持ち、実行制御も同じように行われます。
NOVA 版 BCPL では、プログラムのブロックを [ ] で表現します。
後で作られた Smalltalk も、プログラムのブロックを [ ] で表現します。
しかし、BCPL は命令文をまとめた「複文」を示していて、Smalltalk ではの「リストに入れられたプログラム」を意味します。
見た目が似ていても、全く別のものなのです。
このため、少なくともブロック表現については、BCPL から Smalltalk への影響はないと思われます。
さて、まとめましょう。
・制作順は、BCPL のあとに Smalltalk 。
前回僕が書いた、BCPL の表記が Smalltalk の影響で変更されたのではないか、という推察は誤り。
・TX-2 から Nova に BCPL が移植された際、端末による使用できる記号の制限のため、ブロック表記を [ ] とした。
・LOGO を元に Smalltalk が作られた際、リスト表記としての [ ] を受け継いだ。
・どちらもプログラムブロックを [ ] を示しているように見えるが、その意味は全然違う。
このため、BCPL から Smalltalk への影響もないと思われる。
結論としては特に面白いものはないですね…
今回の調査で一番面白かったのは、以前から話には聞いていた Smalltalk to BCPL translater の詳細がわかったことかなぁ。
同じテーマの日記(最近の一覧)
関連ページ
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |