第76回 プログラムはどのようにして動くのか

「ヒープ領域がわからない」
と言われたので、ちょっとざっくりと説明してみよう。
本当にざっくりとの説明であるので、厳密なところまでは述べない方向でいく。


僕は、答えをぱっと言っちゃうよりも、
今理解したいものを理解するための前提知識から説明するのが好きなので、
ヒープ領域を理解するために必要なもっと前知識からざっくりと説明していく。


実は、前提知識から理解していく方が理解しやすいのだ。

メモリ

プログラムというのはどのようにして動くのだろうか?
ここから始めよう。
プログラムというのはメモリで動くのである。

「メモリというのを知っているかね?」

こう聞くと、コンピュータ業界の人でない人は

「ああ、知っているともUSBメモリのことだね。データを持ち運ぶのに便利なやつさ。なにを今更」

という返事が返ってくることだろう。


本当にこの「メモリ」という単語はどうにかしてほしいのだが、
今回僕がメモリといったものは「USBメモリ」ではなくて、「主メモリ」と呼ばれるやつだ。
「メモリ」というと「記憶媒体」という意味があるので、単に「メモリ」と言えば、「USBメモリ」のことだと思っても問題はないだろう。ただ、プログラマが「メモリ」といったら、「主メモリ」のことと思ったほうがよいだろう。
ちなみに、この「主メモリ」は「メインメモリ」とも言う。


とりあえず、プログラムというのは、この「主メモリ」の上で動くのである。
これは覚えてしまおう。

ハードディスク

それでは、よく耳にする「ハードディスク」とやらはなんなのだろうか?
あいつもなにかを記憶する装置ではないのだろうか?記憶するんだからメモリじゃないの?
と思うかもしれないが、「主メモリ」とは役割が違うのである。だから同じ記憶媒体でも「ハードディスク」という名前を持っている。いま、Wordを実行したいとする。Wordというのはプログラムでできている。しかし、あなたがあのWordのアイコンをクリックしないとそのプログラムは動き出さないのだ。では、動き出す前はどこにいるかというと「ハードディスク」にいるのである。


ハードディスクは、
こんな円盤の形をしている。

Wordのアイコンをクリックすると起こる事

さて、このハードディスクにいるWordを起動するには、クリックが必要なのである。
クリックするとコンピュータの内部で何がおこるかというと、ハードディスクの中にいたWordのプログラムが「主メモリ」に呼び出されるのである。


「主メモリ」はこんな、おやつのウェハースのような形をしている。



クリックすると次の絵のように、プログラムが「主メモリ」に載るのである。

資源

ここで、「資源」という大切な言葉を覚えよう。
「ハードディスク」や「主メモリ」は「資源」と呼ばれるものでもある。


「石油」とか「木」とかと同じ意味合いでの「資源」である。
「石油」とか「木」というのは限りがあるのである。使い果たすとなくなってしまうのである。


「ハードディスク」は画像や動画を置きすぎるともう保存できなくなってしまう。
「主メモリ」はプログラムを乗せすぎると載り切らなくなってしまう(載せる方法はあるけど今回は紹介しない)

限りある資源をどのように使うか

このように限りある資源をうまく使って効率的に使わねばならないだろう。
先ほど、プログラムは「主メモリ」の上で動くといった。


プログラムの中ではデータを扱うことになる。

Hoge h = new Hoge();

たとえばこのJavaの文なら、hという変数はHogeに関する情報(データ)を持つことになる。
この情報は、どこに持つかというと、主メモリに持つのである。
つまり変数を使うたびに、貴重な資源である主メモリをどんどん使ってしまうのである。どんどんどん使っていくとゆくゆくは主メモリに領域がなっくなりプログラムを実行させつづけることができなくなってしまうであろう。

ガベージコレクション

そこで、必要なときだけ主メモリを使い、その変数(厳密には変数が持つデータ)が不要になったら主メモリを解放し、また別の変数が使えるようにすることによって効率的に資源を使う必要がある。それを自動でやってくれるのがガベージコレクションである。

ヒープ領域

それでは、いよいよヒープ領域である。
ヒープ領域とはなんなのかというと、プログラムがデータを扱うための主メモリ上の領域の部分である。
プログラムは主メモリの上で動いている。それとは別に、そのプログラムが扱うデータを乗せる領域がヒープ領域なのである。



このように、プログラムが動いている間、プログラムは熱心に資源を効率よく使う為にヒープ領域にデータを作成したり解放したりを繰り返しているのである。これを自動でやってくれる言語がPerlだったりJavaだったりする。そうでないC言語などでは、ここで解放して! と明示的にプログラムの中に書いてやる必要があるのだ。ちなみに、ガベージコレクションは解放を自動でやってくれるところがミソである。作るところは明示的にnewと書かないといけないのだ。それがnewだ。

注意

スタックについても学んだ方がよいでしょう。
スリードをこの文章では誘うのではないかと相方から注意を今受けました。