Slide 1

Slide 1 text

長谷川智希 @tomzoh 2023/04/12 PHP勉強会@東京 #151 コンピュータはなぜ0と1なのか アナログの現実世界と電子計算機

Slide 2

Slide 2 text

2 ௕୩઒ஐر ͸͕ͤΘ ͱ΋͖ @tomzoh http://www.dgcircus.com デジタルサーカス株式会社 副団長CTO ॴଐ ٕज़ΧϯϑΝϨϯεओ࠻ دߘɾஶॻ 来たれ!PHPer!We are hiring!

Slide 3

Slide 3 text

3 ௕୩઒ஐر ͸͕ͤΘ ͱ΋͖ @tomzoh ٕज़ΧϯϑΝϨϯεӡӦࢀՃ 8FCJ04ΞϓϦ։ൃ $16 ϨτϩήʔϜػ ిࢠ޻࡞ Ϗʔϧ αοΧʔ؍ઓ ϨϯλϧΧʔτϨʔε ʜ ϥΠϑϫʔΫ

Slide 4

Slide 4 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 4 コンピュータはなぜ0と1なのか アナログの現実世界と電子計算機

Slide 5

Slide 5 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPUによって設計が違ったり わかりやすさを優先して単純化して 
 説明している箇所があります 5 Disclaimer

Slide 6

Slide 6 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 0と1しか処理できないコンピュータ • コンピュータは0と1しか処理できない • ソフトウェアエンジニアならなんとなく実感としてもある • 常に2進数が背後にある感じ • ビット演算とか浮動小数点演算(の誤差)とか • 文字コードが16進数表記だったり • どうして0と1なのか • 0と1しか無いのにきれいな絵や音を出せるのはなぜか 6

Slide 7

Slide 7 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 現実世界と論理世界 アナログとデジタル • コンピュータ = 電子計算機 (電算機) • デジタルの値(離散値)を扱う • コンピュータは現実世界に存在している • 現実世界はアナログの世界 • 電気回路はアナログ • 現実世界に存在する電気回路で数値計算や論理演算をしたい 7

Slide 8

Slide 8 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 電気回路での数値表現 • コンピュータは数値を電気回路の電圧として表現する • ある電圧より高ければ1、低ければ0の2値とする • 電気回路の配線は抵抗があるので遠くでは電圧が下がる • メモリから255を読み込んだ時に近いメモリだと255だけど遠いメモリだと254に… • 2値であれば多少下がっても1は1でいられる • 回路を単純にできる • 電気回路上でのCPU • 物理的なCPUは「足」がたくさんある • 足1本=1bitでデータを表現する 8

Slide 9

Slide 9 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 9

Slide 10

Slide 10 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 10 数値を電圧の高低の2値で 
 表現しているから A Q コンピュータはなぜ0と1なのか

Slide 11

Slide 11 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか もう少し深掘りする 11

Slide 12

Slide 12 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか なぜ電圧の高低でコンピュータができるのか • コンピュータはなぜ0と1なのか • 数値を電圧の高低の2値で表現しているから • 電圧の高低からvar_dump()ができるの…? • 遠すぎない…? • PHPはマシン語で書かれたプログラム • せめて電圧の高低からマシン語が動くところまで解説 12

Slide 13

Slide 13 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか コンピュータの構成 13

Slide 14

Slide 14 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか コンピュータの構成 コンピュータはCPUと入出力、 メモリで構成される CPUを中心に接続されている CPUは… メモリを読み書きする 入出力(I/O)にアクセスする これで「コンピュータ」になる 14 CPU メモリ I/O コント ローラ GPU USB Blue tooth 入出力 I/O

Slide 15

Slide 15 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPU: 中央演算装置 15 Central Processing Unit

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 命令の順次実行 実行中アドレスを格納するレジスタ: プログラムカウンタ • CPUはメモリに格納された命令を順番に実行する • 命令を実行し、完了したらPCレジスタの値を+1する • すると次のサイクルではメモリの1つ先の命令を実行することになる • データをどこかから持ってきてもう1つのデータと何らかの演算をし、 
 結果をどこかに保管する装置 • ジャンプですらPCレジスタへの値の保存 • 「データをPCレジスタから持ってきてジャンプ先のアドレスを加算し、結果をPCレジスタ に保管する」 • マルチスレッドのCPUはPCレジスタが2つある 18

Slide 19

Slide 19 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPUの回路 19

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

長谷川智希 @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

Slide 22

Slide 22 text

長谷川智希 @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本の信号線 ① ② ③ ③

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

長谷川智希 @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 出力 セレクタ

Slide 26

Slide 26 text

長谷川智希 @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/論理演算/

Slide 27

Slide 27 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか いろいろなNAND 27 余談

Slide 28

Slide 28 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか リレー • 電気的にコントロールできるスイッチ • 電圧をかけるとスイッチが切り替わる • 電気的な機械で「カチッ」って音がするやつは 
 こいつが動いている • コンセントにつけるタイマーとか 28 https://amzn.to/43rEdGh

Slide 29

Slide 29 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか リレーでNAND NANDatte〜 29 https://tams.informatik.uni-hamburg.de/applets/hades/webdemos/05-switched/20-relays/and-nand.html

Slide 30

Slide 30 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 30 http://recursion.jp/rl/relay/j/index.html

Slide 31

Slide 31 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 真空管でNAND 31 https://www.quora.com/How-were-vacuum-tubes-used-to-make-computers

Slide 32

Slide 32 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 32 https://twitter.com/toukatsujin/status/1051016883355377665/photo/1

Slide 33

Slide 33 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか トランジスタでNAND 33 http://www.gxk.jp/elec/musen/1ama/H12/html/H1208A10_.html

Slide 34

Slide 34 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか NANDで作るコンピュータ • Nandgame • https://nandgame.com • ブラウザ上でNANDを組み合せてコンピュータを作る • 「演算器を作れ」みたいなお題が出てブラウザ上で線を接続して正解を探す • From Nand to Tetris • https://www.nand2tetris.org • NANDでCPUを作ってテトリスを動かす • CPUの創りかた • 言わずと知れた名著 34

Slide 35

Slide 35 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか Nandgame 35 https://nandgame.com/

Slide 36

Slide 36 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか From Nand to Tetris 36 https://www.oreilly.co.jp/books/9784873117126/

Slide 37

Slide 37 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPUの創りかた 37 https://amzn.to/43ioLfP

Slide 38

Slide 38 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPUが直接実行可能な言語: マシン語 データの取得, 演算, 保存 • CPUの内部で電気回路として表現されたデータ処理 = マシン語 • データの取得, 演算, 保存 • こんなシンプルなマシン語でPHPやJavaは動いている • C言語はプログラムソースをマシン語に変換しているのでマシン語そのもの • マシン語からPHP, Javaまでのプログラム実行の話は 
 PHP勉強会#147「 プ ロ グ ラムを実行するとは ど ういうことか」参照 38

Slide 39

Slide 39 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 補足: 条件付きジャンプ 演算器のフラグ • さすがに代入とジャンプだけではすべてのプログラムは表現できない • 規定回数のループとか作れないし • 演算器は演算結果によってフラグを立てる • 演算の結果が0になったら立つゼロフラグとか • 演算の結果が桁あふれしたら立つキャリーフラグとか • フラグの状態を出力する足がある • 演算命令の次に条件付きジャンプ命令を置く • a = a - 10 の次に jp z, 0x0000 を置く • a = 10 だったら演算の結果が0になりゼロフラグが立った状態で次の命令を実行する • jp z, 0x0000 だと、ゼロフラグが立っていたらジャンプ、立っていなければ次に行く 39

Slide 40

Slide 40 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか まとめ 40

Slide 41

Slide 41 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか まとめ 0と1で表現される電子ピタゴラスイッチ • コンピュータは数値を電圧の高低の2値で表現しているから0と1しか扱えない • コンピュータはCPU, 入出力(I/O), メモリからできている • CPUと入出力(I/O), メモリはICの足どうしが導線で接続されている • CPUの中はクロックで状態が遷移する電子ピタゴラスイッチだった • NANDがあればなんでも作れる • ぜひやってみてください! 
 (Nandgameはお手軽でおすすめ) 41 ௕୩઒ஐر ͸͕ͤΘ ͱ΋͖ @tomzoh

Slide 42

Slide 42 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか おまけ & 参考 42

Slide 43

Slide 43 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPUと周辺デバイスの通信 • CPUは周辺デバイスと通信するときにアドレスを指定してデータを送受信する • 例えばメモリの場合: • メモリは1つのアドレスに1バイトのデータがある • PHPの配列をイメージすると良い • 1バイトの数値が入る巨大な配列 • アドレス指定が64bitなら配列の添字が64bit幅 • 0x0000000000000000〜0xffffffffffffffff • 最大16EB(エクサバイト) • 32bitだと 0x00000000〜0xffffffffの4GB 43

Slide 44

Slide 44 text

長谷川智希 @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

Slide 45

Slide 45 text

長谷川智希 @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本

Slide 46

Slide 46 text

長谷川智希 @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本

Slide 47

Slide 47 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか CPUとメモリの接続 CPUがメモリにデータを書き込みたい場合 書き込みも同じ感じ CPUはアドレスとデータを出力する メモリは指定されたアドレスに 
 指定されたデータを保存する 47 1 1 0 1 1 0 1 0 CPU MEMORY ? ? ? ? ? ? ? ? "%%3&44 %"5" "%%3&44 %"5" アドレス 16本 データ 8本

Slide 48

Slide 48 text

長谷川智希 @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

Slide 49

Slide 49 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 足の電圧を測定? • このページまでで「足の電圧を測定」とか書いてきた • この考え方は「コンピュータの上からの見え方」 • 実際は… • メモリ=アドレスの足に電圧をかけられるとデータの足の電圧が変わっちゃう回路 49

Slide 50

Slide 50 text

長谷川智希 @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本

Slide 51

Slide 51 text

長谷川智希 @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

Slide 52

Slide 52 text

長谷川智希 @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

Slide 53

Slide 53 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 補足 メモリ 大きく分けて、メインメモリ(一次記憶)、ストレージ(二次記憶) ここまでで話したメモリはメインメモリの方 ストレージは入出力(I/O)の先にある メモリの大原則として近い方が速いというのがある メモリの速度 (M2 Pro MacBook Pro) メインメモリ: 200GB/s ストレージ: 5GB/s 53

Slide 54

Slide 54 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか "CPUの創りかた"よりTD4回路図 54 レジスタ&出力 セレクタ 演算器 入力 Decoder

Slide 55

Slide 55 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか コンピュータの構成要素間の接続 • コンピュータがCPUと入出力(I/O)、メモリで構成されているのはわかった • 具体的にどうやってつながっている? • CPUはこんな形をしている • メモリも同じ様な形をしている • 足どうしが線でつながっている • 入出力(I/O)も同じ • I/OコントローラICとつながっている 55

Slide 56

Slide 56 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 56

Slide 57

Slide 57 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか 57 CPU メモリ 配線

Slide 58

Slide 58 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか コンピュータの構成要素 CPU Central Processing Unit / 中央演算装置 データをどこかから持ってきてもう1つのデータと何らかの演算をし、 
 結果をどこかに保管する装置 入出力(I/O) メモリ 58

Slide 59

Slide 59 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか コンピュータの構成要素 CPU 入出力(I/O) 入力: キーボード, トラックパッド, タッチパネル, … 出力: ディスプレイ, スピーカー, … 両方: ネットワーク, USB, Bluetooth, … メモリ 59

Slide 60

Slide 60 text

長谷川智希 @tomzoh コンピュータはなぜ0と1なのか コンピュータの構成要素 CPU 入出力(I/O) メモリ CPUが使う命令やデータを保存する装置 大きく分けて、メインメモリ(一次記憶)、ストレージ(二次記憶) MacだとAppleのWebでは「メモリ」「ストレージ」と書かれている iPhoneとかで「512GB」とか言ってるのはストレージの方 AppleのWebには「容量」とだけ書いてある メインメモリは公表されない 60