今日は、ニクラウス・ヴィルトの誕生日(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 から連想するいろんな話をつらつらと書き連ねただけになってしまいました。
まぁ、時にはこういう回があっても。
同じテーマの日記(最近の一覧)
関連ページ
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 【Pascal】 EulerはALGOL60のコードを出力する、コンパイラというよりもALGOLの機能拡張だったはずなので、中間コードを出力したとは思えませんが、どうなのでしょうか。 (2018-01-08 12:12:45) |