なぜ今時のコンピュータのビット数 (語長) は2の冪乗なのか? | プログラムは楽しげに走らねばならない♪

なぜ今時のコンピュータのビット数 (語長) は2の冪乗なのか?

最近メチャ忙しいので,ブログを更新する暇がない.ホームページの方はわずかずつ更新していて,区切りのいいところでこちらでアナウンスしようと思っているのだが,なかなか区切りのいい時が来ない.orz


ところで今日,OKWave で上記タイトルに近い質問 があったので,面白いと思って回答を書いて投稿しようとしたらちょっと前に締め切られていた.○| ̄|_


せっかく書いたのだから少し文面を修正してここで公開することにする.上記の質問に対する回答として書いたので,プログラマでない一般ユーザにもだいたいわかると思う.


最近普及しているコンピュータ (CPU) は8ビット,16ビット,32ビット,64ビット,128ビットなど,一度に処理できるビット数 (語 (ワード) の長さ) が2の冪乗 (べきじょう) になっている.「なぜ今時の CPU のビット数 (語長) は2の冪乗なのか?」と聞かれて,「コンピュータは2進数を使用するから2の冪乗がキリがいい」というところまでは誰でも思い浮かぶだろうが,「語長が2の冪乗でキリがいい」と具体的にどう都合がいいのか,ちゃんと理解している人はどのくらいいるのだろうか? 上記の質問 に対する回答を見ても,質問の核心に答えている人はいない.私も今までちゃんと考えたことがなかったので,今回考えてみた.

質問タイトル:何で今時のコンピューターは8の倍数が基本なのか

『コンピュータで16進法を使うのは集積回路に乗っている石 (メモリ?)の分子構造が8を規準にしていて、
8の倍数である16進法を使うと都合が良いからだ』

みたいな事を昔聞いた記憶があるのですが、それらしい記事を検索しても見あたりません。

要は何で今時のコンピューターは8の倍数が基本なのか?
それは素材の物理的性質に基づいた物なのか?

まず「8の倍数」というのは正確ではなくて,「2の冪乗かつ8の倍数 (8,16,32,64,…)」が正しい.「8の倍数」だけだと24ビット CPU とか,40ビット CPU とかもアリになってしまう(昔は24ビット CPU もあったような気がするが…).


で,そうなっている理由はコンピュータや石 (半導体)の物理・化学的な性質とは全く無関係なので,

『コンピュータで16進法を使うのは集積回路に乗っている石 (メモリ?)の分子構造が8を規準にしていて、
8の倍数である16進法を使うと都合が良いからだ』みたいな事を昔聞いた記憶がある

という伝聞がこのとおりならば,半導体のことも,コンピュータのことも知らない素人が知ったかぶりで言ったことに間違いない.(つまり全くデタラメなトンデモ説.)


余談:さらに追い討ちをかけると(笑),「8の倍数である16進法」というのもおかしい.「(8の倍数) 進法」が都合がいいということであれば,24進法,40進法などもOK ということになるが,これらは2進法とは全く親和性がない.

ワードマシン

昔は「8の倍数でない」ビット数を1語 (ワード) にしたコンピュータ(12ビットマシン,36ビットマシンなど) も普通に存在していた.こういうマシンを「ワードマシン 」という.例えば1ワード=12ビットのマシンは,メモリを一度に12ビット読み書きする.


ワードマシンは今でも少し残っているらしい.例えば ACOS-6 (NEC 製メインフレーム) は36ビットのワードマシンである.


余談:上記のACOS-6 のページに「1バイト=ビット」と書いてある点に注意.ほとんどの場合「1バイト=8ビット」なので1バイトは必ず8ビットだと思っている人も多いと思うが,1バイト が8ビット以外の場合もある.
(だから通信の分野では,8ビットを「バイト」とは呼ばずに「オクテット 」という.)

キャラクタマシン

昔のコンピュータに「6の倍数」(12,36など) を語長とするものが多かった理由は,初期に使われた文字コード (EBCDIC またはその原型? 各メーカが独自に拡張して今でも使われているらしい)が6ビット (英大文字+数字+若干の記号,小文字は使えない) だったことに由来する.例えば36ビットマシンならば,1語に丁度6文字入る (6ビット×6文字=36ビット).


このように,6ビット文字 (キャラクタ) 単位でデータを扱うマシンを「キャラクタマシン 」ともいう.

なぜ「計算機」なのに「文字 (キャラクタ)」が重要だったのかというと,事務処理の分野では純粋な2進法ではなく10進法で計算しなければならない場合が多いためらしい(この分野で仕事をしたことがないので伝聞形).


計算速度という点では,純2進数で計算する方が単純かつ高速なので,科学技術計算分野ではそうする.しかし純2進数 ⇔ 10進数の変換をしようとすると,小数の場合に誤差が出ることがある (10進小数は2進小数で正確に表現できない場合がある).これは特に金額を計算する場合にはまずいので,事務計算では10進数の文字列に近い形式 (BCD ) を使い,純2進数ではなく10進数で計算するのが普通らしい.だからキャラクタマシンがヒットしたのだろう.


その後標準的な文字コードとしてASCII が普及したが,これは7ビットなので,従来の6ビット系キャラクタマシンでは効率良く扱えない.


また余談:世界初のマイクロコンピュータ (マイコン) は4ビットのIntel 4004 (1971年) だった.これは電卓用として開発されたので,10進数を文字列として表現するのではなく,10進数の各桁を4ビットの2進数として扱うことを想定していたはず.それ以上ビット数を増やすと回路規模が大きくなり,当時の集積回路技術ではコストがかかりすぎるので4ビットにしたのだろう.

ようやく本題:CPU の語長が2の冪乗だと,具体的に何が都合がいいのか?

私の (プログラマとしての) 経験から具体的なメリットを挙げてみる.
(実際にそういう語長が出現 ~普及した経緯についてはコンピュータ史を色々調べてみる必要がある.昔からそうしたいと思っているのだが….)

  1. なぜ8ビットの倍数でなければならないか?

    標準的な文字コードとして ASCII (7ビット) が普及した. その後制定された各国のさまざまな文字コードも最低7ビットが必要で, 普通は8ビットを単位としている. したがって1バイト=8ビット単位でデータを処理するマシン (バイトマシン ) でないと,文字情報を効率良く扱えない.

  2. なぜ語長が2の冪乗でなければならないか?

    プログラムを書いていると,あるサイズ (ビット数またはバイト数) のデータを記憶するのにメモリが何語 (または何バイト) 必要か, といった計算をしなければならないことがしょっちゅうある (プログラマが意識していなくて,コンパイラがやっている場合も多い). これを次のようなたとえ話で考えてみよう.

    「N個の同種の品物 (ビット) がある.1つの箱 (語またはバイト) にはM個の品物が入れられる.いくつの箱が必要か?」

    例えばN=789個の品物があったとして,1箱にM=12個入るとすれば, N÷M=65あまり9なので66箱必要ということになる. しかし割り算を筆算でするのは手間がかかる. (コンピュータは自分で計算しなければならないので, このたとえ話で「電卓を使う」というのはナシ.)

    人間は10進数で計算するので,Mが10の冪乗 (10,100,1000,…) だったらわざわざ筆算しなくても, 小数点の位置をずらすだけで簡単に答えが出る.

    コンピュータは10進数ではなく2進数を使うので, 語という「箱」やバイトという「小箱」の大きさが2の冪乗ならば, わざわざ時間のかかる割り算をしなくても,(小数点の代わりに) ビットの位置をずらす (シフト) だけですぐに答えが出るので,処理が高速に行える. プログラムの中ではこういう計算を頻繁に行うので, 語やバイトが2の冪乗でないと,処理が非常に遅くなる場合がある.

    (最近のパソコンに使われている CPU は,乗除算を高速に行う回路を持っている. しかし家電製品などに組み込まれている CPU は,低価格化, 低消費電力化などのためにそういう回路は付いていないことが多いので, 乗除算には時間がかかる.)