2016年02月15日の日記です

目次

02-15 再訂正:BCPL と Smalltalk の関係
02-15 ニクラウス・ヴィルト 誕生日(1934)


再訂正:BCPL と Smalltalk の関係  2016-02-15 00:52:45  コンピュータ

▲目次へ ⇒この記事のURL

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 の詳細がわかったことかなぁ。



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

コンピュータ

関連ページ

BCPLについて、訂正【日記 16/02/13】

別年同日の日記

03年 体調悪し…

05年 忙しい一週間・火曜日

08年 三代目永眠

13年 ページワン

20年 バレンタインの直前に


申し訳ありませんが、現在意見投稿をできない状態にしています

ニクラウス・ヴィルト 誕生日(1934)  2016-02-15 16:01:04  コンピュータ 今日は何の日

▲目次へ ⇒この記事のURL

今日は、ニクラウス・ヴィルトの誕生日(1934)


Pascal(1970) や Modula-2(1978) を作った人です。


Modula-2 は、一時期もてはやされていて憧れがあったのだけど、僕は使ったことがありません。

基本的に Pascal の後継(である、Modula の)改良版だそうです。


Pascal って、よくできていたし「将来のコンピューター言語はこれだ」というように言われたのだけど、欠点も多々あった。


それを解消しようとした意欲作が Modula で、でも意欲作であるが故の無理もあったみたい。

開発途中で無理に気づいて開発をやめてしまったため、詳細は明らかになっていません。


そして、無理な部分を修正したのが Modula-2 。

Pascal の良さは継承しつつ、悪いところはきちんと修正されていた。

だからこそ、熱狂的にもてはやされた。


でも、よくできているものが普及する、とは限らない。

Modula-2 は普及せず、今ではほとんど忘れ去られています。




Pascal のほうは、一定の普及を見ましたし、僕も使ったことがあります。


以前に少し書いたことがあったな。

大学で DOS 版の TurboPascal (Borland 社の作った、Pascal実装の一つ)を使っていました。


Pascal はコンパイル型言語なのだけど、TurboPascal はコンパイルがむちゃくちゃ速い。


当時、BASIC では F5 キーに「RUN」というコマンドが定義されているのが普通で、プログラムを作ったら F5 キーを押せば動き出します。

TurboPascal もこれに倣っていて、F5 キーを押すとコンパイルして、すぐに実行される。


この待ち時間が、事実上無いの。

インタプリタである BASIC のように実行できて、コンパイラなので速度は速い。


TurboPascal の実装が良かった、というのもあるのだけど、Pascal 自体の言語設計が上手だった。

構文解析がしやすいように巧妙に文法が定められていて、頭から終わりまで解析すると、その時点でコンパイルが終了していたのね。


#普通、コンパイラは1回目で変数名や関数の定義を把握し、2回目で命令を生成します。

 Pascal は、命令の生成と定義の把握を同時に行える文法にしてあった。




Pascal は、P-code と呼ばれる中間言語を生成します。

実行する際は、P-code インタプリタと呼ばれる仮想 CPU を使って、この中間言語命令を実行してやる。


だから、直接 CPU に命令を出すコンパイラに比べると遅いです。


でも、P-code 形式の良さもある。

まず、コンパイラの移植が簡単です。ターゲット CPU ごとに作り変える必要はないのですから。


#もちろん P-code インタプリタを作る必要はあります。


仮想 CPU なので、暴走しても停止させる、なんて芸当も可能です。

先に TurboPascal が F5 ですぐ実行できた、と書きましたが、実行中に停止することもできたので、本当に BASIC と同じ感覚で扱えました。


そして、十分にデバッグができたら、P-code から実際のターゲット CPU の命令に変換すればよいのです。

そうすれば、高速に動作させることができました。


これらの特徴はすべて、Pascal が教育用として考えられていたから。


教育用でありつつ、十分に強力で実際に役立つアプリケーションも作れる。それが Pascal の特徴でした。

実際、Pascal は Pascal で作られています。




先日から調査して書いている、BCPL (1967) と似てますね。


BCPL は、中間言語を生成して、インタプリタや、実際の CPU 命令へのコンバータを使って実行します。

実は、BCPL のこの中間言語は O-code と呼びます。呼び名も似ています。


BCPL が先に考えた、というのではなく、当時こういう形式が流行したのです。

ヴィルト自身、Pascal の前に Euler (1965) という言語を作っていて、その時にも同じように中間言語形式を使っています。


#パスカルにオイラー…偉大な数学者の名前です。


しかし、ヴィルトが Pascal を作った際に「P-code」という呼び名を広めたため、現在ではこうした形式を一般に P-code と呼んでいます。


P が何の意味か…は不明なのですが、ヴィルトが Modula-2 を作った時には M-code と呼んでいます。

ということは、P は Pascal の略なのでしょう。


しかし、今では P-code という呼び方が一般化してしまったため、pseudo (仮想的な)や portable (可搬性のある)の略とされます。




Pascal が当時どれほどの人気を持っていたか、示しておきましょう。


Apple II には、純正の Pascal 処理系が発売されていました。

Lisa も、Macintosh も Pascal でプログラムを作ることを前提として内部のプログラムが用意されました。


IBM が PC を作成したとき、必要としていた言語は、IBM の大型機でも使用されていた FORTRAN と COBOL 、それに家庭用 PC なら絶対必要な BASIC 、そして Pascal でした。

これらをすべてマイクロソフトに依頼し、マイクロソフトはこの4つに加えて DOS を開発しています。


TurboPascal は、当初 CP/M 用から開発されたので、Pascal は Z80 / 8080 マシンでも使えました。

もちろん、CP/M 互換の MSX でも使えます。


他にも、移植されたマシンは数知れず。

みんな、これが BASIC の次に来る言語だ、と心から信じていましたし、実際 Pascal はよくできたシステムでした。




WEB 上で動く、TurboPascal エミュレータがありました。


Borland 社が、TurboPascal の DOS 版の「コンパイラ部分」のみをフリーウェアとして公開したことがあります。

そのコンパイラ部分を使用したエミュレータです。


TruboPascal は先に書いたように、プログラム作成中に F5 を押しただけですぐに実行できました。

上のエミュレータでは、そうした統合環境を試すことは出来ませんが、雰囲気くらいはつかめます。


「D」を押すと、用意されているサンプル一覧を見ることができます。

「W」を押すと、ファイル名を聞いてくるので、上の一覧で見られるファイル名を、拡張子まで入れてください。


「R」を押すと実行できます。

実行中でも、何かキーを押せばすぐに元の状態に戻れます。


「E」を押すと、ソースファイルを編集できます。

このエディタは、ブラウザ上の TEXT 入力にすぎません。コピペも可能です。

セーブはない(S コマンドが画面上に表示されているが、実装されていない)ので、保存はコピペでローカルファイルにしてください。


エディタ使用時は、左下に「Close Editor」という表示が出るので、クリックすれば終了します。




TurboPascal にはグラフィックライブラリがあり、上で公開されているサンプルでもグラフィックを使用しています。


Apple II の Pascal にも、グラフィックライブラリを作ろうとしたことがあったようです。

でも、Apple II の VRAM って、非常に複雑なのね。

ハードウェアから見ると非常に美しい、よくできたものなのだけど、ソフト側から見ると難解。


ここに、理想的なグラフィック環境を作り上げるにはどうすればよいか、社内でもなんとなく競っていたようです。


ビル・アトキンソンが、Apple II のグラフィックはどうせにじむのだから、「点線」を描いても「直線」に見える、というテクニックを駆使して、非常に高速なラインルーチンを書いた。


これ、高速だから「QuickDraw」と名付けていたらしい。この頃は正式名ではなかったらしいけど。


…元の話、どこかで読んだのだけど探しても見当たらない。

ウォズが「アトキンソンはずるをしたけど、ジョブズは見破れず気に入ってしまった」と証言しているのは、手元にある「Apple II 1976-1986」に載ってました。



後に Lisa を作るときに、このライブラリが流用され、さらに Macintosh でも使用されます。

これらのマシンは白黒だけど、Apple II 用の QuickDraw はカラーを考慮していたので、内部的にはカラーを扱えるようになっていたらしい。


QuickDraw は「理想の」描画環境を目指したので、解像度に依存しないし色数にも依存しない。

(0,0) から (0,100) まで直線を引くと、100 ドットの線が引かれる。数学的に正しいです。


これ、昔の BASIC とかだと 101 ドットの線が引かれるからね。


QuickDraw は数学的に正しいから、他の解像度の環境に持って行っても、適切に倍率を掛けて描画して、同じ結果を得られた。

画面とプリンタでは解像度が全然違うのに、同じ結果が得られたのは、裏にこういう仕組みがあったからです。


今だと、PostScript が同じような仕組みを使っているし、Mac の画面描画も PostScript ベースになっているのだけど。




Macintosh … 今の MacOS X 搭載のやつじゃなくて、Classic と呼ばれる OS 9 までのやつね。

その ToolBox と呼ばれる ROM に搭載されたプログラムも、Pascal 前提でした。


だから、Cで扱おうとするとやりづらい。

Pascal とCでは、文字列を扱う方法が違うんです。


Cでは、文字列の最後に NULL (キャラクタコード 0 の文字)を置く。

Pascal では、最初の1バイトに文字列長を入れる。文字列長がわかっているので、最後に NULL などを置く必要はない。


たしか Mac 用のC言語では、文字列をそのまま Pascal 文字列に変換してくれるような仕組みがあったと思うのだけど、よく覚えていない。

仕組み上、Pascal では 255文字以上の文字列は扱えない。




なんか Pascal から連想するいろんな話をつらつらと書き連ねただけになってしまいました。

まぁ、時にはこういう回があっても。



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

コンピュータ

今日は何の日

関連ページ

BCPLについて、訂正【日記 16/02/13】

別年同日の日記

03年 体調悪し…

05年 忙しい一週間・火曜日

08年 三代目永眠

13年 ページワン

20年 バレンタインの直前に


申し訳ありませんが、現在意見投稿をできない状態にしています

【Pascal】 EulerはALGOL60のコードを出力する、コンパイラというよりもALGOLの機能拡張だったはずなので、中間コードを出力したとは思えませんが、どうなのでしょうか。 (2018-01-08 12:12:45)


戻る
トップページへ

-- share --

7000

-- follow --




- Reverse Link -