少し前に、最初に { } を使った言語とされる 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本書くと影響がわかりにくくなるし、一つにまとめて書くと話がごちゃごちゃするし…で悩んでたのね。
特に、言語の歴史はすごく面白い論文があったので紹介しておきます。
FORTRAN 以前に autocode があったことを挙げているけど、さらにそれ以前の言語から書かれている。
言語といっても、「CPU を使いやすくするために命令を充実させた仮想 CPU」とか「数式を入れたら計算プログラムを出すだけで、制御構造一切なし」とか、そういうものだけどね。
同じテーマの日記(最近の一覧)
関連ページ
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |