Slide 1

Slide 1 text

長谷川智希 𝕏 @tomzoh 2023/10/08 PHP Conference Japan 2023 プログラムの実行とレイヤー化されたコンピュータ PHPからはじめる コ ンピュータ ア ーキテクチャ

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 PHPからはじめるコンピュータアーキテクチャ 4 プログラムの実行とレイヤ化されたコンピュータ PHPからはじめる コ ンピュータ ア ーキテクチャ

Slide 5

Slide 5 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 今日のテーマ 5

Slide 6

Slide 6 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 今日のテーマ テーマ1 そもそもプログラムを実行するとは何か 5

Slide 7

Slide 7 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 今日のテーマ テーマ1 そもそもプログラムを実行するとは何か テーマ2 レイヤ化された近代のコンピュータアーキテクチャ 5

Slide 8

Slide 8 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 👉 プログラムの実行 レイヤ化 6

Slide 9

Slide 9 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 7

Slide 10

Slide 10 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 • プログラムを実行するというのは具体的に何をしているか 7

Slide 11

Slide 11 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 • プログラムを実行するというのは具体的に何をしているか • みなさんはふだん何を実行していますか? 7

Slide 12

Slide 12 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 • プログラムを実行するというのは具体的に何をしているか • みなさんはふだん何を実行していますか? • PHPのプログラム 7

Slide 13

Slide 13 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 • プログラムを実行するというのは具体的に何をしているか • みなさんはふだん何を実行していますか? • PHPのプログラム • Docker 7

Slide 14

Slide 14 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 • プログラムを実行するというのは具体的に何をしているか • みなさんはふだん何を実行していますか? • PHPのプログラム • Docker • JavaScript (ブラウザ, Node.js) 7

Slide 15

Slide 15 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 • プログラムを実行するというのは具体的に何をしているか • みなさんはふだん何を実行していますか? • PHPのプログラム • Docker • JavaScript (ブラウザ, Node.js) • Safari, Chrome, … 7

Slide 16

Slide 16 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 • プログラムを実行するというのは具体的に何をしているか • みなさんはふだん何を実行していますか? • PHPのプログラム • Docker • JavaScript (ブラウザ, Node.js) • Safari, Chrome, … • PhpStorm 7

Slide 17

Slide 17 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 • プログラムを実行するというのは具体的に何をしているか • みなさんはふだん何を実行していますか? • PHPのプログラム • Docker • JavaScript (ブラウザ, Node.js) • Safari, Chrome, … • PhpStorm • macOS 7

Slide 18

Slide 18 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 2つの実行 8

Slide 19

Slide 19 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ • プログラムの実行方法は2種類ある 2つの実行 8

Slide 20

Slide 20 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ • プログラムの実行方法は2種類ある • CPUでの実行 (電気回路による実行) 2つの実行 8

Slide 21

Slide 21 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ • プログラムの実行方法は2種類ある • CPUでの実行 (電気回路による実行) • プログラムでの実行 2つの実行 8

Slide 22

Slide 22 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ • プログラムの実行方法は2種類ある • CPUでの実行 (電気回路による実行) • プログラムでの実行 2つの実行 8 • マシン語(機械語) • アセンブラ • コンパイラ

Slide 23

Slide 23 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ • プログラムの実行方法は2種類ある • CPUでの実行 (電気回路による実行) • プログラムでの実行 2つの実行 8 • マシン語(機械語) • アセンブラ • コンパイラ • インタープリタ • VM

Slide 24

Slide 24 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 9

Slide 25

Slide 25 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 • CPUが実行できるのはマシン語(機械語・アセンブラ・アセンブリ言語)のみ 9

Slide 26

Slide 26 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 • CPUが実行できるのはマシン語(機械語・アセンブラ・アセンブリ言語)のみ • 文法を持たない単純な命令のセット 9

Slide 27

Slide 27 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 • CPUが実行できるのはマシン語(機械語・アセンブラ・アセンブリ言語)のみ • 文法を持たない単純な命令のセット • Instruction Set: IS 9

Slide 28

Slide 28 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 • CPUが実行できるのはマシン語(機械語・アセンブラ・アセンブリ言語)のみ • 文法を持たない単純な命令のセット • Instruction Set: IS • メインの機能は: データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい 9

Slide 29

Slide 29 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 • CPUが実行できるのはマシン語(機械語・アセンブラ・アセンブリ言語)のみ • 文法を持たない単純な命令のセット • Instruction Set: IS • メインの機能は: データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい • レジスタは決まった名前/サイズで決まった個数あるだけ 9

Slide 30

Slide 30 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 • CPUが実行できるのはマシン語(機械語・アセンブラ・アセンブリ言語)のみ • 文法を持たない単純な命令のセット • Instruction Set: IS • メインの機能は: データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい • レジスタは決まった名前/サイズで決まった個数あるだけ • 命令は単体で完結し、文法はない 9

Slide 31

Slide 31 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 • CPUが実行できるのはマシン語(機械語・アセンブラ・アセンブリ言語)のみ • 文法を持たない単純な命令のセット • Instruction Set: IS • メインの機能は: データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい • レジスタは決まった名前/サイズで決まった個数あるだけ • 命令は単体で完結し、文法はない • プログラム言語とは言えないぐらい原始的 9

Slide 32

Slide 32 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 • CPUが実行できるのはマシン語(機械語・アセンブラ・アセンブリ言語)のみ • 文法を持たない単純な命令のセット • Instruction Set: IS • メインの機能は: データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい • レジスタは決まった名前/サイズで決まった個数あるだけ • 命令は単体で完結し、文法はない • プログラム言語とは言えないぐらい原始的 • 電気回路として実装されている 9

Slide 33

Slide 33 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 10

Slide 34

Slide 34 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ 10

Slide 35

Slide 35 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11 の3バイトでアドレス 1111 にジャンプするとかそんな感じ 10

Slide 36

Slide 36 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11 の3バイトでアドレス 1111 にジャンプするとかそんな感じ • スパルタすぎる… 10

Slide 37

Slide 37 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11 の3バイトでアドレス 1111 にジャンプするとかそんな感じ • スパルタすぎる… • C3 = JP みたいに人間にとってわかりやすい名前が付いてたりする 10

Slide 38

Slide 38 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11 の3バイトでアドレス 1111 にジャンプするとかそんな感じ • スパルタすぎる… • C3 = JP みたいに人間にとってわかりやすい名前が付いてたりする • JP 1111 って書くと少しマシ 10

Slide 39

Slide 39 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11 の3バイトでアドレス 1111 にジャンプするとかそんな感じ • スパルタすぎる… • C3 = JP みたいに人間にとってわかりやすい名前が付いてたりする • JP 1111 って書くと少しマシ • ニーモニックという 10

Slide 40

Slide 40 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11 の3バイトでアドレス 1111 にジャンプするとかそんな感じ • スパルタすぎる… • C3 = JP みたいに人間にとってわかりやすい名前が付いてたりする • JP 1111 って書くと少しマシ • ニーモニックという • ニーモニックで書かれたプログラム(テキストファイル)をマシン語のバイナリに変換する プログラムをアセンブラと呼ぶ 10

Slide 41

Slide 41 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11 の3バイトでアドレス 1111 にジャンプするとかそんな感じ • スパルタすぎる… • C3 = JP みたいに人間にとってわかりやすい名前が付いてたりする • JP 1111 って書くと少しマシ • ニーモニックという • ニーモニックで書かれたプログラム(テキストファイル)をマシン語のバイナリに変換する プログラムをアセンブラと呼ぶ • 転じてニーモニックで書かれたプログラムをアセンブラとかアセンブリ言語と言ったり 10

Slide 42

Slide 42 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式2: プログラムでの実行 11

Slide 43

Slide 43 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式2: プログラムでの実行 • プログラムがプログラムを読み込んで解釈して実行する 11

Slide 44

Slide 44 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式2: プログラムでの実行 • プログラムがプログラムを読み込んで解釈して実行する • 例: PHPコマンド(プログラム)がPHPのソースコード(テキスト)を読み込んで解釈して実行する 11

Slide 45

Slide 45 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式2: プログラムでの実行 • プログラムがプログラムを読み込んで解釈して実行する • 例: PHPコマンド(プログラム)がPHPのソースコード(テキスト)を読み込んで解釈して実行する • 解釈 = パース 11

Slide 46

Slide 46 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式2: プログラムでの実行 • プログラムがプログラムを読み込んで解釈して実行する • 例: PHPコマンド(プログラム)がPHPのソースコード(テキスト)を読み込んで解釈して実行する • 解釈 = パース • 読み込む対象はソースコード(テキスト)でないこともある 11

Slide 47

Slide 47 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式2: プログラムでの実行 • プログラムがプログラムを読み込んで解釈して実行する • 例: PHPコマンド(プログラム)がPHPのソースコード(テキスト)を読み込んで解釈して実行する • 解釈 = パース • 読み込む対象はソースコード(テキスト)でないこともある • Java: ソースコード(テキストファイル / HelloWorld.java) → バイトコード(バイナリ / HelloWorld.class) → java HelloWorld 11

Slide 48

Slide 48 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式2: プログラムでの実行 • プログラムがプログラムを読み込んで解釈して実行する • 例: PHPコマンド(プログラム)がPHPのソースコード(テキスト)を読み込んで解釈して実行する • 解釈 = パース • 読み込む対象はソースコード(テキスト)でないこともある • Java: ソースコード(テキストファイル / HelloWorld.java) → バイトコード(バイナリ / HelloWorld.class) → java HelloWorld • 読み込むものがテキストでもバイナリでも 実行 = 命令を読み込んでその通りに動作する ということ 11

Slide 49

Slide 49 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 12

Slide 50

Slide 50 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php 12

Slide 51

Slide 51 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100; という文字列を見たら… 12

Slide 52

Slide 52 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100; という文字列を見たら… • 「$があるのでここから変数名で=は変数名に使えない文字なので 変数名は$aで確定。ということは次の = は後ろに = が無いので 代入で、100 は数字。次に ; があるからここまで実行しよう」と解釈する 12

Slide 53

Slide 53 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100; という文字列を見たら… • 「$があるのでここから変数名で=は変数名に使えない文字なので 変数名は$aで確定。ということは次の = は後ろに = が無いので 代入で、100 は数字。次に ; があるからここまで実行しよう」と解釈する • $a が既に存在しているかを調べる 12

Slide 54

Slide 54 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100; という文字列を見たら… • 「$があるのでここから変数名で=は変数名に使えない文字なので 変数名は$aで確定。ということは次の = は後ろに = が無いので 代入で、100 は数字。次に ; があるからここまで実行しよう」と解釈する • $a が既に存在しているかを調べる • 存在していなければメモリ上に $a の中身を保存する領域を確保する 12

Slide 55

Slide 55 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100; という文字列を見たら… • 「$があるのでここから変数名で=は変数名に使えない文字なので 変数名は$aで確定。ということは次の = は後ろに = が無いので 代入で、100 は数字。次に ; があるからここまで実行しよう」と解釈する • $a が既に存在しているかを調べる • 存在していなければメモリ上に $a の中身を保存する領域を確保する • メモリ上の $a の領域に 100 を書く 12

Slide 56

Slide 56 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100; という文字列を見たら… • 「$があるのでここから変数名で=は変数名に使えない文字なので 変数名は$aで確定。ということは次の = は後ろに = が無いので 代入で、100 は数字。次に ; があるからここまで実行しよう」と解釈する • $a が既に存在しているかを調べる • 存在していなければメモリ上に $a の中身を保存する領域を確保する • メモリ上の $a の領域に 100 を書く • プログラマからは$aという変数に100が代入された様に見える 12

Slide 57

Slide 57 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100; という文字列を見たら… • 「$があるのでここから変数名で=は変数名に使えない文字なので 変数名は$aで確定。ということは次の = は後ろに = が無いので 代入で、100 は数字。次に ; があるからここまで実行しよう」と解釈する • $a が既に存在しているかを調べる • 存在していなければメモリ上に $a の中身を保存する領域を確保する • メモリ上の $a の領域に 100 を書く • プログラマからは$aという変数に100が代入された様に見える • このように順次実行していくプログラムをインタープリタと呼ぶ 12

Slide 58

Slide 58 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ インタープリタとコンパイラ 13

Slide 59

Slide 59 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ インタープリタとコンパイラ • プログラムを順次実行していくプログラムをインタープリタと呼ぶ 13

Slide 60

Slide 60 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ インタープリタとコンパイラ • プログラムを順次実行していくプログラムをインタープリタと呼ぶ • プログラムを他の形式に変換するプログラムをコンパイラと呼ぶ 13

Slide 61

Slide 61 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ インタープリタとコンパイラ • プログラムを順次実行していくプログラムをインタープリタと呼ぶ • プログラムを他の形式に変換するプログラムをコンパイラと呼ぶ • 変換動作はコンパイル 何から何に変換してもコンパイル 13

Slide 62

Slide 62 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ インタープリタとコンパイラ • プログラムを順次実行していくプログラムをインタープリタと呼ぶ • プログラムを他の形式に変換するプログラムをコンパイラと呼ぶ • 変換動作はコンパイル 何から何に変換してもコンパイル • Cコンパイラ C言語のソースコード(テキストファイル)をアセンブリ(テキストファイル)に変換する 13

Slide 63

Slide 63 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ インタープリタとコンパイラ • プログラムを順次実行していくプログラムをインタープリタと呼ぶ • プログラムを他の形式に変換するプログラムをコンパイラと呼ぶ • 変換動作はコンパイル 何から何に変換してもコンパイル • Cコンパイラ C言語のソースコード(テキストファイル)をアセンブリ(テキストファイル)に変換する • Javaコンパイラ Javaのソースコード(テキストファイル)をバイトコード(バイナリファイル)に変換 する 13

Slide 64

Slide 64 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ インタープリタとコンパイラ • プログラムを順次実行していくプログラムをインタープリタと呼ぶ • プログラムを他の形式に変換するプログラムをコンパイラと呼ぶ • 変換動作はコンパイル 何から何に変換してもコンパイル • Cコンパイラ C言語のソースコード(テキストファイル)をアセンブリ(テキストファイル)に変換する • Javaコンパイラ Javaのソースコード(テキストファイル)をバイトコード(バイナリファイル)に変換 する • インタープリタとコンパイラは言語の特徴として対比して使われる 13

Slide 65

Slide 65 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ インタープリタとコンパイラ • プログラムを順次実行していくプログラムをインタープリタと呼ぶ • プログラムを他の形式に変換するプログラムをコンパイラと呼ぶ • 変換動作はコンパイル 何から何に変換してもコンパイル • Cコンパイラ C言語のソースコード(テキストファイル)をアセンブリ(テキストファイル)に変換する • Javaコンパイラ Javaのソースコード(テキストファイル)をバイトコード(バイナリファイル)に変換 する • インタープリタとコンパイラは言語の特徴として対比して使われる • が昨今はインタープリタ言語でも内部でコンパイルしてたりして単純ではない 13

Slide 66

Slide 66 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine 14

Slide 67

Slide 67 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする 14

Slide 68

Slide 68 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする • PC全体を仮想化したVMとは違う文脈 14

Slide 69

Slide 69 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする • PC全体を仮想化したVMとは違う文脈 • PHP関連で言うと… 14

Slide 70

Slide 70 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする • PC全体を仮想化したVMとは違う文脈 • PHP関連で言うと… • PHP VM, HHVM (HipHop Virtual Machine) 14

Slide 71

Slide 71 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする • PC全体を仮想化したVMとは違う文脈 • PHP関連で言うと… • PHP VM, HHVM (HipHop Virtual Machine) • PHP Opcodeを実行するプログラム 14

Slide 72

Slide 72 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする • PC全体を仮想化したVMとは違う文脈 • PHP関連で言うと… • PHP VM, HHVM (HipHop Virtual Machine) • PHP Opcodeを実行するプログラム • PHP Opcode = PHPのソースコードからコンパイルされたバイナリ 14

Slide 73

Slide 73 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする • PC全体を仮想化したVMとは違う文脈 • PHP関連で言うと… • PHP VM, HHVM (HipHop Virtual Machine) • PHP Opcodeを実行するプログラム • PHP Opcode = PHPのソースコードからコンパイルされたバイナリ • Java VM 14

Slide 74

Slide 74 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする • PC全体を仮想化したVMとは違う文脈 • PHP関連で言うと… • PHP VM, HHVM (HipHop Virtual Machine) • PHP Opcodeを実行するプログラム • PHP Opcode = PHPのソースコードからコンパイルされたバイナリ • Java VM • Javaバイトコードを実行するプログラム 14

Slide 75

Slide 75 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする • PC全体を仮想化したVMとは違う文脈 • PHP関連で言うと… • PHP VM, HHVM (HipHop Virtual Machine) • PHP Opcodeを実行するプログラム • PHP Opcode = PHPのソースコードからコンパイルされたバイナリ • Java VM • Javaバイトコードを実行するプログラム • Javaバイトコード = Javaのソースコードからコンパイルされたバイナリ 14

Slide 76

Slide 76 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 15 実例いくつか

Slide 77

Slide 77 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHP インタープリタ 16

Slide 78

Slide 78 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHP インタープリタ ソースコードをphpコマンドで実行 16

Slide 79

Slide 79 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHP インタープリタ ソースコードをphpコマンドで実行 16

Slide 80

Slide 80 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Python インタープリタ 17 print('Hello, world.') hello-world.py

Slide 81

Slide 81 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Python インタープリタ ソースコードをpython3コマンドで実行 17 print('Hello, world.') hello-world.py

Slide 82

Slide 82 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Python インタープリタ ソースコードをpython3コマンドで実行 17 print('Hello, world.') hello-world.py

Slide 83

Slide 83 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ 18 console.log("Hello, world."); hello-world.js

Slide 84

Slide 84 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 18 console.log("Hello, world."); hello-world.js

Slide 85

Slide 85 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 18 console.log("Hello, world."); hello-world.js

Slide 86

Slide 86 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 複数のエンジン実装 18 console.log("Hello, world."); hello-world.js

Slide 87

Slide 87 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 複数のエンジン実装 • Node.js 18 console.log("Hello, world."); hello-world.js

Slide 88

Slide 88 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 複数のエンジン実装 • Node.js • ブラウザ 18 console.log("Hello, world."); hello-world.js

Slide 89

Slide 89 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 複数のエンジン実装 • Node.js • ブラウザ • Bun 18 console.log("Hello, world."); hello-world.js

Slide 90

Slide 90 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 複数のエンジン実装 • Node.js • ブラウザ • Bun 複数の実装があるのは珍しくはない 18 console.log("Hello, world."); hello-world.js

Slide 91

Slide 91 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 複数のエンジン実装 • Node.js • ブラウザ • Bun 複数の実装があるのは珍しくはない • RubyとかPythonも実装が複数ある 18 console.log("Hello, world."); hello-world.js

Slide 92

Slide 92 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 複数のエンジン実装 • Node.js • ブラウザ • Bun 複数の実装があるのは珍しくはない • RubyとかPythonも実装が複数ある • PHPもHackがあったり 18 console.log("Hello, world."); hello-world.js

Slide 93

Slide 93 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Java コンパイラ + インタープリタ 19

Slide 94

Slide 94 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Java コンパイラ + インタープリタ ソースコード(テキストファイル) 19 class HelloWorld { public static void main(String[] args){ System.out.println("Hello, world."); } } HelloWorld.java

Slide 95

Slide 95 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Java コンパイラ + インタープリタ ソースコード(テキストファイル) Javaコンパイラ → バイトコード(バイナリ) 19 class HelloWorld { public static void main(String[] args){ System.out.println("Hello, world."); } } HelloWorld.java

Slide 96

Slide 96 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Java コンパイラ + インタープリタ ソースコード(テキストファイル) Javaコンパイラ → バイトコード(バイナリ) 19 class HelloWorld { public static void main(String[] args){ System.out.println("Hello, world."); } } HelloWorld.java 00000000 ca fe ba be 00 00 00 37 00 1d 0a 00 06 00 0f 09 |.......7........| 00000010 00 10 00 11 08 00 12 0a 00 13 00 14 07 00 15 07 |................| 00000020 00 16 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29 |........()| 00000030 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e |V...Code...LineN| 00000040 75 6d 62 65 72 54 61 62 6c 65 01 00 04 6d 61 69 |umberTable...mai| : HelloWorld.class

Slide 97

Slide 97 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Java コンパイラ + インタープリタ ソースコード(テキストファイル) Javaコンパイラ → バイトコード(バイナリ) javaコマンドで実行 $ java HelloWorld 19 class HelloWorld { public static void main(String[] args){ System.out.println("Hello, world."); } } HelloWorld.java 00000000 ca fe ba be 00 00 00 37 00 1d 0a 00 06 00 0f 09 |.......7........| 00000010 00 10 00 11 08 00 12 0a 00 13 00 14 07 00 15 07 |................| 00000020 00 16 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29 |........()| 00000030 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e |V...Code...LineN| 00000040 75 6d 62 65 72 54 61 62 6c 65 01 00 04 6d 61 69 |umberTable...mai| : HelloWorld.class

Slide 98

Slide 98 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ C コンパイラ 20

Slide 99

Slide 99 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ C コンパイラ ソースコード(テキストファイル) 20 #include int main(void){ printf("Hello, world."); } hello-world.c

Slide 100

Slide 100 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ C コンパイラ ソースコード(テキストファイル) Cコンパイラ → ニーモニック(テキストファイル) 20 #include int main(void){ printf("Hello, world."); } hello-world.c .LC0: .string "Hello, world." : main: endbr64 pushq %rbp movq %rsp, %rbp leaq .LC0(%rip), %rdi movl $0, %eax call printf@PLT movl $0, %eax : hello-world.s

Slide 101

Slide 101 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ C コンパイラ ソースコード(テキストファイル) Cコンパイラ → ニーモニック(テキストファイル) アセンブラ → マシン語(バイナリ) 20 #include int main(void){ printf("Hello, world."); } hello-world.c .LC0: .string "Hello, world." : main: endbr64 pushq %rbp movq %rsp, %rbp leaq .LC0(%rip), %rdi movl $0, %eax call printf@PLT movl $0, %eax : hello-world.s

Slide 102

Slide 102 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ C コンパイラ ソースコード(テキストファイル) Cコンパイラ → ニーモニック(テキストファイル) アセンブラ → マシン語(バイナリ) 20 #include int main(void){ printf("Hello, world."); } hello-world.c .LC0: .string "Hello, world." : main: endbr64 pushq %rbp movq %rsp, %rbp leaq .LC0(%rip), %rdi movl $0, %eax call printf@PLT movl $0, %eax : hello-world.s 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 03 00 3e 00 01 00 00 00 60 10 00 00 00 00 00 00 |..>.....`.......| 00000020 40 00 00 00 00 00 00 00 80 39 00 00 00 00 00 00 |@........9......| : hello-world

Slide 103

Slide 103 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ C コンパイラ ソースコード(テキストファイル) Cコンパイラ → ニーモニック(テキストファイル) アセンブラ → マシン語(バイナリ) CPUで実行 $ ./hello-world 20 #include int main(void){ printf("Hello, world."); } hello-world.c .LC0: .string "Hello, world." : main: endbr64 pushq %rbp movq %rsp, %rbp leaq .LC0(%rip), %rdi movl $0, %eax call printf@PLT movl $0, %eax : hello-world.s 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 03 00 3e 00 01 00 00 00 60 10 00 00 00 00 00 00 |..>.....`.......| 00000020 40 00 00 00 00 00 00 00 80 39 00 00 00 00 00 00 |@........9......| : hello-world

Slide 104

Slide 104 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Go コンパイラ 21

Slide 105

Slide 105 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Go コンパイラ ソースコード(テキスト) 21 package main import "fmt" func main() { fmt.Printf("Hello, world.") } hello-world.go

Slide 106

Slide 106 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Go コンパイラ ソースコード(テキスト) go build コマンド → マシン語(バイナリ) 21 package main import "fmt" func main() { fmt.Printf("Hello, world.") } hello-world.go 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 03 00 3e 00 01 00 00 00 60 10 00 00 00 00 00 00 |..>.....`.......| 00000020 40 00 00 00 00 00 00 00 80 39 00 00 00 00 00 00 |@........9......| : hello-world

Slide 107

Slide 107 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Go コンパイラ ソースコード(テキスト) go build コマンド → マシン語(バイナリ) CPUで実行 ./hello-world 21 package main import "fmt" func main() { fmt.Printf("Hello, world.") } hello-world.go 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 03 00 3e 00 01 00 00 00 60 10 00 00 00 00 00 00 |..>.....`.......| 00000020 40 00 00 00 00 00 00 00 80 39 00 00 00 00 00 00 |@........9......| : hello-world

Slide 108

Slide 108 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Go コンパイラ ソースコード(テキスト) go build コマンド → マシン語(バイナリ) CPUで実行 ./hello-world go run hello-world.go でも実行できる (内部的に go build してるんじゃないかな…) 21 package main import "fmt" func main() { fmt.Printf("Hello, world.") } hello-world.go 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 03 00 3e 00 01 00 00 00 60 10 00 00 00 00 00 00 |..>.....`.......| 00000020 40 00 00 00 00 00 00 00 80 39 00 00 00 00 00 00 |@........9......| : hello-world

Slide 109

Slide 109 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Go コンパイラ ソースコード(テキスト) go build コマンド → マシン語(バイナリ) CPUで実行 ./hello-world go run hello-world.go でも実行できる (内部的に go build してるんじゃないかな…) 21 package main import "fmt" func main() { fmt.Printf("Hello, world.") } hello-world.go 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 03 00 3e 00 01 00 00 00 60 10 00 00 00 00 00 00 |..>.....`.......| 00000020 40 00 00 00 00 00 00 00 80 39 00 00 00 00 00 00 |@........9......| : hello-world $ݴޠͱಉ͡ʹݟ͑Δ͚Ͳɺ&-'ϔομ͸ όΠτͱ͔͋ΔΒ͍͠ͷͰʜ

Slide 110

Slide 110 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ✅ プログラムの実行 👉 レイヤ化 22

Slide 111

Slide 111 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ レイヤ化されたコンピュータ 23

Slide 112

Slide 112 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ レイヤ化されたコンピュータ • 現代のコンピュータはソフトウェア/ハードウェアともにレイヤ化・抽象化されている 23

Slide 113

Slide 113 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ レイヤ化されたコンピュータ • 現代のコンピュータはソフトウェア/ハードウェアともにレイヤ化・抽象化されている • 各レイヤは下のレイヤのことは気にしなくて良い 23

Slide 114

Slide 114 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ レイヤ化されたコンピュータ • 現代のコンピュータはソフトウェア/ハードウェアともにレイヤ化・抽象化されている • 各レイヤは下のレイヤのことは気にしなくて良い • PHPプログラム(hello-world.php)から見たら下のレイヤは… 23

Slide 115

Slide 115 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ レイヤ化されたコンピュータ • 現代のコンピュータはソフトウェア/ハードウェアともにレイヤ化・抽象化されている • 各レイヤは下のレイヤのことは気にしなくて良い • PHPプログラム(hello-world.php)から見たら下のレイヤは… • PHPコマンド 23

Slide 116

Slide 116 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ レイヤ化されたコンピュータ • 現代のコンピュータはソフトウェア/ハードウェアともにレイヤ化・抽象化されている • 各レイヤは下のレイヤのことは気にしなくて良い • PHPプログラム(hello-world.php)から見たら下のレイヤは… • PHPコマンド • macOS, Linux, FreeBSD, Windows, Raspberry Pi OS, Solaris, … 23

Slide 117

Slide 117 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ レイヤ化されたコンピュータ • 現代のコンピュータはソフトウェア/ハードウェアともにレイヤ化・抽象化されている • 各レイヤは下のレイヤのことは気にしなくて良い • PHPプログラム(hello-world.php)から見たら下のレイヤは… • PHPコマンド • macOS, Linux, FreeBSD, Windows, Raspberry Pi OS, Solaris, … • Intel x86, Apple Silicon, ARM, SPARC, … 23

Slide 118

Slide 118 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ レイヤ化されたコンピュータ • 現代のコンピュータはソフトウェア/ハードウェアともにレイヤ化・抽象化されている • 各レイヤは下のレイヤのことは気にしなくて良い • PHPプログラム(hello-world.php)から見たら下のレイヤは… • PHPコマンド • macOS, Linux, FreeBSD, Windows, Raspberry Pi OS, Solaris, … • Intel x86, Apple Silicon, ARM, SPARC, … • Mac, PC, Raspberry Pi, … 23

Slide 119

Slide 119 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ レイヤ化されたコンピュータ • 現代のコンピュータはソフトウェア/ハードウェアともにレイヤ化・抽象化されている • 各レイヤは下のレイヤのことは気にしなくて良い • PHPプログラム(hello-world.php)から見たら下のレイヤは… • PHPコマンド • macOS, Linux, FreeBSD, Windows, Raspberry Pi OS, Solaris, … • Intel x86, Apple Silicon, ARM, SPARC, … • Mac, PC, Raspberry Pi, … • PHPプログラムはPHPコマンドで実行されることだけ意識すれば良い (だいたいは) 23

Slide 120

Slide 120 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 我々がPHPプログラムを実行すると… $ php hello-world.php 24

Slide 121

Slide 121 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 我々がPHPプログラムを実行すると… $ php hello-world.php 24 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro

Slide 122

Slide 122 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 我々がPHPプログラムを実行すると… $ php hello-world.php • CPUはphpコマンドを実行する 24 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro

Slide 123

Slide 123 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 我々がPHPプログラムを実行すると… $ php hello-world.php • CPUはphpコマンドを実行する • Cで書かれたプログラム 24 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro

Slide 124

Slide 124 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 我々がPHPプログラムを実行すると… $ php hello-world.php • CPUはphpコマンドを実行する • Cで書かれたプログラム • コンパイルされアセンブルされリンクされ マシン語の実行ファイルになっている 24 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro

Slide 125

Slide 125 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 我々がPHPプログラムを実行すると… $ php hello-world.php • CPUはphpコマンドを実行する • Cで書かれたプログラム • コンパイルされアセンブルされリンクされ マシン語の実行ファイルになっている • CPUでそのまま実行できる 24 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro

Slide 126

Slide 126 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 我々がPHPプログラムを実行すると… $ php hello-world.php • CPUはphpコマンドを実行する • Cで書かれたプログラム • コンパイルされアセンブルされリンクされ マシン語の実行ファイルになっている • CPUでそのまま実行できる • phpコマンドはPHPプログラムを読み込み、解釈し、 実行する 24 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro

Slide 127

Slide 127 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Goだと…? $ go build hello-world.go; ./hello-world 25

Slide 128

Slide 128 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Goだと…? $ go build hello-world.go; ./hello-world 25 macOS Apple Silicon CPU Mac Book Pro hello-worldコマンド

Slide 129

Slide 129 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Goだと…? $ go build hello-world.go; ./hello-world • CPUはhello-worldコマンドを実行する 25 macOS Apple Silicon CPU Mac Book Pro hello-worldコマンド

Slide 130

Slide 130 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Goだと…? $ go build hello-world.go; ./hello-world • CPUはhello-worldコマンドを実行する • Goで書かれたプログラムがコンパイルされ マシン語の実行ファイルになっている 25 macOS Apple Silicon CPU Mac Book Pro hello-worldコマンド

Slide 131

Slide 131 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Goだと…? $ go build hello-world.go; ./hello-world • CPUはhello-worldコマンドを実行する • Goで書かれたプログラムがコンパイルされ マシン語の実行ファイルになっている • CPUでそのまま実行できる 25 macOS Apple Silicon CPU Mac Book Pro hello-worldコマンド

Slide 132

Slide 132 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPとGoの違い 26

Slide 133

Slide 133 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPとGoの違い PHPもGoも CPUで動いているのは マシン語のプログラム 26

Slide 134

Slide 134 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPとGoの違い PHPもGoも CPUで動いているのは マシン語のプログラム PHP phpコマンドが PHPプログラムを都度解釈して 実行する → コンパイル不要 26 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro

Slide 135

Slide 135 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPとGoの違い PHPもGoも CPUで動いているのは マシン語のプログラム PHP phpコマンドが PHPプログラムを都度解釈して 実行する → コンパイル不要 Go 事前にコンパイルしてCPUが 直接実行可能なファイルを作る → ハイパフォーマンス 26 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro hello-worldコマンド macOS Apple Silicon CPU Mac Book Pro

Slide 136

Slide 136 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ もっと下のレイヤ 27 hello-world.php PHPプログラム phpコマンド Linux CPU PC

Slide 137

Slide 137 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ もっと下のレイヤ 下のレイヤを気にしないのは もっと下のレイヤでも同じ 27 hello-world.php PHPプログラム phpコマンド Linux CPU PC

Slide 138

Slide 138 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ もっと下のレイヤ 下のレイヤを気にしないのは もっと下のレイヤでも同じ Linuxは自分を実行しているの が実CPUなのか仮想CPUなの かは気にしない 27 hello-world.php PHPプログラム phpコマンド Linux CPU PC

Slide 139

Slide 139 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ もっと下のレイヤ 下のレイヤを気にしないのは もっと下のレイヤでも同じ Linuxは自分を実行しているの が実CPUなのか仮想CPUなの かは気にしない 27 hello-world.php PHPプログラム phpコマンド Linux CPU PC Mac hello-world.php PHPプログラム phpコマンド Linux VM (仮想ハードウェア) macOS CPU

Slide 140

Slide 140 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ もっと下のレイヤ 下のレイヤを気にしないのは もっと下のレイヤでも同じ Linuxは自分を実行しているの が実CPUなのか仮想CPUなの かは気にしない VM = CPUとハードウェアのフ リをするソフトウェア 27 hello-world.php PHPプログラム phpコマンド Linux CPU PC Mac hello-world.php PHPプログラム phpコマンド Linux VM (仮想ハードウェア) macOS CPU

Slide 141

Slide 141 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ✅ プログラムの実行 ✅ レイヤ化 28

Slide 142

Slide 142 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ さて… 29

Slide 143

Slide 143 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ これで普通(?)の話は 終わりです 30

Slide 144

Slide 144 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムが 下のレイヤを気にしないなら 31

Slide 145

Slide 145 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 下は下で好きにやりましょう 32

Slide 146

Slide 146 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro 下のレイヤが好きにやる 33

Slide 147

Slide 147 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro 下のレイヤが好きにやる • PHPで書かれたプログラム(hello-world.php)は 自分より下を気にしていない 33

Slide 148

Slide 148 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro ここは何でもいい 下のレイヤが好きにやる • PHPで書かれたプログラム(hello-world.php)は 自分より下を気にしていない 33

Slide 149

Slide 149 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro ここは何でもいい 下のレイヤが好きにやる • PHPで書かれたプログラム(hello-world.php)は 自分より下を気にしていない • 自分を実行してくれれば何でも良い 33

Slide 150

Slide 150 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ HelloWorld.class Javaバイトコード javaコマンド macOS Apple Silicon CPU Mac Book Pro 下のレイヤが好きにやる 34

Slide 151

Slide 151 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ HelloWorld.class Javaバイトコード javaコマンド macOS Apple Silicon CPU Mac Book Pro 下のレイヤが好きにやる Javaで書かれ、 Javaバイトコードに 変換されたプログラム (HelloWorld.class) 34

Slide 152

Slide 152 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ HelloWorld.class Javaバイトコード javaコマンド macOS Apple Silicon CPU Mac Book Pro 下のレイヤが好きにやる Javaで書かれ、 Javaバイトコードに 変換されたプログラム (HelloWorld.class) javaコマンドより下は 気にしていない 34

Slide 153

Slide 153 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ HelloWorld.class Javaバイトコード javaコマンド macOS Apple Silicon CPU Mac Book Pro ここは何でもいい 下のレイヤが好きにやる Javaで書かれ、 Javaバイトコードに 変換されたプログラム (HelloWorld.class) javaコマンドより下は 気にしていない 34

Slide 154

Slide 154 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ HelloWorld.class Javaバイトコード javaコマンド macOS Apple Silicon CPU Mac Book Pro ここは何でもいい 下のレイヤが好きにやる Javaで書かれ、 Javaバイトコードに 変換されたプログラム (HelloWorld.class) javaコマンドより下は 気にしていない なら好きにしてみよう 34

Slide 155

Slide 155 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ HelloWorld.class Javaバイトコード javaコマンド macOS Apple Silicon CPU Mac Book Pro PHPJava PHPプログラム phpコマンド HelloWorld.class Javaバイトコード macOS Apple Silicon CPU Mac Book Pro ここは何でもいい 下のレイヤが好きにやる Javaで書かれ、 Javaバイトコードに 変換されたプログラム (HelloWorld.class) javaコマンドより下は 気にしていない なら好きにしてみよう 34

Slide 156

Slide 156 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたJVM PHPJava 35 https://fortee.jp/phperkaigi-2019/proposal/6f792375-335a-432e-b1b4-7b649a5152e4 https://github.com/php-java/php-java

Slide 157

Slide 157 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたJVM PHPJava • @m3m0r7 さん 35 https://fortee.jp/phperkaigi-2019/proposal/6f792375-335a-432e-b1b4-7b649a5152e4 https://github.com/php-java/php-java

Slide 158

Slide 158 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたJVM PHPJava • @m3m0r7 さん • バイトコードを解釈し実行する 35 https://fortee.jp/phperkaigi-2019/proposal/6f792375-335a-432e-b1b4-7b649a5152e4 https://github.com/php-java/php-java

Slide 159

Slide 159 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたJVM PHPJava • @m3m0r7 さん • バイトコードを解釈し実行する 35 https://fortee.jp/phperkaigi-2019/proposal/6f792375-335a-432e-b1b4-7b649a5152e4 https://github.com/php-java/php-java

Slide 160

Slide 160 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたJVM PHPJava • @m3m0r7 さん • バイトコードを解釈し実行する • PHPerKaigi 2019 にトークあります 35 https://fortee.jp/phperkaigi-2019/proposal/6f792375-335a-432e-b1b4-7b649a5152e4 https://github.com/php-java/php-java

Slide 161

Slide 161 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ほかにも… 36

Slide 162

Slide 162 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン 37

Slide 163

Slide 163 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン 37 CPU 6502 PPU RAM V-RAM APU カートリッジ

Slide 164

Slide 164 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている 37 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム *1 実際は6502ベースのカスタムIC RP2A03

Slide 165

Slide 165 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には キャラクタのパターンが格納されている 37 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03

Slide 166

Slide 166 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には キャラクタのパターンが格納されている • このマシン語プログラムも当然 下のレイヤは気にしない 37 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03

Slide 167

Slide 167 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には キャラクタのパターンが格納されている • このマシン語プログラムも当然 下のレイヤは気にしない 37 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03 ここは何でもいい

Slide 168

Slide 168 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には キャラクタのパターンが格納されている • このマシン語プログラムも当然 下のレイヤは気にしない • なら好きにさせてもらおう 37 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03 ここは何でもいい

Slide 169

Slide 169 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には キャラクタのパターンが格納されている • このマシン語プログラムも当然 下のレイヤは気にしない • なら好きにさせてもらおう 37 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03

Slide 170

Slide 170 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には キャラクタのパターンが格納されている • このマシン語プログラムも当然 下のレイヤは気にしない • なら好きにさせてもらおう 37 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03 話は聞かせて もらった!!

Slide 171

Slide 171 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には キャラクタのパターンが格納されている • このマシン語プログラムも当然 下のレイヤは気にしない • なら好きにさせてもらおう 37 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03 話は聞かせて もらった!! 好きにさせて もらおう!

Slide 172

Slide 172 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたファミコンエミュレータ 38

Slide 173

Slide 173 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたファミコンエミュレータ 38

Slide 174

Slide 174 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたファミコンエミュレータ • php-terminal-nes-emulator *1 38 *1 https://github.com/hasegawa-tomoki/php-terminal-nes-emulator

Slide 175

Slide 175 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたファミコンエミュレータ • php-terminal-nes-emulator *1 • 長谷川が書いた 38 *1 https://github.com/hasegawa-tomoki/php-terminal-nes-emulator

Slide 176

Slide 176 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたファミコンエミュレータ • php-terminal-nes-emulator *1 • 長谷川が書いた • bokuweb/ fl ownes という既存の JavaScript実装の写経 38 *1 https://github.com/hasegawa-tomoki/php-terminal-nes-emulator

Slide 177

Slide 177 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたファミコンエミュレータ • php-terminal-nes-emulator *1 • 長谷川が書いた • bokuweb/ fl ownes という既存の JavaScript実装の写経 • PHPでファミコンのCPU/PPUの フリをする 38 *1 https://github.com/hasegawa-tomoki/php-terminal-nes-emulator

Slide 178

Slide 178 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 39

Slide 179

Slide 179 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 39 78 D8 A9 10 8D 00 20 A2 FF 9A AD 02 20 10 FB AD 02 20 10 FB A0 FE A2 05 BD D7 07 C9 0A B0 0C CA $8000 $8010 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

Slide 180

Slide 180 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 • 基本的に1バイト = 1命令 39 78 D8 A9 10 8D 00 20 A2 FF 9A AD 02 20 10 FB AD 02 20 10 FB A0 FE A2 05 BD D7 07 C9 0A B0 0C CA $8000 $8010 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

Slide 181

Slide 181 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 • 基本的に1バイト = 1命令 • 命令に引数が付くこともある 39 78 D8 A9 10 8D 00 20 A2 FF 9A AD 02 20 10 FB AD 02 20 10 FB A0 FE A2 05 BD D7 07 C9 0A B0 0C CA $8000 $8010 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

Slide 182

Slide 182 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 • 基本的に1バイト = 1命令 • 命令に引数が付くこともある 39 $78 $D8 $A9 $10 $8D $00 $20 $A2 $FF $9A $8000 $8001 $8002 $8004 $8007 $8009 SEI CLD LDA #imm STA abs LDX #imm TXS 78 D8 A9 10 8D 00 20 A2 FF 9A AD 02 20 10 FB AD 02 20 10 FB A0 FE A2 05 BD D7 07 C9 0A B0 0C CA $8000 $8010 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

Slide 183

Slide 183 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 • 基本的に1バイト = 1命令 • 命令に引数が付くこともある • $78(16進数の78) = SEI 命令 39 $78 $D8 $A9 $10 $8D $00 $20 $A2 $FF $9A $8000 $8001 $8002 $8004 $8007 $8009 SEI CLD LDA #imm STA abs LDX #imm TXS 78 D8 A9 10 8D 00 20 A2 FF 9A AD 02 20 10 FB AD 02 20 10 FB A0 FE A2 05 BD D7 07 C9 0A B0 0C CA $8000 $8010 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

Slide 184

Slide 184 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 • 基本的に1バイト = 1命令 • 命令に引数が付くこともある • $78(16進数の78) = SEI 命令 • $A9 = LDA 命令 39 $78 $D8 $A9 $10 $8D $00 $20 $A2 $FF $9A $8000 $8001 $8002 $8004 $8007 $8009 SEI CLD LDA #imm STA abs LDX #imm TXS 78 D8 A9 10 8D 00 20 A2 FF 9A AD 02 20 10 FB AD 02 20 10 FB A0 FE A2 05 BD D7 07 C9 0A B0 0C CA $8000 $8010 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

Slide 185

Slide 185 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 • 基本的に1バイト = 1命令 • 命令に引数が付くこともある • $78(16進数の78) = SEI 命令 • $A9 = LDA 命令 • 引数の値をAレジスタに入れる 39 $78 $D8 $A9 $10 $8D $00 $20 $A2 $FF $9A $8000 $8001 $8002 $8004 $8007 $8009 SEI CLD LDA #imm STA abs LDX #imm TXS 78 D8 A9 10 8D 00 20 A2 FF 9A AD 02 20 10 FB AD 02 20 10 FB A0 FE A2 05 BD D7 07 C9 0A B0 0C CA $8000 $8010 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

Slide 186

Slide 186 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 40

Slide 187

Slide 187 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU 41 ※ php-terminal-nes-emulatorのコードではありません

Slide 188

Slide 188 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 41 ※ php-terminal-nes-emulatorのコードではありません

Slide 189

Slide 189 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから 41 ※ php-terminal-nes-emulatorのコードではありません

Slide 190

Slide 190 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから • マシン語は構文解析なしに実行できる 41 ※ php-terminal-nes-emulatorのコードではありません

Slide 191

Slide 191 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから • マシン語は構文解析なしに実行できる • 前提事項: PCレジスタ = イマココ 41 ※ php-terminal-nes-emulatorのコードではありません

Slide 192

Slide 192 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから • マシン語は構文解析なしに実行できる • 前提事項: PCレジスタ = イマココ • STA abs 41 ※ php-terminal-nes-emulatorのコードではありません

Slide 193

Slide 193 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから • マシン語は構文解析なしに実行できる • 前提事項: PCレジスタ = イマココ • STA abs • 引数で指定されたメモリにAレジスタの データを保存する 41 ※ php-terminal-nes-emulatorのコードではありません

Slide 194

Slide 194 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから • マシン語は構文解析なしに実行できる • 前提事項: PCレジスタ = イマココ • STA abs • 引数で指定されたメモリにAレジスタの データを保存する 41 $8D $00 $20 $8004 STA abs ※ php-terminal-nes-emulatorのコードではありません

Slide 195

Slide 195 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから • マシン語は構文解析なしに実行できる • 前提事項: PCレジスタ = イマココ • STA abs • 引数で指定されたメモリにAレジスタの データを保存する 41 class Cpu { : $instruction = $this->ram[$this->pc]; $this->pc++; : switch ($instruction){ : case 0x8d: $addr = $this->ram[$this->pc] * 16 + $this->ram[$this->pc + 1]; $this->ram[$addr] = $this->a; $this->pc += 2; break; : $8D $00 $20 $8004 STA abs ※ php-terminal-nes-emulatorのコードではありません

Slide 196

Slide 196 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから • マシン語は構文解析なしに実行できる • 前提事項: PCレジスタ = イマココ • STA abs • 引数で指定されたメモリにAレジスタの データを保存する 41 class Cpu { : $instruction = $this->ram[$this->pc]; $this->pc++; : switch ($instruction){ : case 0x8d: $addr = $this->ram[$this->pc] * 16 + $this->ram[$this->pc + 1]; $this->ram[$addr] = $this->a; $this->pc += 2; break; : $8D $00 $20 $8004 STA abs ※ php-terminal-nes-emulatorのコードではありません めちゃ単純

Slide 197

Slide 197 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - 画面 42 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン

Slide 198

Slide 198 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - 画面 • CPUから特定のメモリアドレスを 読み書きするとPPUにアクセスできる 42 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン

Slide 199

Slide 199 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - 画面 • CPUから特定のメモリアドレスを 読み書きするとPPUにアクセスできる • ということは↓の世界 42 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン $this->ram[$addr] = $value

Slide 200

Slide 200 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - 画面 • CPUから特定のメモリアドレスを 読み書きするとPPUにアクセスできる • ということは↓の世界 42 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン $this->ram[$addr] = $value • CPU命令実行したあとに PPUのターンを作る

Slide 201

Slide 201 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - 画面 • CPUから特定のメモリアドレスを 読み書きするとPPUにアクセスできる • ということは↓の世界 42 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン $this->ram[$addr] = $value • CPU命令実行したあとに PPUのターンを作る while (true) { $this->cpu->run(); $renderingData = $this->ppu->run(); $this->renderer->render($renderingData); }

Slide 202

Slide 202 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - 画面 • CPUから特定のメモリアドレスを 読み書きするとPPUにアクセスできる • ということは↓の世界 42 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン $this->ram[$addr] = $value • CPU命令実行したあとに PPUのターンを作る • PPUのターンではVRAMの内容を 絵にするだけ while (true) { $this->cpu->run(); $renderingData = $this->ppu->run(); $this->renderer->render($renderingData); }

Slide 203

Slide 203 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ほかにも… 43

Slide 204

Slide 204 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ほかの下のレイヤが好きにやるパターン 44

Slide 205

Slide 205 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ほかの下のレイヤが好きにやるパターン • Rosetta 2 • Apple SiliconのMacでIntel CPU用のバイナリ(マシン語)を動作させる • Intel CPU用バイナリはIntel CPUの上で動いているつもりで動作してる 44

Slide 206

Slide 206 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ほかの下のレイヤが好きにやるパターン • Rosetta 2 • Apple SiliconのMacでIntel CPU用のバイナリ(マシン語)を動作させる • Intel CPU用バイナリはIntel CPUの上で動いているつもりで動作してる • Docker • Mac上でLinuxを動作させる 44

Slide 207

Slide 207 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ほかの下のレイヤが好きにやるパターン • Rosetta 2 • Apple SiliconのMacでIntel CPU用のバイナリ(マシン語)を動作させる • Intel CPU用バイナリはIntel CPUの上で動いているつもりで動作してる • Docker • Mac上でLinuxを動作させる • 仮想マシン • 物理PC上で仮想PCを動作させる • EC2とかさくらのVPSとか 44

Slide 208

Slide 208 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ という訳で… 45

Slide 209

Slide 209 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ✅ プログラムの実行 ✅ レイヤ化 ✅ 好きにやる 46

Slide 210

Slide 210 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ まとめ • そもそもプログラムを実行するとは何か • CPUでの実行 (電気回路による実行) or プログラムでの実行 • PHP, Python, Java, JavaScript, C, Goの実行の違い • 近代のコンピュータはレイヤー化されている • 下のレイヤのことは気にしなくて良くなっている • 仮想サーバとかDockerとかエミュレータはその特性を活かしている • エミュレータは難しくない • エミュレータとかコンパイラとかを楽しもう 47 長谷川 智希 @tomzoh 𝕏

Slide 211

Slide 211 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ おまけ 48

Slide 212

Slide 212 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHP インタープリタ ソースコードをphpコマンドで実行 $ php helllo-world.php 49

Slide 213

Slide 213 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 余談: 本当に左右に分かれてるファミコンカートリッジ 50 プログラム CPUに接続 キャラクタ PPUに接続

Slide 214

Slide 214 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 余談: トランスパイル • トランスパイルという言葉もある • 何かから何かに変換するという意味ではコンパイルと同じ • プログラム言語からほかのプログラム言語への変換で使われる • TypeScript → JavaScript とか • JavaScriptのPoly fi llとか • 動作としてはコンパイルと同じ • C言語 → アセンブラの場合にはコンパイルと言う • 高水準言語 → 高水準言語の場合を明示的に示すために使われ始めた…? 51

Slide 215

Slide 215 text

長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 余談: CとGoの違い • どちらも最終的にマシン語の実行ファイルができる • Cで作った hello-world と Go で作った hello-world • 動作は同じなのにサイズがだいぶ違う Cは17KB, Goは 2MB • 動的リンクと静的リンク • libc • 静的リンクすると852KB 52 $ ls -alFh 合計 60K -rwxrwxr-x 1 tom tom 17K Sep 12 04:16 hello-world* $ ls -alFh 合計 2.0M -rwxrwxr-x 1 tom tom 2.0M Sep 12 04:57 hello-world*