2016年02月26日の日記です


BCPL の § 記号についての追加調査  2016-02-26 16:46:27  コンピュータ

少し前に、最初に { } を使った言語とされる BCPL は、なぜ当時「使えなかった」文字である { } を使おうとしたのか、という話を追いかけていた


これは一応決着がついて、そもそも BCPL は { } を使ってはいない、記号類を環境ごとに変更できる柔軟な設計で、TX-2 では { } が使えたので、たまたま使っただけだ、ということがわかっている。


でも、疑問は次々に出てくる。

その後も調査を続けているのだけど、どうも話が入り組んでいてまとまらない。


まとまらないので詳細は後日、ということにするのだけど、面白いので一部を紹介していこう。




話が入り組んでいるので、まずは昔のコンピューターで使った文字コードの調査をしてみよう、と思った。


昔はコンピューターを「電子計算機」と訳したように、計算機能が主だった。

でも、ある段階から、計算結果を人間にレポートすることが重要になって、出力時にアルファベット(以下、文字と書く)を使えるようになる。


出力で文字を使うのだから、少なくともプログラマは文字を入力できる必要がある。

たとえば、IBM では数値を示すパンチカードに、特殊な形式で穴を開けることで文字を示すことにした。


ややこしい入力方法とは言え、「文字コード」が誕生するわけだ。


イギリスで作られた EDSAC は、プリンタとしてテレタイプを接続していた。

キーボード部分はコンピューターに接続していないのだけど、当時のテレタイプは、タイプした内容をパンチテープに保存できた。


プログラムは、この「パンチテープ」として入力された。

なので、ここでも IBM と同じように、パンチの穴として文字を表現できるわけだ。


どちらの場合も、使用できる文字は電動タイプライターの活字に制限される。

{ } は存在しないから使えない。




イギリスのマンチェスター大学で作られた、マンチェスター Mark I…

The Baby markI の実験のあとに作成された、本来作りたかった計算機。


EDSAC の流れを汲んでいて、テレタイプで入力したパンチテープでプログラム入力する。


今回調べるまで知らなかったのだけど、この Mark I で、FORTRAN よりも昔にコンパイラ言語が作成されていた。


autocode と呼ばれるものなのだけど、ちょっとややこしい。

というのも、イギリスでは autocode が「コンパイラ」と同義語のように使われたようで、autocode と名付けられた言語がたくさんあるのだ。


Mark I でも、2つの autocode がある

文法なども全く違うのだけど、どちらも「Mark I では使えなかった文字」が含まれている。


たとえば、1つ目の autocode では、変数への代入に → が使われる。

2つ目の autocode では、条件判断に ≤ が使われる。


これらは、Mark I に接続されたテレタイプでは使えない文字だ。

リンク先に文字コード表があるけど、文字平面は「シフト」できるので、これ以外に数字が使えたらしい。


→ ≤ も、シフトした平面にあった可能性がないとは言わないのだけど、後で書く理由で、文字になくても使えたのだと思う。




Mark I と同じ設計者が、Atlas というコンピューターも作っている。

こちらにも autocode があるのだけど、先に書いたようにこの言葉は「コンパイラ」程度の意味しか持っておらず、言語仕様などは全く異なる。


このatlas autocode のマニュアルがあるのだけど、注目すべきは 2.1 章。


Atlas には Flexowriter (当時人気のあったテレタイプの商品名)がつながっている、としたうえで、使える文字種を挙げている。


π とか ½ のような、今見ると奇妙な記号もあるのだけど、今見ても一般的な記号が揃っている。


そして、すぐ下に「バックスペースを活用して、これらの文字も作れる」と、いくつか例が上がっている。


≠ ≥ ≤ ; ↑


≤ は、先ほど書いた MarkI の autocode でも使っていた記号だ。


今ではバックスペースは「直前の文字を削除」の意味だけど、本来タイプライタでは「削除」なんてできない。

1文字戻す、というのが正しい意味合いだ。


そして、1文字戻って別の文字を打てば、文字は重ね書きされる。


< に _ を組み合わせれば ≤ になる。

: に , を組み合わせれば ; になる。

= に / を組み合わせれば ≠ になる。


MarkI autocode にあった → なんかは、 - と > を組み合わせればできるだろう。


↑ はどうやって作るんだ? と思った。(使える記号種に、^ は無い)

公開されているのはスキャンしたマニュアルを OCR したもので、元画像も公開されている。


見てみたら、↑ と書かれているものは * に | を組み合わせ、* としたものだった。

形が全然違うけど、そのすぐ後ろに「autocode では、* をべき乗の記号として使う」とあるので、一般的なべき乗記号に合わせたようだ。



さて、ここで新鮮な驚きが。

autocode のソースコードとしては、テレタイプで打って作ったテープをコンピューターに読み込ませる。


紙の印字上は ≤ は1文字かもしれないが、ソースコードとしては3文字だ。

< _ の2文字の間に、バックスペースの制御コードが含まれている。



言語仕様として、予約語の中にバックスペースが含まれる!


ちょっと衝撃だった。まさかそんな言語が世の中に存在しようとは思っていなかった。




でも、この発見は疑問に思っていたことに答えをくれる。


Atlas の後継機である Atlas 2 …のプロトタイプ機である Titan の上で、CPL 言語が開発された。

(Atlas にもすぐに移植されている)


CPL もまた、autocode の流れを汲んでいたようだ。

以前の記事で、CPL はブロックの開始に § を使用する、と書いた。

ブロックの終わりは § に | を重ね打ちした § だ。


…そう、すでに「重ね打ち」テクニックを使っているにもかかわらず、それを一般化して考えていなかった。

ここだけの特別なものだと思っていた。


そして、一番の疑問は、Titan に接続されたテレタイプに § 記号はあったのか、ということだった。


これ、おそらくは小文字 s の重ね打ちだわ。

タイプライターの高級機種には、行を上下に半分ずらしてタイプする機能があった。

( X2 とか、X2 とか書くためだ)


裏が取れていないので確定はできないけど、おそらく§は、s を行半分ずらして重ね打ちしたもの。

§ は、さらに | を重ね打ちしたもの。


§ は、見た目の上では1文字なんだけど、バックスペースも含めて5文字の長さの「予約語」となる。


begin ~ end って書いたほうが楽なんじゃね? ってくらいのタイプ数だ。




BCPL が作られたとき、言語設計上は § を前提としているのだけど、環境によって別の記号も使えるように作られた。


ここで新たな疑問が出る。


BCPL では、「Titan では使えた特殊記号 § が使えなかったから、違う文字にしたのだろう」と考えていた。


でも、Titan だって § は使えなかったのだ。s の重ね打ちだった。

なんで、BCPL では s の重ね打ちをやめたんだ?



これは悩まずにすぐに答えにたどり着ける。

BCPL は最初 CTSS で作られ、すぐに TX-2 で動き始めた、と調査してある。

この両機種とも、小文字の s が使えない。


CTSS は、IBM 7094 で動いている OS だ。

そして、先に書いたように、IBM のコンピューターはパンチカードに通常とは違うやり方で穴を開けることで、文字を表現した。


パンチカードの1文字に対応する穿孔個所は12あり、1文字を 12bit で表せるように思える。

しかし、穴を開けすぎるとカードが弱くなり、読み込み時に機械に引っかかってトラブルを起こしやすくなる。


そのため、穴の組み合わせ方法は制限されていて、48文字しか表現できなかった。


7090のマニュアルの、102ページからプリンタの説明があり、使える 48文字と、パンチカードで表現する方法が載っている。

7094でもプリンタは同じものが使われた。



TX-2 は、Titan と同じく Flexowriter がつながっているのだけど、活字部分を変更した特注品だった。

小文字は、一部の数学や物理で変数として使われやすいものだけを残して、各種記号に変更されている。


他の機種では持っていなかった { } などがある一方で、小文字 s は存在しない。



というわけで、BCPL は s の重ね打ちで § を表現することができなかった。


小文字の s があれば CPL に忠実に作っていたかもしれない。

初期の2機種とも小文字 s が使えないという不運な偶然が { } を言語に取り入れさせたのだ。




…あれ、これはこれで話としてまとまったな。

最初に書いた通り、「まとまらないから」一部を紹介するつもりだったのだけど。


えーと、ここにあげた機種以外にも、古いコンピューターの文字コードを片っ端から調査しています。

そして、その文字を入れるための「キーボード」の扱いがどうだったか、ということと、その文字コードの影響を受けてどのように言語が作られていったか、も。


3つの、密接に絡み合いながらも異なるものの歴史を調査したら、分離して3本書くと影響がわかりにくくなるし、一つにまとめて書くと話がごちゃごちゃするし…で悩んでたのね。



特に、言語の歴史はすごく面白い論文があったので紹介しておきます。


Knuth 大先生が書いた、初期の言語についての論文です。

FORTRAN 以前に autocode があったことを挙げているけど、さらにそれ以前の言語から書かれている。


言語といっても、「CPU を使いやすくするために命令を充実させた仮想 CPU」とか「数式を入れたら計算プログラムを出すだけで、制御構造一切なし」とか、そういうものだけどね。




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

コンピュータ

関連ページ

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

別年同日の日記

04年 メインマシン絶不調…

13年 シュガーバニーズとマドレーヌ

15年 ずんずん教の野望

18年 横浜散策


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


戻る
トップページへ

-- share --

7000

-- follow --




- Reverse Link -