あどけない話

インターネットに関する技術的な話など

cdr の decrement

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 もあったようです。