Upgrade to Pro — share decks privately, control downloads, hide ads and more …

コンピュータはなぜ0と1なのか / How and Why Computers Operate Using Binary Code

コンピュータはなぜ0と1なのか / How and Why Computers Operate Using Binary Code

PHP勉強会#151の資料です

HASEGAWA Tomoki

April 12, 2023
Tweet

More Decks by HASEGAWA Tomoki

Other Decks in Technology

Transcript

  1. 3 ௕୩઒ஐر ͸͕ͤΘ ͱ΋͖ @tomzoh ٕज़ΧϯϑΝϨϯεӡӦࢀՃ 8FCJ04ΞϓϦ։ൃ  $16 ϨτϩήʔϜػ

    ిࢠ޻࡞ Ϗʔϧ  αοΧʔ؍ઓ ϨϯλϧΧʔτϨʔε ʜ ϥΠϑϫʔΫ
  2. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 0と1しか処理できないコンピュータ • コンピュータは0と1しか処理できない • ソフトウェアエンジニアならなんとなく実感としてもある • 常に2進数が背後にある感じ

    • ビット演算とか浮動小数点演算(の誤差)とか • 文字コードが16進数表記だったり • どうして0と1なのか • 0と1しか無いのにきれいな絵や音を出せるのはなぜか 6
  3. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 現実世界と論理世界 アナログとデジタル • コンピュータ = 電子計算機 (電算機)

    • デジタルの値(離散値)を扱う • コンピュータは現実世界に存在している • 現実世界はアナログの世界 • 電気回路はアナログ • 現実世界に存在する電気回路で数値計算や論理演算をしたい 7
  4. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 電気回路での数値表現 • コンピュータは数値を電気回路の電圧として表現する • ある電圧より高ければ1、低ければ0の2値とする • 電気回路の配線は抵抗があるので遠くでは電圧が下がる

    • メモリから255を読み込んだ時に近いメモリだと255だけど遠いメモリだと254に… • 2値であれば多少下がっても1は1でいられる • 回路を単純にできる • 電気回路上でのCPU • 物理的なCPUは「足」がたくさんある • 足1本=1bitでデータを表現する 8
  5. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPU 中央演算装置 - Central Processing Unit •

    データをどこかから持ってきてもう1つのデータと何らかの演算をし、 
 結果をどこかに保管する装置 • 「どこか」 • レジスタ • メモリ • 入出力(I/O) • CPUの命令は本当にこういう命令しか無い • と言いつつ最近のCPUは機能が多く、機能に関連する命令もたくさんある 16
  6. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか レジスタ CPUに内蔵された爆速メモリ • CPUに内蔵されたメモリ • 「近い方が速い」大原則で爆速 •

    Z80の場合 8bitレジスタ 8個 • 8ビットの値しか格納できない変数が8個だけあるプログラミング言語 • それ以外の値はメインメモリや(入出力(I/O)の先にある)ストレージに保存する • とても遅いのでできるだけ避けたい • 特殊なレジスタ • PC プログラムカウンタ: • 今実行している命令のアドレス • 値を入れるとジャンプになる 17
  7. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 命令の順次実行 実行中アドレスを格納するレジスタ: プログラムカウンタ • CPUはメモリに格納された命令を順番に実行する • 命令を実行し、完了したらPCレジスタの値を+1する

    • すると次のサイクルではメモリの1つ先の命令を実行することになる • データをどこかから持ってきてもう1つのデータと何らかの演算をし、 
 結果をどこかに保管する装置 • ジャンプですらPCレジスタへの値の保存 • 「データをPCレジスタから持ってきてジャンプ先のアドレスを加算し、結果をPCレジスタ に保管する」 • マルチスレッドのCPUはPCレジスタが2つある 18
  8. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 前提事項 • ここからしばらく右の図をベースに説明します • "CPUの創りかた"のTD4 CPU •

    これは概念図ではなく配線図 • 青い箱 IC • 紫色の箱 入力=スイッチ 出力=LED • グレーの箱 ICのピンに分類をつけただけ • グレーの太い線は4本の配線 • つまりこのCPUのレジスタは4ビットの値を保存できる • (あとで出てくる)細い線は1本の配線 20 A レジスタ B レジスタ 入力 PC レジスタ メモリ Address Data 演算器 Decoder 出力 セレクタ
  9. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか AレジスタのIC Aレジスタのリアル見た目 21 A レジスタ B レジスタ

    入力 PC レジスタ メモリ Address Data 演算器 Decoder 出力 セレクタ 入力用 出力用 入力用 出力用 4 BIT SYNCHRONOUS 
 BINARY COUNTERS https://www.ti.com/jp/lit/ds/symlink/sn74hc161.pdf
  10. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか A レジスタ B レジスタ 入力 PC レジスタ

    メモリ Address Data 演算器 Decoder 出力 セレクタ CPUの回路 - TD4の場合 CPU内部のデータの流れ • TD4の構成 • A, B, PCの3レジスタ • 入力/出力 • レジスタと入力/出力は4bit幅 • 動作イメージ • ①レジスタ or 入力のうち1つが選択される • ②選択されたものとメモリの上位4bit → 演算器 • ③演算器の結果 → レジスタ or 出力 • データが循環している 22 CPUの創りかた https://amzn.to/3zOZnRa 4本の信号線 ① ② ③ ③
  11. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか A レジスタ B レジスタ 入力 PC レジスタ

    メモリ Address Data 演算器 Decoder 出力 セレクタ CPUの回路 命令の読み出しとデコード • PCレジスタを担当するIC • 4本の足がメモリと接続されている • 4本の足にアドレスを出力している • メモリはPCレジスタの足が指定したア ドレスのデータを出力している • 上位4ビットは演算に使う • 下位4ビットは命令に使う • 下位4ビットを見てみると… 23 演算4bit 命令4bit
  12. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPUの回路 CPUの命令って何? • メモリの足の状態でデータの流れを 
 コントロールするようになっている セレクタ

    演算器にどのデータを入れるか 演算器 演算の種類 レジスタ/出力 演算器の出力をどこに保管するか • データをどこかから持ってきて 
 もう1つのデータと何らかの演算をし、 
 結果をどこかに保管する装置 • CPU命令: データの流れをコントロールするもの • 右の図で言うとデータの下位4bit 24 A レジスタ B レジスタ 入力 PC レジスタ メモリ Address Data 演算器 Decoder 出力 セレクタ
  13. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPUクロックによる状態遷移 電子ピタゴラ装置 • CPUはクロックにあわせて動く • クロック: 


    定期的に0Vと5Vが切り替わる信号線 • M2だと3.5GHz = 35億回/秒 • 全ICにクロックが入力されている • クロックの立ち上がり(0V→5V) • PCレジスタに1が加算される • セレクタや演算器の状態が確定 • クロックの立ち下がり(5V→0V) • 命令で指定されたレジスタが現在の状態を保 存する 25 A レジスタ B レジスタ 入力 PC レジスタ メモリ Address Data 演算器 Decoder 出力 セレクタ
  14. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか ナンデモ作れるNAND CPUの原子 • レジスタやセレクタ、加算機、メモリ • 論理演算の塊 •

    論理演算: OR, AND, XOR, … • PHPで 0 & 1 = 0, 1 & 1 = 1 とかやる 
 アレと同じ • NOT + ANDのNANDという演算 • CPUに必要な素子はNANDだけあれば 
 組合せで作れる • NANDがあればNANDemoできる • 元気ですか〜! 26 https://basics.k-labo.work/2017/08/31/論理演算/
  15. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか NANDで作るコンピュータ • Nandgame • https://nandgame.com • ブラウザ上でNANDを組み合せてコンピュータを作る

    • 「演算器を作れ」みたいなお題が出てブラウザ上で線を接続して正解を探す • From Nand to Tetris • https://www.nand2tetris.org • NANDでCPUを作ってテトリスを動かす • CPUの創りかた • 言わずと知れた名著 34
  16. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPUが直接実行可能な言語: マシン語 データの取得, 演算, 保存 • CPUの内部で電気回路として表現されたデータ処理

    = マシン語 • データの取得, 演算, 保存 • こんなシンプルなマシン語でPHPやJavaは動いている • C言語はプログラムソースをマシン語に変換しているのでマシン語そのもの • マシン語からPHP, Javaまでのプログラム実行の話は 
 PHP勉強会#147「 プ ロ グ ラムを実行するとは ど ういうことか」参照 38
  17. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 補足: 条件付きジャンプ 演算器のフラグ • さすがに代入とジャンプだけではすべてのプログラムは表現できない • 規定回数のループとか作れないし

    • 演算器は演算結果によってフラグを立てる • 演算の結果が0になったら立つゼロフラグとか • 演算の結果が桁あふれしたら立つキャリーフラグとか • フラグの状態を出力する足がある • 演算命令の次に条件付きジャンプ命令を置く • a = a - 10 の次に jp z, 0x0000 を置く • a = 10 だったら演算の結果が0になりゼロフラグが立った状態で次の命令を実行する • jp z, 0x0000 だと、ゼロフラグが立っていたらジャンプ、立っていなければ次に行く 39
  18. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか まとめ 0と1で表現される電子ピタゴラスイッチ • コンピュータは数値を電圧の高低の2値で表現しているから0と1しか扱えない • コンピュータはCPU, 入出力(I/O),

    メモリからできている • CPUと入出力(I/O), メモリはICの足どうしが導線で接続されている • CPUの中はクロックで状態が遷移する電子ピタゴラスイッチだった • NANDがあればなんでも作れる • ぜひやってみてください! 
 (Nandgameはお手軽でおすすめ) 41 ௕୩઒ஐر ͸͕ͤΘ ͱ΋͖ @tomzoh
  19. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPUと周辺デバイスの通信 • CPUは周辺デバイスと通信するときにアドレスを指定してデータを送受信する • 例えばメモリの場合: • メモリは1つのアドレスに1バイトのデータがある

    • PHPの配列をイメージすると良い • 1バイトの数値が入る巨大な配列 • アドレス指定が64bitなら配列の添字が64bit幅 • 0x0000000000000000〜0xffffffffffffffff • 最大16EB(エクサバイト) • 32bitだと 0x00000000〜0xffffffffの4GB 43
  20. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPUとメモリの接続 CPUがメモリからデータを受け取りたい場合 CPUはメモリにアドレスを指定する アドレス指定用の足の電圧をコントロールする アドレスが0xC001なら 0b1100000000000001なので 


    16本の足の電圧を5V, 5V, 0V, …, 5Vにする メモリは足の電圧を測定する CPUと線でつながっているので16本の足は5V, 5V, 0V, …, 5V。 つまり0b1100000000000001 = 0xC001 とわかる 44 1 1 0 1 CPU MEMORY ? ? ? ? "%%3&44 %"5" "%%3&44 %"5" アドレス 16本 データ 8本 ここからしばらくZ80
  21. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPUとメモリの接続 CPUがメモリからデータを受け取りたい場合 メモリはデータを出力する データ通信用の足の電圧をコントロールする データが0x89なら0b10001001なので 
 8本の足の電圧を5V,

    0V, 0V, … 5Vにする CPUは足の電圧を測定する メモリと線でつながっているので8本の足は5V, 0V, 0V, …, 5V。 つまり0b10001001 = 0x89とわかる 45 1 1 0 1 ? ? ? ? CPU MEMORY ? ? ? ? 1 0 0 1 "%%3&44 %"5" "%%3&44 %"5" アドレス 16本 データ 8本
  22. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか アドレスバス・データバス CPUの話をすると必ずアドレスバス・データ バスという言葉がでてくる アドレスを指定する信号線一式 = アドレスバス データを送受信する信号線一式

    = データバス バスの信号線の数(幅)はCPUによって違う Z80の場合: アドレスバス16bit データバス8bit 46 1 1 0 1 ? ? ? ? CPU MEMORY ? ? ? ? 1 0 0 1 "%%3&44 %"5" "%%3&44 %"5" アドレス 16本 データ 8本
  23. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 読み込み/書き込みの表現 メモリは書き込みか読み込みかどう判断するの? そう思った方は大変鋭い CPUの動作を表す信号線 現在のアクセスがCPUから見て書き込みなのか読み 込みなのかを表す信号線RDとWR RDが有効な時

    メモリはアドレス信号線を見てデータを返す WRが有効な時 メモリはアドレス信号線とデータ信号線を見てデータ を保存する 48 1 1 0 1 1 0 1 0 CPU MEMORY ? ? ? ? ? ? ? ? "%%3&44 %"5" "%%3&44 %"5" 0 ? 1 ? 3% 83 3% 83
  24. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか "%%3&44 %"5" メモリの回路 メモリから値を読み込む時のメモリ内部の動作 • 16本の信号線でアドレス指定 •

    2進数16bitの値→65,535本の うち1本だけが1になっている状態 に変換される • メモリセルが選択されて 
 保存されたデータが電圧の形で 
 再現される • = データ信号線の足の電圧が変わる • この動きは電気回路なので高速 50 MEMORY 1 0 1 1 1 1 0 0 1 1 0 0 0 0 0 0 1 A0 A1 A2 A14 A15 D0 D1 D2 D3 %&$0%&3 16本 65,536本
  25. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか I/O "%%3&44 %"5" 3% 83 CPUと入出力(I/O)の接続 並列接続されてバスを共有するメモリや入出力(I/O)

    CPUとメモリは 
 アドレスバスとデータバスで接続されている CPUと入出力(I/O)は? アドレスバスとデータバスで接続されている メモリと並行に接続されている メモリとI/Oが同時に動いちゃわない? と思った方は鋭い CPUが「おまえな」と指示する信号線がある Z80の場合、メモリ操作をあらわすMEMRQと入出 力(I/O)操作をあらわすIOREQ 51 CPU MEMORY "%%3&44 %"5" "%%3&44 %"5" 3% 83 3% 83 .&.3 32 *03&2 32
  26. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 52 I/O "%%3&44 %"5" 3% 83 CPU

    MEMORY "%%3&44 %"5" "%%3&44 %"5" 3% 83 3% 83 .&.3 32 *03&2 32 I/O "%%3&44 %"5" 3% 83 CPU MEMORY "%%3&44 %"5" "%%3&44 %"5" 3% 83 3% 83 .&.3 32 *03&2 32
  27. 長谷川智希 @tomzoh コンピュータはなぜ0と1なのか コンピュータの構成要素 CPU Central Processing Unit / 中央演算装置

    データをどこかから持ってきてもう1つのデータと何らかの演算をし、 
 結果をどこかに保管する装置 入出力(I/O) メモリ 58