🏺

変数の物理的・論理的な仕組みについて

2022/12/04に公開

この記事ではメモリICの物理的/論理的な仕組みを学びます。メモリICの仕組みを理解することは変数やデータ型を理解するに当たって非常に大切です。なぜなら私たちが変数を宣言した際、その値はメモリスペースへ格納されるからです。

ゴールとしては、メモリがビルディングのような構造になっていることを理解します。そこに変数のintを宣言すると4フロア分のメモリが確保され、そこにデータが入る..とイメージを持つことです。実際にメモリ内部で何が行われているのか学んでいきましょう。

プログラムはどこに保存されるのか?

私たちが何かプログラムを作った際、それはメモリに保存されます。ではメモリとは具体的にどのような形をしているのでしょうか。メモリは下記のような黒いムカデのような形をしています。

小さなメモリ用のIC(=集積回路)が集まることでデータは保存されます。このようなメモリICがコンピュータの中には何千個も用意されています。

メモリICにデータはどう保存されるか?

先ほどのメモリICの中にデータはどのように保存されるでしょうか。「データを保存する」といっても具体的な形があるわけではありません。データは全て0と1の電気信号・電気のONOFFによって保存されます。私たちの書いた変数や関数も、メモリICの中に電気として保存されています。

メモリICへデータが保存される仕組み

各ピンが1/0 = ON/OFFを表す

メモリICの具体的な形を見ていきます。下記の図はメモリICをさらに拡大させたモノです。メモリICから1本1本ピンが飛び出ており、それぞれに役割があります。これらのピンが0と1のON/OFFをすることにより、データを保存しています。

特にデータを保存する場合、A0〜A9と書いてあるピンが使われます。AはAddressの略であり、場所、つまりデータの保存場所を決めるためのピンとなっています。

1バイトのデータを保存する

実際に1バイトのデータを保存してみましょう。電気のONが1、電気のOFFが0に対応していました。例えばこちらのピンを使って0101011101という場所を1つ指定すれば、1バイトのデータを保存することができます。

このメモリICでは1つのアドレスが1バイト分のスペースを持つので、こちらで1バイト分のデータを保存することができました。

10本のアドレスピンでは何通り?

では皆さんに質問です。10本のアドレス信号ピンではデータの保存場所は何通りあるでしょうか。ヒントを言うとピン1本で0と1の2通りを表せます。それが10本あるので何通りの場所を表せるでしょうか。

答えは1024通りです。ピンが10本あって、それぞれが2通りを表すので2*2*2*2*2*2*2*2*2*2で2の10乘=1024通りとなります。注意して頂きたいのが2×10で20通りではない点です。0と1の組み合わせだけ場所を指定できるので、2の10乗で1024通りになります。

この1024通りの中から保存場所を指定できます。組み合わせでいうと00000000001111111111の中から0101100111のように場所を決めることができるのです。

4バイトのデータはどう保存されるか?

ここに変数はどのように保存されるでしょうか。もっと具体的にいえばint apple = 10;というような変数はどのように保存されるでしょうか。intというデータ型は4バイトの大きさを持つことを表します。1バイトのデータを保存した際にはアドレスを1つ指定します。では4バイトのデータを保存するには、どれくらいアドレスが必要になるでしょうか。

その場合4つ分のアドレスを確保することになります。00000000001111111111の中から、0000000001000000001000000000110000000100を使えば4つのアドレス(=int型のメモリスペース)を確保できます。(4バイトの大きさなのでアドレスを4つ分確保したことに注意してください。)

他のデータ型で保存する場合

他のデータ型でも練習してみます。例えばshortという型は2バイトの大きさがあります。

00000000001111111111の中から2つのアドレスを確保すれば良いので、00000001010000000111を指定してみます。アドレスの番号自体はどこでも良いのですが、2バイト=2つのアドレスを確保する点を理解しておきましょう。

ビルディングとしてイメージ

ここまでメモリICの物理的な仕組みを見てきました。ここからは論理的、つまり私たちが扱いやすい、考えやすい方法でイメージしていきます。

全て数字で表されるとわかりづらい

数値によってメモリの保存場所を扱うことには1つ問題があります。それはデータの保存場所がわかりづらい点です。全て数字で表されるので、データがどこに格納されているかピンときません。1024通りの場所があって、そのうちの4個の場所を指定したのですが、全て数字になっているのでイメージが湧きづらいです。

そこでメモリに入っているデータをもっと簡単に扱う仕組みが考えられました。論理的なメモリICはこのようなビルディングの形として保存場所を扱います。先ほどと同じ00000000001111111111まで、1024通りフロアがあります。そして1フロアが1バイトの大きさに相当します。

この中からフロアを選んでデータを入れた方が、先ほどの数字を指定するよりも分かりやすいのではないでしょうか。実際にここに変数を宣言してデータを入れてみましょう。

int型のデータを格納

例えばint apple = 10;という変数を宣言します。intは4バイトの大きさがあるデータ型です。

すると1024階あるビルディングの内の4フロア分を使うことになります。この4フロアに対して、4バイトの大きさがあるintを入れる..という形になります。変数を宣言した場合、ビルディングのフロアを占有するイメージとなっています。

ビルディングへ他のデータ型を格納

他のデータ型でも確認してみましょう。shortは2バイト分のデータ型なので、フロアを2階分使います。

2バイトや8バイトなど数字を言われてもあまりピンときませんが、このようにフロアを占有するイメージを持つと非常に扱いやすくなるのではないでしょうか。

変数を宣言した際、コンピュータの内部で何が行われているのか?をイメージできるようになると、より効果的な活用ができるかと思います。

Discussion