プログラム講座 初級編9

- メモリについて その1 -

 初級編9です。今回は「メモリ」です。初級編ですので、あまり深入りはしません。Macではさけて通れないハンドルとポインタについて説明しましょう。なお、メモリ関係は数回に分けて解説します。




メモリって何?
 まず、最も基本的な「メモリ」について説明します。メモリは日本語で書くと「目盛り」・・・というオチはさておき、MacやWinマシンを購入するときに「メモリは標準で16MB搭載」「768KBまで増設可能」「powerPC604で2次キャッシュ(メモリ)256KB搭載」といった具合に「メモリ」という言葉は、あちこちに出てきます。

 メモリはコンピューターにとって「入れ物の1つ」です。同様にハードディスク、フロッピーディスクも入れ物の1つです。この入れ物の中に、どれくらいの情報が入るのでしょうか? この答えを書く前にメモリについての用語を解説します。



ビット、ニブル、バイト、ワード、ロングワード/ダブルワード、ロングロングワード
 この講座最長の小見出しですね(^^;
 1つづつ説明していきます。

 ●ビット[bit]
コンピューターは、基本的に0と1の信号で全て処理を行っています。0がオフで1がオン、といった具合です。これを高速に切り替えて処理を行っているのです。ビットはコンピューターにとって「最小の単位」です。ビットの値は「0か1」のどちらかしかありません。
このビットを複数組み合わせて数値を表現しています。1ビットでは「0か1」のどちらかしか表現できませんが、2ビットでは

  00 = 0
  01 = 1
  10 = 2
  11 = 3

 といった具合に0〜3までの4つの数字を表現する事が出来ます。あまり深く説明すると初級編ではなくなってしまいますので、これはこのくらいにして次に進みましょう。


 ●ニブル[nibble]
ニブルというのは、あまり聞きませんし使わないかもしれません。これは「4ビットの事」です。4ビットは2で0〜15までの16の数値を表現できます。8ビットを2つに区切って「上位ニブル」「下位ニブル」という使い方をします。Macではほとんど使いませんので、特に覚えることはありません。ちなみに0〜15なので16色表示の時にはちょっと出てくる事もあります。

Future BASICではa = PEEK(adrs&) AND 15とすると下位ニブルがメモリから読み出せます。


 ●バイト[byte]
 もっとも頻繁に使われます。ニブルは4ビットでしたが、バイトは「8ビットの事」です。つまり

1バイト=8ビット

という事になります。2バイトなら16ビット、3バイトなら24ビット・・・といった具合になります。8ビットは2ですので0〜255の256まで表現できます。
元祖パソコンブームの時はほとんどが8ビットマシンでした。ぴゅう太は16ビットでしたが(^^;
KB,MB,GB,TBについては後の章で説明します。

Future BASICではa = PEEK(adrs&)とすると1バイトメモリから読み出せます。


 ●ワード[word]
 ワードは16ビットの事です。つまり

1ワード=16ビット(2バイト)

という事になります。パソコンではワードといえば16ビットを指しますが、大昔のミニコン/オフコンおよび時計などに使用されている組み込みマイコンでは1ワード=16ビットではありません。1ワード=12ビットなど、いろいろあります(参考までに)。
16ビットなので216で0〜65535まで扱うことが出来ます。

Future BASICではa% = PEEK WORD(adrs&)とするとメモリから1ワード読み出せます。

 ●ロングワード/ダブルワード[long word / double word]
ロングワードは「32ビットの事」です。32ビットですから2ワード、4バイトといった表現の仕方もできます。モトローラー系では32ビットは「ロングワード」といいインテル系では「ダブルワード」と呼びます。

Future BASICではa& = PEEK LONG(adrs&)とするとメモリから1ロングワード読み出すことが出来ます。


 ●ロングロングワード[long long word ]
ロングロングワードは「64ビットの事」を指します。モトローラー系ではロングロングワードでインテル系ではクワットワード(って書き方でいいかな、英語で1/4という意味です)と呼びます。

Future BASICでは、ちょっと演算しないといけません。標準状態では一括で読み出し/書き込む命令はありません。



KB, MB, GB, TB
 こっちの文字の方がよく見ると思います。これらは以下のようになっています。
1KB
1024バイト
1MB
1024KB
1GB
1024MB
1TB
1024GB
 メモリのサイズを表す場合にはKB, MBが使われます。ちょうど1024倍で1単位づつになっているのがわかりますか?
 16MB標準メモリといったら16*1024KB = 16384KBという事ですね。



アドレス(番地)
 メモリはたくさんあっても、メモリが「どこにあるのか」がわからないといけません。そのためメモリには1バイトづつ「アドレス(番地)」が割り振られています。
0223
1125
20
30
6553490
6553533

 といった具合です。メモリは通常0番地から割り当てられています。つまり0番地の値を1バイト読み出したければ

a = PEEK(0)

 でaに0番地の値が入ります(上記の表であれば223が入ります)。値は1バイトなので必ず0〜255になります。
 いろいろな数値を入れて読み出してみるとよいでしょう。適当にやっていると「バスエラーが発生しました」[タイプ1のエラー]、「アドレスエラーが発生しました(68000のみ)」[タイプ2のエラー]という内容のメッセージまたはエラーコードが表示されるでしょう。これは以下の場合に発生します。


 CPUが68000のマシンでは奇数番地を読み出すとエラーになってしまいますが、68020以降およびpowerPCでは問題なく読めます。ただし68020, 68030, 68040マシンでは速度が低下してしまいます。ちなみにpowerPCの場合はバイト単位で読み出しても速度は低下しません(キャッシュのミスヒットは別です)。
 それにしても、毎回a = PEEK(1024)などのように数値で指定していては面倒ですし、融通が利きません。そこで通常はadrs& = 1024といった具合に変数にアドレス(番地)を入れて読み出します。

a = PEEK(adrs&)

 といった具合です。これでa = PEEK(1024)と全く同じ結果を得ることが出来ます。注意点として変数は必ずロングワードでなければいけません。要するに変数の最後に&を付けておけばよいという事です。



ポインタ
 ここからが本題です^^; 長い説明でしたので、くたびれてしまった方もいるかもしれません。そういう時は一息ついてから読んでください。
 先ほど

a = PEEK(adrs&)

 といった具合にadrs&という変数にアドレスを入れてメモリ内容を読み出しました。adrs&はアドレス(番地)を指しています。これをポインタと呼びます。ずばり「直接メモリの番地を指している」わけです。
 ずばり書いてしまうと説明がなくなってしまいますね(^^;
 ちなみにC言語でのポインタという言葉も全く同じです。

アドレス
(adrs&=4251 )→4251123
425213
425313
6022225
60237



ハンドル
 ポインタの次はハンドルです。ハンドルは「ポインタのポインタ」と呼ばれることが多々あります。ポインタはメモリのアドレス(番地)を直接指していましたが、ハンドルは間接的に指しています。なぜ、間接的に指さなければいけないのか? これはメモリを効率よく使用するためです。特にMacの場合、ハンドルはさけて通ることができません。

 論より証拠というか具体的にプログラムを示した方が早いと思います。
 ハンドルが示すメモリの先頭1バイトを読み出すことにしましょう。
 myHandle&はハンドルです。これはポインタadrs&が格納されているアドレス(番地)を指しています。つまり以下のようにし、まずポインタを読み出します。

adrs& = PEEK LONG(myHandle&)

 次にadrs&が示すアドレス(番地)から1バイト読み込みます。

a = PEEK(adrs&)

 これでaに先頭1バイトが読み出されます。実際に使用する場合は、もうちょっと短く書きます。

a = PEEK([myHandle&])

 [〜]はPEEK LONGと同じ役割です(ショートカットと呼ぶこともあります)。myHandle&が示すメモリからポインタを読み出して、そこから1バイト読み込む(PEEK())といった具合です。

アドレス
myHandle&→(adrs&=1001 )→1001233
1002233
1003192
128
5555091
5555119




終わりに
 長くなりましたので、メモリ関係は初級編10でも連続して解説します。初級編10では実際にメモリを確保して値を書き込んでみる、という処理を行ってみます。メモリの確保、破棄、ハンドルのロック、ビッグエンディアン、リトルエンディアンなど説明しなければ、ならない部分も結構あります。
 こういう部分の解説は初心者にとっては、あまり面白くないと思います。が、最初は適当に作っていても、もっと高度な事をやりたい場合には、どうしても必要になる知識です。ステップアップしたい方は、いろいろ勉強してみるとよいでしょう。幸いに日本語のFuture BASICのメーリングリストもあることですから、いろいろ質問したりすると良いでしょう。



今回のプログラムリスト
 今回はありませんf(^^;