2018年07月12日の日記です


メモリアドレス  2018-07-12 18:07:43  コンピュータ

先日、僕のページを参照しながらツイッターで話をしている人がいました。


#時々エゴサーチしてますよ


話の内容は、「コンピューターのメモリアドレスはいつから使われ始めたか」。

この話のきっかけが、僕が書いた「バベジの解析機関」の話だったのです。


実際はパンチカードは2組有り、1つはプログラムを、もう一つはデータを格納した変数を示します。これは、現在のコンピューターと違い、メモリに番地を割り振ると言うアイデアがなかったために、常に変数を指示する必要性があった事に由来します。


上は僕の書いた記事の抜粋。

もう20年も前に書いた記事なので、いま読むと恥ずかしい、説明不足な部分があります。


実際には、メモリは番号で区別されてはいます。

ただ、現代的な「アドレス」とはちょっと違うものなのです。


数学のアルゴリズムには、計算対象を変えながら、同じ計算を繰り返す、という操作は頻繁に現れます。


例えば、行列の掛け算とか。

「掛け算」なんて基本的なものなのに、計算対象を変えながら繰り返すという複雑な操作が必要なのです。




今のコンピューターは、プログラム内蔵式です。


プログラムはメモリに保存されていて、いま注目しているアドレスの命令を実行したら、注目している部分を次のアドレスにずらし、順次実行していきます。


しかし、バベジの解析機関は、プログラムはパンチカードで供給され、読み込みながら順次実行されました。

カード送り機構があり、次々と新しいカードが読み込まれるために、順次プログラムが実行されていきます。


そこに「アドレス」という概念はありません。

プログラム実行に、アドレスは必ずしも必要ないのです。



バベジの解析機関は、データ保持用のメモリ(バベジの用語では「ストア」)を多数持ち、プログラムで命令でデータの取り出し・保持が指定された際には、もう一組のカードから「使うべきメモリ」を読み込みました。


つまりは、使用するメモリは、プログラムとは独立していて変更可能です。

プログラムを「ループさせる」ことは可能だったので、適切に2組のカードを設定すれば、計算対象を変えながら行列計算を行うようなことも可能です。



しかし、このカードは変数が必要になるごとに読み込まれ、変数自体を計算によって求めるようなことはできません。


C言語風の書き方になりますが、


A1 + A2



A[1] + A[2]


の違い、と言えばわかってもらえるでしょうか。


前者の 1 2 は、区別するための記号にすぎません。連続した数値ではないのです。

しかし、後者の 1 2 は、記号ではなく数値です。連続したメモリの中の位置を示す「アドレス」です。



それぞれのやり方で、10個のデータの合計を求めようとすると、こうなります。


SUM = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 + A9 + A10;


for(i=0;i<10;i++)SUM += A[i];



前者のやり方で、データが 100 個に増えたら大変です。

しかし後者なら、わずかな変更で対応できます。



もう少し根源的な言い方をすると、「アドレスが計算対象か否か」です。

コンピューターは計算のための道具ですが、その計算に使用するメモリのアドレスすら、計算の対象とできるかどうか。



メモリに区別のための番号が割り振られていたとしても、計算対象でない場合には、「アドレス」とは呼べないように思います。




ではいつからメモリにアドレスが割り振られたか、というと、実は話は簡単で、プログラムがメモリ内蔵型になった時だと思われます。


ENIAC(1946) は、配線によってプログラムを行いました。

そもそも、現代的な「プログラム」のイメージですらありません。


それ以前のハーバードマーク1(1944) では紙テープでプログラムを行いますが、まだアドレスの概念はありません。

データを保持できる場所…メモリと言っても差し支えない場所は 72個あるのですが、実はすべてが「カウンタ」で、それぞれがタイガー計算機だと思ってください。


タイガー計算機ですから、足し算・引き算だけ出来ます。

72個のカウンタの、どこからどこに足し合わせるか、というデータの流れをひたすら記述することがプログラムになります。


この 72 個は、番号で区別されていますが、ただの区別の記号です。

この番号を計算対象として、配列を実現するようなことはできません。




最初にメモリ内蔵型を提唱したのは EDVAC(1951) です。

この際に、「メモリには、プログラムとデータを一緒に入れてしまう」という決断をしています。


しかし、さすがにこの二つは別物だろう…ということで、1bit の区別フラグがつけられています。

プログラムからは、データを読み書きすることはできるのですが、プログラムを読み書きすることはできません。


EDVAC は命令を「5つ組」で示します。命令と、アドレス4つです。


アドレスは、演算対象となるデータが入っているアドレス2つ、結果格納アドレス、次の命令のアドレスです。



現代のコンピューターから見ると、「次の命令アドレス」が随分と奇異に見えます。

自動的に次のアドレスの命令を読み込むのではなく、いちいち次の命令のアドレスを指定する必要があるのです。


これは、「メモリに割り振られたアドレスは、識別用の記号であり、連続した数値ではない」という設計思想のためです。


もちろん、演算対象・結果格納用のアドレスも、連続した数値ではありえません。

ここには直接数値を入れてあり、アドレスと見なされるため、配列アクセスのように「アドレスを計算する」ことはできないのです。




EDVAC の設計論文を見て、先に完成させてしまったのは EDSAC(1949) です。

この際、回路を簡略化し、素早い完成を目指す中で、データとプログラムを区別するビットが省略されています。


これは、うっかり間違えてプログラムを破壊しないための、保護機構でした。

逆にいえば「うっかりミス」が無いように人間が注意すれば、機械として作りこむ必要はないと判断したのでしょう。


用意された命令は、EDSAC のものとそれほど変わりません。

ただし、「次の命令アドレス」は不要で、連続したメモリの命令を順次実行していきます。


おそらくは、「次の命令アドレス」を無くせばその分のメモリが不要になる、という簡略化のための判断です。

しかし、これにより「メモリアドレスは連続している」という設計思想が生まれています。


とはいえ、データアクセスの際には、固定値でアドレスを示します。計算できません。

これが当時としては標準的なやり方だったためです。



ところが、ここにうれしい誤算が生じます。

プログラムの保護機構を省略したことが、非常に柔軟なプログラムを可能にしていました。

保護機構が無いということは、プログラムもまた、同じメモリに置かれたデータに過ぎないということです。


プログラムの置かれた特定のアドレスを演算対象として、書き換えてしまえば…

アドレス部分を書き換え、「順次アクセスする」ようなプログラムが可能になるのです。



当初の設計に織り込まれたものではないとはいえ、手法に気づいたら積極的に利用した節があります。

プログラム自身を演算対象とできる…これはコンパイラなどが作れるということですし、実際簡易なアセンブラ兼ローダー兼 BIOS である「ブートローダー」が作られています。



EDSAC では、メモリアドレスを計算対象とし、配列演算ができるようになったのです。




蛇足ながら、EDSAC よりも完成の早かった、The Baby(1948) でもプログラムの自己書き換えは可能だったように思います。

しかし、これは実験機のため、極端にメモリが少ないマシンでした。


小さなプログラムを書いたらメモリいっぱいで、自己書き換えなどのテクニックを駆使して配列操作するような余裕はありません。


現代の CPU では、「レジスタに入っている数値をアドレスとしてメモリにアクセスする」というような機能があります。


レジスタは計算のための特殊メモリですから、この数値をアドレスとする、というのは、アドレスを計算対象とすることにほかなりません。

EDSAC では「自己書き換え」で実現されていた方法が、今では CPU の命令で普通に用意されているのです。



冒頭の話題に戻りましょう。

コンピューターのメモリアドレスはいつから使われ始めたか。


この質問の裏には「今のように」という観点があるでしょう。

その元祖は、EDSAC だと思います。



先に書いた通り、EDSAC とほぼ同時期のコンピューターでは、メモリアドレスを計算対象とは「しない」のが普通でした。

その中で異質だった EDSAC のやり方が現代に残っているのは、このやり方が非常に強力だと皆が認めたからでしょう。




2018.7.17 追記

ツイッターで、こちらの掲示板で同じ質問が出ていた、と教えていただきました。


話の冒頭で「先日」と書きましたが、6月下旬の話だったと思います。

その掲示板の日付は6月23日。


僕の該当ページも参照されていますし、1) ツイッターで話題にしていた人たちが質問した 2) この質問を読んだ人がツイッターで話題にしていた のどちらかではないかと思います。




掲示板でも、「ノイマン型あたりだろう」と正しい認識なのですが、「チューリングマシンから」と言っている人がベストアンサーになっています。

あまりにも的外れなので、ちょっと突っ込み入れたくなった次第。



チューリングマシンは、紙テープが最新のメディアだった時代の発想なので、基本的には「無限に長い紙テープに、検索キーとデータを書き込んでおく」という発想で考えられています。

いわば、キーバリューストア。アドレスはないです。


そもそも、今ではコンピューターの元祖のように言われていますが、もともとは「ゲーデルの不完全性定理」という、数学上の大問題を証明するための道具にすぎません。


ここら辺、詳しくは過去に書いたことがあるので、興味がある方はそちらをお読みください





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

コンピュータ

関連ページ

階差機関&解析機関

Programming Tips

別年同日の日記

02年 納得?

15年 実装の苦労

16年 Chromebook購入

16年 Chromebook で子供ができること

17年 ジョージ・イーストマン 誕生日(1854)

19年 いきてますよ

22年 参院選


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


戻る
トップページへ

-- share --

1000

-- follow --




- Reverse Link -