プログラム講座 初級編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ビットは24で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ビットは28ですので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バイトづつ「アドレス(番地)」が割り振られています。
0 | 223 |
1 | 125 |
2 | 0 |
3 | 0 |
: | : |
65534 | 90 |
65535 | 33 |
といった具合です。メモリは通常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&= )→ | | 123 |
| 4252 | 13 |
| 4253 | 13 |
| : | : |
| 6022 | 225 |
| 6023 | 7 |
◆ハンドル
ポインタの次はハンドルです。ハンドルは「ポインタのポインタ」と呼ばれることが多々あります。ポインタはメモリのアドレス(番地)を直接指していましたが、ハンドルは間接的に指しています。なぜ、間接的に指さなければいけないのか? これはメモリを効率よく使用するためです。特に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&= )→ | | 233 |
| | 1002 | 233 |
| | 1003 | 192 |
| | : | 128 |
| | 55550 | 91 |
| | 55551 | 19 |
◆終わりに
長くなりましたので、メモリ関係は初級編10でも連続して解説します。初級編10では実際にメモリを確保して値を書き込んでみる、という処理を行ってみます。メモリの確保、破棄、ハンドルのロック、ビッグエンディアン、リトルエンディアンなど説明しなければ、ならない部分も結構あります。
こういう部分の解説は初心者にとっては、あまり面白くないと思います。が、最初は適当に作っていても、もっと高度な事をやりたい場合には、どうしても必要になる知識です。ステップアップしたい方は、いろいろ勉強してみるとよいでしょう。幸いに日本語のFuture BASICのメーリングリストもあることですから、いろいろ質問したりすると良いでしょう。
◆今回のプログラムリスト
今回はありませんf(^^;