プログラムはデータ

データ -- コードとデータ

コンピュータは電気で動いています。ってのは知ってますよね。すみません。中の動作は電気信号の遣り取りで決められています。ハードディスク(大抵ファイルを保管する大容量記録装置ですね)やCD、DVDといった、いわゆる記憶(記録)媒体は直接電気で記録してあるわけではありませんが、これを読み取って、電気信号に変換することで初めて、コンピュータの本体もこれを受け入れることができるわけです。"コンピュータの本体"といっても機械の箱のことではなくて、ここまでに述べてきた記憶装置(メモリー)と計算装置という限定された意味です。

コンピュータはこのような電気信号を喰って対応する作業を実行するわけですが、このコンピュータに喰わせてコンピュータを動かすものは、広い意味でデータといわれます。"喰わせる"といっても消費電力のことじゃありませんよ。このデータを"喰う"ことは、普通、"読み込む"といいますね。ロード(load)するともいいます。

このコンピュータに喰わせるデータには、大きくわけて二つの種類があります。一つは、機械に対する動作の命令を意味しているデータ、もう一つは、その命令に応じた機械の動作において使用され、加工されるデータです。前者は、機械(マシン)コード、とか、マシンインストラクションといわれます。多くの場合、短く、"コード"と呼ばれます。後者は単に"データ"といわれる場合が多いような気がします。つまり、コンピュータ(機械)に作業してもらうため入力する必要がある広い意味でのデータの中には、コードと狭い意味でのデータとがあるわけです。どこからがコードで、どこまでが狭い意味でのデータであるかは、"機械"をどのように捉えるかで変わり得ます。コンピュータの中では、大体は上のように演算装置に対する動作の命令になっているもの(インストラクション)をコードとして扱います。

データの中身--ビット

この、広い意味でのデータがどんな電気信号なのかというと、多分聞いたことがあるでしょうが、"あり"と"なし"を適当な順番に並べたものになっているわけです。二つの電極を考えると、"あり"はそれらの間に電位差(電圧)がある状態、"なし"は電位差がない状態のことです。これらの状態が、ひっきりなしに入れ替わるわけで、コンピュータはそれを信号として受け取っています。"あり"を1 、"なし"を0と考えて、二進法を適用するのが、数学的には最も合理的です。実際、コンピュータは2進法の規則に従って処理していると見ることもできます。これを簡単に、コンピュータの内部は2進法を用いて動いている、ともいいます。間違いではないんですが、私個人の趣味としては、コンピュータの電気信号処理方法は2進法で表現できる、という方がいいように思います。ビミョーな違いですが。

2進法で表現した場合の桁一つのことを"ビット(Bit)"と呼びます。2進法で何桁分か、をいうときには、何ビットといいます。多分、聞いたことはあると思いますが、32ビットバソコン、とか64ビットパソコン(今現在は主流が64ビットです)とか、小さい方では、かつては8ビットパソコン、16ビットパソコンもありましたね。これらは、その機械の基本的なデータの記憶/処理単位が、2進法で何桁分あるかを表していたわけです。例えば、32ビットパソコンでは32桁の2進数が基本単位になるわけです。イメージは32個並んだ0と1。あまり見たくありません。ともかく、このとき、通信の際のデータとかを別として、内部で処理されるときには、32桁は一回に処理されるわけです。

32個のON/OFFスイッチが並んでいるのを想像してみてください。で、その横にもう一つ、OKボタンがあるとします。まず、32個のスイッチのON/OFFを並べて、コンピュータにとって意味があるデータを表現するようにしたとします。ON/OFFの並びがきちんとできたところで、OKボタンを押します。すると、この32ビットのデータはコンピュータに送られます。さて、今度は次に入力すべきデータに対応した32個のスイッチON/OFFをつくります。そして、できたらOKボタン....これを繰り返す感じです。このOKボタンを押すという操作は定期的に行われます。次の信号の準備は次の入力のタイミングまでに終わらせるわけです。定期的に、というのは、要は、コンピュータは中に時計(クロック)を持っているわけでして、これを使ってタイミングを取ります。よく、クロック周波数とか、クロックスピードといわれるものがありますね。あれは、大体、中央演算装置に送られる信号のタイミング取りに使われる時計の刻みのことを言っています。細かくいうと、パイプラインとか、細かく分けて併行処理したりして高速化を図っているらしい(理屈から見ると、PowerPCのやり方だと理想的には4倍くらい速くなる)んですが、その説明はすっ飛ばすとして(^^;;)、この時計が一回カチッと刻むと一個の信号が送られて、処理されると考えていいわけです。うちのPPC G3は400MHzです(20世紀末の水準)が、一秒間に4億回(現実は、もうすこし少なくなる)。最近だと、2とか3GHzくらいですか、普通のは。それだと、一秒間に20~30億個。むむむ~、そんなんで、なんでこんなに鈍いんだあ?とか思うことありませんか?ないですか。そうですか。

MHz、GHzは、それぞれ、メガヘルツ、ギガヘルツと読みます。メガは100万、ギガは10億、ちなみにキロは1000。1000倍単位ですね。ヘルツはもともとは人の名前なんですが、一秒間に何回繰り返すかを意味する"周波数"の単位になっています。1Hzで1秒1周期ということです。1周期は、デコとボコの組です。つまり、1GHzなら、デコもボコも、1秒間に各々10億個ということです。デコかボコかどっちかを時計の「カチッ」として捕まえるように決めておけばいいわけです。

2進法の計算規則を少し見ておきますかね。足し算して、2になったら繰り上がるのです。まあ、規則はそれだけです。つまり、
1 + 1 = 10
厳密には、2進法であることをハッキリさせるための印を付けることが多いのですが、まあ、うっとうしいので、このままでいきます。適当に足し算してみると、
101110 + 1010 =  111000
かな。ええと、普通の足し算と同じように、下の桁から足してます。
 101110
+  1010
ああ、いいみたいですね。ひと桁目は0同士なので0で、次の桁は1+1なので0で1繰り上がります。繰り上がった分がまた上の数の1と足されて、0で1繰り上がります。その上の桁は1+1に1繰り上がってきたので、1繰り上がってさらに残りも1。上の数の繰り上がった桁は0なので、繰り上がった分で1。あとは上の数の一番上の桁の1です。

まあ、足し算だけでいいしょう。2進数を普通の10進数に変換する方法も書いておきましょう。下から、一桁目は1の桁、二桁目は2の桁、三桁目は4の桁、四桁目は8の桁、....、n桁めは2n-1の桁です。その桁に対応している数が足される(1)/足されない(0)という規則で変換できます。ちなみに、2xは2をx回掛け合わせた数ということです。2のx乗ですね。0乗するとどの数も1になることになっています。具体例として上の計算に使った数値を変換してみましょう。はじめの数は、2と22と23と25を足せばいいわけですから、
2 + 4 + 8 + 32 = 46
次の数は、簡単に、10とわかりますね。だから、足したら56になるはずです。上の2進数の答えを変換すると、23+24+25なので、
8 + 16 + 32 = 56
でOKです。これで、数そのものと数字とは違うもので、一つのものを一貫した方法で表現する方法は一つとは限らないことがわかる(というか、そう考えることもできる)わけです。プラトン主義ですね。ちょっと難しいですか。

2進法はかなり桁を喰うことがわかりますね。コンピュータが2進法的に動くことに必然性はありません。たまたま、そういう機械が普及しただけです。ただ、たぶんON/OFFしかないという単純さのおかげで、早い時期に実用化にこぎつけられたのでしょう。

データの最小単位 -- バイト

ビットを一個ずつ扱うのは例外で、普通は、特定の桁数ずつまとめて扱います。"基本単位"が32ビットとか64ビットという話はここまでもしてきましたが、ここで最小単位について話をしておきましょう。現在規格とされている最小単位は、8ビットで、この単位はバイト(byte)と呼ばれます。アルバイトのバイトじゃありません(アクセントも"バイ"につけましょう^^;;)。8ビット=1バイトですね。8桁の0-1の集まりです。

1バイトつまり8ビット分の桁数があれば、256種類の違う値を表現することができます。0と1から重複を許してとった8個の順列ですよ。たしか、高校1年くらいの数学だったっけか。苦手な(だった)人には、嫌なこと思い出させてしまいましたね。すみません。マイナスなしだと、0から255までですが、マイナスも許せば、-128から127までです。偶数なのに何でプラスとマイナスがアンバランスなんだ?、とか思いませんか。賢い人は思わないんですかね。私は思いました、初めは。0があるからなんですよ。0がプラスの側の仲間に入ったと思えば、きっちり真ん中で二つに分かれてますね。

なぜ8ビットを1バイトとして最小単位にするのかということに、決定的な根拠はないそうです。初期の頃にIBMがそうしたから、そうなった、ということらしいです。ただ、一定の合理性はあります。まず、それだけの大きさがあれば、ASCII文字といわれている英語のテキストなどで利用する文字、記号が全部入ること。何といっても、英語圏での製品ですからね、コンピュータは。もっとも、1バイトあれば、ひらがな、カタカナと日本語文用の記号一式くらいは入ると思いますが。それに、実際には、ASCIIコードは7ビットに全部入っています。ただ、8というのが、2の倍数、というか23という綺麗な数値なので、何かと便利というのはあります。4ビットだと小さすぎますし、16ビットだと最小単位としては大きすぎるでしょうし。

8ビットが最小単位という意味は、それが値として扱われる最小の大きさであるということです。もっと小さい幅で区切る半端な使い方こともありますが、そういうときは、それを"値"として使うのじゃなくて、フラグ(flag)のような"特殊な使い方"をしていると考えてよいでしょう。

セル

というわけで、32ビットが基本単位なら、4バイトが基本単位なわけです。64ビットなら8バイトですね。このとき、その基本単位バイトを"セル(Cell)"と呼ぶことがあります。つまり、32ビットセル=4バイトセルみたいな言い方です。1セルは、機械に応じて4バイトとか8バイトとかを意味するわけです。セルは"小部屋"(召使いが控えている小さな部屋)という意味らしいですが、最近では、"細胞"という意味も有名ですね。まあ、そういう、パックされた小区画というイメージです。

キロバイト、メガバイト

記録されるデータは日増しに膨大になるので、バイトにも、キロ(K)とかメガ(M)という単位が必要にあるわけです。ところが、ちょっと注意しないといけないのは、バイトに関しては、同じ単位名を使うのに1000倍単位じゃないということです。具体的には、1024倍単位。つまり、1キロバイト(KB)は1024バイト。1メガバイト(MB)は1024キロバイト=104万8576バイト。1ギガバイト(GB)は1024MB=1048576KB=10億7374万1824バイト。ちょっとずつ多いわけです。

なぜそうなっているかというと、バイトに関しては1000の代わりに210が使われているのです。210が都合良く1024で大体1000に近いからです。2の何乗とかいう形になっていると、二進法で考えるときに何かと便利なのでしょう。

もっとも、外付けのハードディスクの容量表示(箱にでかでかと書いてあるやつ)の120GBとかは、1000倍単位で表示されています。つまり、実際には、このGBは7%くらい少ないわけです(120GBだと、うちのHD全容量と大体同じ分くらい少ないですね^^;;)。まあ、製造工程とかも絡んでるのでしょうが、少しでも大きく見せたいのでしょう。一応、詐欺にならないように、かろうじて読めそうな小さい字で注記してあります、普通(^^;;)。

関連したヨタ話ですが、インターネットの回線速度ってのがありますね。うちは24M(メガ)のADSLとか、光で100M、光で共用だけど300Mとかいう、あれです。この単位はご存知でしたか?bps、ビットパーセカンドです。一秒間に何ビット送れるか、ですね。そう、ビットなんですよ。バイトじゃない。だから、回線速度が1メガなら1メガのファイルが1秒で送れるんじゃないんです。ファイルの大きさの単位はバイトですから。1メガのファイルを1秒で送るには、8メガちょっとの回線速度が必要です。"ちょっと"というのは、多分、回線速度のキロやメガは1000倍単位だろうということです(細かいことは知らない)。速い回線の人は、あまり気にしたことないでしょうが。
それと、回線の速さを競う傾向がちょっと前までありましたが、本当に速くするには、配給元のサーバコンピュータ(プロバイダのだけじゃなく)が対応できていないといけないわけです。水路だけ太くしたって、水源の水が涸れてたんじゃ、ちょろちょろしか出ません。もう少し、みんな冷静になった方がいいですよね。最先端とかハイテクとかいって、もう分けもわからず意識朦朧みたいな感じが、結構、ただよってますね。そんなにキーっとなるほどのことはないんですけどね。

データは一旦メモリーへ

さて、大きく迂回してきましたが、2進法で表現できる型式のデータ(コードもそう)は、コンピュータの中心部である演算装置に送られて、コンピュータは意味のある仕事をするわけです。ただし、一個ずつ手入力するというのはもちろん、ディスクから一個一個読み込むというのにしても、そこには物理的な運動が伴いますので、電気的な処理と比べると、遅くて使い物になりません。そこで、データは一旦はメモリーに読み込まれます。そしてメモリから、ものすごい速さで、決められた順に演算装置に送られて行くのです。このタイミング取りにも、クロックが使われています。このクロックは、色々事情があって、普通は演算装置で使われているクロックより、大分遅くなります。機械命令(マシンインストラクション)コードなんかは演算装置のクロック毎に一つは必要になるわけですから、メモリーから演算装置にデータを送るときには、一個ずつ取ってくるのではなくて、ある程度まとめてドドっと読んできて、近くに貯めといたやつを順次実行しているわけですね。つまり、何らかの形で、先読みして、実行まで取っておく機構があるわけです。

だいたい、イメージはつかめましたでしょうか?





最終更新:2019年07月11日 11:40