0と1になった後の世界 ― コンピューターが「計算する」「記憶する」仕組み

0と1になった後の世界 ― コンピューターが「計算する」「記憶する」仕組み

記事
IT・テクノロジー

はじめに

前回は、コンピューターが扱う「0」と「1」が、そもそもどこからやってくるのか――波や電気という物理現象がその土台になっている、という話をしました。

今回はその続きです。「電気が流れている(1)」「電気が流れていない(0)」という、たった2つの状態さえ用意できれば、コンピューターはそこから複雑な計算をこなし、さらに計算した結果を記憶しておくことまでできてしまいます。よく考えると、これは結構不思議なことです。単純なスイッチのON/OFFだけで、どうやってそこまでのことができるのでしょうか。

この記事では、次のような順番で、できるだけ具体例を交えながらゆっくり見ていきます。

トランジスタという「スイッチ」の正体
0と1を並べて「数」や「文字」を表す仕組み
スイッチの組み合わせだけで「計算」ができてしまう理由
何十億個ものスイッチを、実際にどうやって作っているのか
電源を切っても消えない記憶と、切ると消えてしまう記憶の違い
メモリを少しでも高速化するための工夫

普段なにげなく使っているパソコンやスマートフォンの中で実際に何が起きているのかが分かると、コンピューターというブラックボックスの解像度が一段階上がります。これからITエンジニアを目指す方にとっても、ここで登場する「ビット」「論理回路」「メモリ」といった言葉は、この先何度も出会うことになる基礎知識です。少し長くなりますが、焦らず付き合ってみてください。

トランジスタという「小さすぎるスイッチ」

screenshot-1788415781339.png

コンピューターの中には、電気の通り道を「開ける」か「閉じる」かを、恐ろしく高速に切り替えられる部品が、何十億個も敷き詰められています。これが「トランジスタ」です。

トランジスタがやっていることは、実はとてもシンプルです。電気を通す(ON)か、通さない(OFF)か、その2つの状態を作るだけです。この「ON/OFF」に、「1」と「0」という意味を割り当てたことが、デジタルコンピューターのすべての出発点になっています。

面白いのは、トランジスタには「ちょっとだけ電気を流す」というあいまいな状態が、原則として存在しないという点です。中間がなく、キッパリ2択だからこそ、ノイズや電圧のわずかなブレに強く、安定して情報を扱えます。アナログな信号のように「だいたいこれくらい」という感覚が入り込む余地がないのです。

そしてトランジスタには、スイッチとしての役割以外に、もう1つ重要な性質があります。それは、「ごく小さな電気の変化で、もっと大きな電気の流れをコントロールできる」という性質です。これは、蛇口のハンドルを軽くひねるだけで、その先につながった大量の水を出したり止めたりできるのに似ています。ハンドルを回す力そのものは小さくても、それによって制御される水の勢いは、ハンドルの力とは比べ物にならないほど大きくなり得ますよね。トランジスタも同じように、小さな電気信号で、大きな電流を思い通りに操ることができます。この性質のおかげで、後述する「論理回路」を何段にも重ねても、信号がどんどん弱まってしまうことなく、正確に計算を続けられるのです。

つまりトランジスタ1個1個は、「電気を通すか通さないかを切り替える、ちっぽけなスイッチ」にすぎません。ですが、この後お話しする「計算」も「記憶」も、すべてこの単純なスイッチの働きの上に成り立っています。まずはこの大前提をしっかり押さえておいてください。

0と1で「数」や「文字」を表す仕組み:ビットとバイト

「世の中には10種類の人間がいる。2進法を理解できる人とできない人だ。」――プログラマの間では有名な小話です。今日はこの章を読み終えたときに、前者になっていただければと思います。

トランジスタのON/OFFという2つの状態を、コンピューターの世界では「ビット」と呼びます。1ビットは「0」か「1」かのどちらかしか表せませんが、これを複数並べることで、もっと大きな数を表現できるようになります。
桁が増えるとなぜ表せる数が増えるのか
私たちが普段使っている10進数は、右から「一の位」「十の位」「百の位」……というように、1つ桁が上がるごとに10倍ずつ大きな重みを持ちます。2進数もまったく同じ考え方で、右から「1の位」「2の位」「4の位」「8の位」……というように、1つ桁が上がるごとに2倍ずつ重みが大きくなっていきます。

10進数と2進数の対応を、簡単な範囲で見てみましょう。

screenshot-1788414734361.png


たとえば2進数の「0110」であれば、「4の位」と「2の位」が1になっているので、4+2で10進数の「6」だ、と読み解くことができます。このように、それぞれの桁が「その桁の重みを足すかどうか」を表しているだけなので、桁数(ビット数)が1つ増えるたびに、表現できる数の範囲はちょうど2倍に広がっていきます。8ビットまとめると「1バイト」という単位になり、0から255までの256通りの値を表現できます。

文字も結局は「数」として表されている

ここで少し実用的な話をすると、コンピューターは文字も0と1の組み合わせとして扱っています。半角のアルファベットや数字、記号を7〜8ビットの数値に対応させる「ASCII(アスキー)コード」という昔からの取り決めでは、たとえば半角の大文字「A」は、10進数で65、2進数にすると「01000001」という8ビット(1バイト)のパターンに対応しています。

つまり、あなたがキーボードで「A」というキーを押した瞬間、コンピューターの内部では「01000001」というビット列が作られ、それがこの後お話しする回路やメモリの中を、電気信号として駆け巡っているのです。ちなみに、日本語のひらがなや漢字、絵文字などは、ASCIIだけでは表現しきれないため、現在では「UTF-8」をはじめとする、より多くの文字を表現できる方式が広く使われています。仕組みの基本は同じで、「どの数値の並びに、どの文字を対応させるか」というルールを世界共通で決めているだけです。

ビット数が増えると何が嬉しいのか

ここで、ビット数と「一度に扱える数の大きさ」の関係も見ておきましょう。

8ビットなら、0〜255までの256通り
16ビットなら、0〜65,535までの65,536通り
32ビットなら、0〜約42億までの通り
64ビットなら、0〜約1844京(けい)までの通り

パソコンの歴史を振り返ると、一度に処理できるビット数は16ビット→32ビット→64ビットと大きくなってきました。ビット数が増えるメリットは、単に「大きな数を扱えるようになる」ことだけではありません。一度にやり取りできるデータの量そのものが増えるため、計算や処理のスピードも向上します。

もう1つ、実務的にも影響が大きかった例を挙げると、32ビットのシステムでは、メモリの「番地(アドレス)」も32ビットの数値で管理していたため、理論上扱えるメモリの上限がおよそ4GB(2の32乗バイト)に制限されていました。パソコンに8GBや16GBのメモリを積んでも、32ビット版のOSではその全部を使い切れない、という状況が実際に起きていたのです。64ビット化によってこの上限が一気に広がったことで、大容量のメモリを積んだパソコンが当たり前になった、という経緯があります。皆さんのパソコンのスペック表で見かける「64bit版OS」という表記は、まさにこの「一度に64ビット分の情報をまとめて処理できる」という意味なのです。

論理ゲート:単純なON/OFFが「計算」に変わる瞬間

トランジスタは電気を通す・通さないを切り替えるだけの部品なのに、なぜコンピューターは複雑な計算までこなせるのでしょうか。その鍵は「論理回路」にあります。

まず、ON/OFFという2つの状態は、「真(true)」と「偽(false)」という論理的な概念にも対応させることができます。これを使って、次のような基本的な「論理演算」を電気回路として組み立てることができます。

AND(論理積):2つの入力が両方とも1のときだけ、出力が1になる
OR(論理和):2つの入力のどちらか一方でも1なら、出力が1になる
NOT(否定):入力が1なら0を、0なら1を出力する(入力を反転させる)

言葉だけだとイメージしづらいので、入力の組み合わせと出力の対応(「真理値表」と呼ばれます)を表にしてみます。

screenshot-1788414838485.png

これらの基本的な演算を行う小さな回路のことを「論理ゲート」と呼びます。そして、この論理ゲートをいくつも組み合わせることで、足し算を行う回路(加算器)まで作ることができます。

実際に「1+1」を計算させてみる

たとえば2進数の世界で「1+1」を計算すると、答えは「10」になります(10進数の2のことです)。これは、「1の位」が0になり、繰り上がって「2の位」に1が立つ、ということです。この「2つの入力を足して、答えの数字(和)と、繰り上がり(桁上がり)の2つを出力する」回路のことを「半加算器」と呼び、AND回路とOR回路、NOT回路の組み合わせだけで作ることができます。

半加算器だけでは「下の桁からの繰り上がり」を受け取れないため、これに繰り上がりの入力も扱える機能を足した「全加算器」を、桁の数だけ横につなげていくと、どんな大きな桁数の足し算でも実行できる回路が出来上がります。たとえば2進数の「011」(10進数の3)と「010」(10進数の2)を全加算器で足し合わせると、右の桁から順に「1+0=1」「1+1=10(0を書いて1繰り上げ)」「0+0+繰り上がりの1=1」と計算が進み、最終的に「101」(10進数の5)という正しい答えが導き出されます。

掛け算や引き算、割り算も、突き詰めればこの足し算の回路の組み合わせや工夫によって実現されています。つまり、コンピューターは「魔法のように賢い」わけではなく、「単純なON/OFFのスイッチを、ものすごい数だけ、ものすごい速さで組み合わせている」だけなのです。それだけのことで、複雑な計算からゲームの映像処理まで、あらゆることをこなしてしまうのですから、改めて考えるとすごい話です。

何十億個ものスイッチを、どうやってシリコンに刻み込むのか

トランジスタは、1947年にアメリカの研究機関で発明されました。当時は1個ずつ手作業に近い形で作られていましたが、現代のコンピューター用チップの中には、爪の先ほどの面積に何十億個ものトランジスタが詰め込まれています。これを実現しているのが「半導体製造」という技術です。

大まかな流れを紹介します。

1.「シリコン」という物質(半導体の性質を持つ)を、非常に薄い円盤状の板(シリコンウエハー)に加工する
screenshot-1788416098299.png

2.その表面に、光を当てると性質が変化する薬品(フォトレジスト)を塗る
3.回路の設計図が描かれた型(マスク)を通して、紫外線やレーザー光を照射する。光が当たった部分と当たらなかった部分とで、化学的な性質に差が生まれる
4.薬品を使って、不要な部分を洗い流す(エッチング)。これにより、シリコンの表面に極めて微細な回路パターンが刻まれる。さらに、特定のごく微量な不純物(異なる元素)を注入することで、その部分だけ電気の流れやすさを変化させる。これにより、電気を通しやすい領域と通しにくい領域の境目が作られ、それがトランジスタとしてのスイッチの役割を果たすようになる
screenshot-1788416461444.png

この工程を、位置をわずかにずらしながら何度も繰り返すことで、1つのシリコンの板の上に、信じられないほど複雑な回路を何層にも重ねて作り上げていきます。

なぜ「小さく作ること」がそんなに重要なのか


トランジスタを小さくできると、何がうれしいのでしょうか。まず単純に、同じ大きさのシリコンの板の中に、より多くのトランジスタを詰め込めるようになるため、チップ1個あたりの処理能力が上がります。また、トランジスタ同士の距離が近くなることで、電気信号が移動する距離も短くなり、動作速度の向上や消費電力の低減にもつながります。私たちのスマートフォンが、年々性能を上げながらもバッテリーの持ちを維持・向上できているのは、こうした微細化の積み重ねによるところが大きいのです。私たちが手にしているスマートフォンやパソコンの中には、こうした気の遠くなるような精密加工の結晶が収められているわけです。
※スマートフォンの新製品発表などで、「3ナノメートルプロセス」といった表現を目にしたことがあるかもしれません。これは、回路の中で最も細かい部分の加工精度を表す数値で、この数字が小さいほど、より微細なトランジスタを作れる技術だということを意味します。 

記憶にも2種類ある:フラッシュメモリとRAM

ここまでで、0と1を「計算」に変える仕組みが見えてきました。次は、その計算した結果を「記憶」しておく仕組みに話を移しましょう。実は一口に「記憶」といっても、コンピューターの中には性質がまったく異なる2種類の記憶装置が使い分けられています。

電源を切っても消えない記憶:フラッシュメモリ

screenshot-1788416911502.png

USBメモリやSDカード、スマートフォンの本体ストレージ、そして最近のパソコンでは標準的になった「SSD」などに使われている「フラッシュメモリ」は、電源を切ってもデータが消えないという特徴を持っています。

その秘密は、トランジスタの構造そのものにあります。通常のトランジスタに加えて、「フローティングゲート」と呼ばれる、絶縁体にすっぽりと包まれた、電気的に孤立した層をもう1つ持たせているのです。

データを書き込むときは、強い電圧をかけることで、電子を無理やりこのフローティングゲートに送り込みます。フローティングゲートは周囲を絶縁体で囲まれているため、一度中に入った電子は、電源を切っても自然に逃げ出すことができません。まるで、周りをぐるりと壁で囲まれた小部屋に閉じ込められたようなものです。

この「フローティングゲートに電子が捕まっているかどうか」によって、そのトランジスタに電流が流れやすいか流れにくいかが変わります。これを読み取ることで、「1」か「0」かを判定できるというわけです。データを消去するときは、逆向きに強い電圧をかけて、捕まっていた電子を強制的に追い出します。

電源が切れても情報が保持される代わりに、フラッシュメモリは書き込みや消去のたびに強い電圧をかける必要があるため、同じ場所への書き込み回数には上限がある、という弱点も持っています。

電源を切ると消えてしまう記憶:RAM(メインメモリ)の仕組み

screenshot-1788416749930.png

一方、パソコンの動作中に一時的なデータを保持している「RAM(メインメモリ)」は、フラッシュメモリとはまったく異なる仕組みで、しかも電源を切ると中身が消えてしまいます。

RAMの中の1つ1つの記憶単位(セル)は、基本的に「1個のトランジスタ」と「1個のコンデンサー」の組み合わせでできています。コンデンサーは、以前の記事でも紹介した「電気を一時的に蓄える部品」です。このコンデンサーに電気が蓄えられている状態を「1」、蓄えられていない状態を「0」として扱います。

ただし、コンデンサーに蓄えられた電気は、放っておくと自然にわずかずつ漏れていってしまいます。そのままでは記憶している内容がすぐに失われてしまうため、RAMは1秒間に何千回もの頻度で、すべてのセルの状態を読み取っては同じ内容を再度書き込み直す、という「リフレッシュ」という作業を絶えず繰り返しています。この定期的な再充電をし続けることで、初めて情報を保持し続けることができるのです。この「絶え間ない再充電が必要」という性質こそが、電源を切るとデータが消えてしまう理由です。

RAMの中で目的のデータにたどり着くためには、格子状に張り巡らされた配線が使われます。

アドレス線:「何番地のデータを読み書きしたいか」という場所の情報を伝える配線
データ線:実際に読み書きするデータの値(1か0か)をやり取りする配線

これらの配線が、格子のように縦横に交差しており、ちょうど碁盤の目のように、行(アドレス線側)と列(データ線側)の組み合わせで、無数にあるセルの中から目的の1つを正確に指定できるようになっています。

ちなみに、ここで説明したRAMは、より正確には「DRAM」と呼ばれる種類です。実はCPUの内部には、これとは別に「キャッシュメモリ(SRAM)」という、もっと小さいけれど桁違いに高速な記憶装置も組み込まれています。CPUがよく使うデータをこちらに一時的に置いておくことで、比較的低速なメインメモリへのアクセス回数を減らし、全体の処理速度を稼ぐ、という工夫がされています。この話はまた別の機会に詳しく触れたいと思います。

フラッシュメモリとRAM、何が違うのか

ここまでの内容を、簡単な表で整理しておきましょう。

screenshot-1788414781276.png


パソコンを使っていて「メモリ」と「ストレージ(保存容量)」という、似ているようで違う2つの言葉が出てくるのは、まさにこの2種類の記憶装置の役割の違いを反映しているのです。

メモリの速度をさらに引き上げる工夫

CPU(プロセッサ)の処理速度がどんどん向上していく一方で、メモリとのデータのやり取りの速度が追いつかなければ、コンピューター全体の性能はそこで頭打ちになってしまいます。この課題に対応するため、メモリの世界でも様々な高速化の工夫が重ねられてきました。

そもそも「クロック」とは何か

工夫の中身を理解するために、まず「クロック」という言葉を押さえておきましょう。コンピューターの内部では、あらゆる部品がバラバラのタイミングで勝手に動いてしまうと、データの受け渡しがかみ合わなくなってしまいます。そこで、一定の間隔で規則正しく刻まれる電気信号のリズムを全体で共有し、そのリズムに合わせて各部品が動作するようになっています。この基準となる信号のことを「クロック信号」、略して「クロック」と呼びます。オーケストラでいう指揮者のタクトや、メトロノームのようなものだとイメージすると分かりやすいと思います。

CPUのスペック表でよく見かける「動作周波数3.5GHz」といった表記は、まさにこのクロック信号が1秒間に何回打たれるか(この例では1秒間に35億回)を表す数値です。

DDR:クロックの「上がり」と「下がり」の両方を使う

その1つが「DDR(Double Data Rate、ダブルデータレート)」という方式です。従来の方式では、クロックの波が1回上下する間に、データのやり取りを1回だけ行っていました。

DDR方式では、クロックの波が「上がるとき」と「下がるとき」の両方のタイミングでデータをやり取りします。クロックそのものの速さを上げなくても、単純に計算して2倍のデータ量を送れるようになる、というわけです。その後もDDR2、DDR3、DDR4、DDR5と規格が世代交代するたびに、内部の並列処理の工夫や動作電圧の見直しが重ねられ、速度の向上と消費電力の低減が同時に進められてきました。

まとめ

今回は、コンピューターが0と1をどう「計算」に変え、どう「記憶」しているのかを見てきました。

トランジスタは、電気を通す・通さないを切り替える小さなスイッチであり、同時に「小さな電気で大きな電気を制御する」性質も持つ
複数のビットを組み合わせることで、コンピューターはより大きな数や文字を表現できる。「A」という文字も、内部では「01000001」という8ビットのパターンとして扱われている
扱えるビット数(16/32/64ビット)が大きいほど、扱える数の範囲も、一度に処理できるメモリの容量も、データ処理の速度も向上する
AND・OR・NOTという単純な論理演算を行う「論理ゲート」を組み合わせることで、足し算などの計算を行う回路(加算器)が作られる
何十億個ものトランジスタは、シリコンの板に光や薬品を使って精密に回路パターンを刻み込む「半導体製造」という工程で作られている。トランジスタを小さく作れるほど、性能と省電力の両方が向上する
フラッシュメモリは「フローティングゲート」に電子を閉じ込めることで、電源を切ってもデータを保持できる。一方RAMは「コンデンサーに電気を蓄えているかどうか」でデータを表すが、絶え間ない「リフレッシュ」が必要で、電源を切ると内容が消える
クロックという規則正しい信号のリズムに合わせて部品は動作しており、DDR方式のように、クロックの上がり・下がりの両方でデータをやり取りする工夫によって、メモリの転送速度は世代を追うごとに向上してきた

「電気が流れる/流れない」という、たったそれだけの単純な仕組みの積み重ねが、これほど複雑で高度な処理を実現しているという事実は、何度考えても不思議な気持ちになります。あなたが今この文章を読むためにキーボードやスマートフォンの画面に触れたその瞬間にも、無数のトランジスタが0と1を作り、論理回路がそれを処理し、メモリがそれを覚えておく――という一連の流れが、目にも留まらぬ速さで起きています。普段はブラックボックスとして扱ってしまいがちなコンピューターの中身も、こうして1つずつ紐解いていくと、思いのほかシンプルな原理の集合体だということが見えてきます。


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す