Lisp の car や cdr が、以下の略であることぐらい、Lisp をかじったことのある人なら知っているでしょう。
- Contents of the Address part of Register number
- Contents of the Decrement part of Register number
Lisp が最初に実装された IBM 704 の機械語には、address の部分と decrement の部分があったこともよく語られています。address はすぐに分りますが、decrement とは何でしょうか?
長年の疑問を和田先生に聞いてみました。
和田先生の答え
ループを作るときにインデックス・レジスタから decrement の部分を引く
for 文に例えるなら、インデックス i から引く数であると言うのです。そうだったんですかぁ。詳しく調べてみました。
IBM 704
IBM 704 Manual of Operationの 7 ページと 8 ページに詳しく載っていました。
- 1ワードは36ビット
- アドレスは、4096ワード
- すなわち 12 ビットで表現可能
1ワードを機械語の命令として使うとき、命令にはタイプAとタイプBがあります。
タイプAの命令は、以下のような構造を持っています。
1 1 1 2 2 3 0 1 2 3 ................. 7 8 9 0 1 ................. 5 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <---> <-------------------> <---> <-------------------> prefix decrement tag address
- prefix
- 0〜2の3ビット、命令の種類
- decrement
- 3〜17の15ビット、インデックス・レジスタから引く値
- tag
- 18〜20の3ビット、インデックス・レジスタを指す
- address
- 21〜35の15ビット、アドレス
タイプ A の命令は、1 ビット目と 2 ビット目のどちらか、あるいは両方が 1 です。両方が 0 だと、タイプ B の命令になります。だから、タイプ A の命令は 6 種類ですね。
驚愕の事実
car よりも cdr の方が、前にあるんですね。。。History of Lisp を読むと、cpr と ctr もあったようです。