コンピュータが動く仕組み
ときたま最近のコンピュータ事情なんか全然知らないのに、みつけたコンピュータ言語を適当に操ってプログラムを書いちゃう人というのがいます。 うちの父親なんかがそうですが、みなさんの周りにもいませんか? I/O、マイコン世代、昔取った杵柄…だけでかたづけてしまうのもあれなので、何故こんなことができるか、、というのを考察してみます。
ストアドプログラム方式。 フォン・ノイマンらが考え出したコンピュータの処理方式のひとつで、いまのコンピュータのほぼ全てはこの方式で動いています。(他はニューロコンピュータとか?)
ストアドプログラム方式はメモリに蓄えたコードを CPU が解析して動作するというのが基本的な考え方ですが、「コンピュータを適当に操る人」というのはこのことを知っている人種です。 もっとくだけていえば、マシン語をしっています。
マシン語というのは CPU が唯一解釈できるコードです。 CPU は、PHP も分からなければ C も Java も分かりません。 最近の PC では、 x86 といわれるマシン語コードしか解釈できません。 高級言語はそれぞれのインタプリタやコンパイラなどによって、必ずコードをマシン語に変換して処理を行っています。 Windows でいえば .exe ファイルの中身、あれがマシン語です。
マシン語はいわるゆ高級言語とくらべるまでもなく不可解な見た目をもち、また単純なことしかできません。 .exe をテキストエディタで開いてしまってショックを受けたことありませんか?。。
例えば…
00111110 00000001
??。 コンピュータは2進数(電圧が High か Low か)で動きますのでこんな感じになります。 メモリという仕組みは、この2進数を保持するハードです。 この保持された2進数の羅列を CPU は順次読み取っていき、処理を進めます。
でこのコードが何をやっているかというと、
00111110 00000001 : 3E 01 : LD A,1
真ん中の「3E 01」は2進数をみやすいようにぼくが16進数に書き換えただけです。 その隣が訳の分からない2進数の羅列を、まだ人間にも分かりやすいオペランドという形に書き換えたものです。(これは CPU のマニュアルに書いてある)
で、LD というのは高級言語でいう = を表します。 ということで、A という変数(マシン語ではレジスタといいます)に 1 をいれる。 という命令であることが分かりました。 00111110 が LD A, までを表し、00000001 が値である 1 を表します。
ということは、A にいれれる値は 00000000 ~ 11111111 ということになります。 10進数で言えば、0 ~ 255。 どこかでみたことがある数字ですね。 8bit のコンピュータで小細工なしに表現できる最大の数字です。 ファミコンの RPG をやるとステータスとかの MAX は 255 のことが多いですが、この辺が関係している訳です。 ちなみに、お金は 65535 までとか。 これは 8bit を 2つ組み合わせて 16bit にしたときの最大値です。 最近のコンピュータは 32bit とか 64bit とかを普通に扱えます。 上の例は Z80 という大昔の 8bit CPU のコードです。
こういったマシン語コードは、レジスタへの値の代入とか、比較、条件ジャンプといったごくごく単純な機能しか持ちません。 高級言語の変数と違いレジスタの数は限りがあったり、便利な計算もできません。 昔の CPU なんか小数点はおろか、整数の割り算、かけ算すら出来ませんでした。(足し算の繰り返しをしたり筆算の方式をそのままプログラムしたりして対応していた。)
さて、「コンピュータを適当に操る人」ですが、彼らはマシン語をしっています。 なので、高級言語を操る場合もコンピュータがどういった処理を行っているのかという、ある程度の予測がつくのです。 言語系の設計者の気持ちになれるので、まぁ適当にできちゃうわけですね。 🙂
今はまず PC を使っていてマシン語にふれることなんかないと思いますが、せっかくなので最後にコンピュータをつかさどる2進数とメモリについて一番身近なものでご紹介。
みんなが見ている画面。 モニタに映っているもの。 これこそメモリの中身であり、2進数の羅列です。 グラフィックカードを買うと、メモリ何メガとかってかいていますが、モニタに映っているのはそのメモリがダンプされた様子です。
0 が黒、1 が白でメモリの内容をモニタに映すハードウェアがあるとします。 これでモノクロ表示ができあがります。 あとは、左上のアドレスに、 LD A,1 とかってやれば白い点がひとつ表示される。 ループで全部メモリを 1 にすれば真っ白な画面に…。 1 と 0 でそれっぽい形をつくってメモリに入れれば、マウスカーソルが。
白黒がいやならば、ひとつの点を表示するメモリの固まりを 2bit にして、00 で黒、01 で灰色、10 でグレー、11 で白とすれば4色表現できます。 これを増やして 8bit にすれば 256色。 16bit で 65536 色。 24bit で 1677万なにがし色。 どっかでみたことのある数字ですね。 😛
美しい CG を見ながら PC の中のこびとさんに想いをはせるのも一興です。
From: おで(Odyssey) - 2006/11/20 Monday (Comment)
ノイマンというのはノイマン境界のノイマンさんかな?
っとちょっと知ってる名前が出てたから脊髄反射してしまった…。
FCのドラクエ1、2は65536ゴールドまででしたねぇ。
この世の果てで文系志望を後悔しているおで。
From: ひろまさ - 2006/11/21 Tuesday (Comment)
ノイマン境界って食べられますか? 😈
CPU の性能向上とともにゲーム世界にインフレの波が?!?!