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

PHPからはじめるコンピュータア ーキテクチャ / PHP Meets Silicon: A Fun Dive into Computer Structures PHP Conference 2023 ver

PHPからはじめるコンピュータア ーキテクチャ / PHP Meets Silicon: A Fun Dive into Computer Structures PHP Conference 2023 ver

PHP Conference Japan 2023
「PHPからはじめるコンピュータア ーキテクチャ」の発表資料です

HASEGAWA Tomoki

October 08, 2023
Tweet

More Decks by HASEGAWA Tomoki

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  77. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    PHP
    インタープリタ
    16
    echo 'Hello, world.'
    hello-world.php

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  109. 長谷川智希 @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
    $ݴޠͱಉ͡ʹݟ͑Δ͚Ͳɺ&-'ϔομ͸
    όΠτͱ͔͋ΔΒ͍͠ͷͰʜ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  131. 長谷川智希 @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コマンド

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  195. 長谷川智希 @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のコードではありません

    View full-size slide

  196. 長谷川智希 @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のコードではありません
    めちゃ単純

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  201. 長谷川智希 @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);
    }

    View full-size slide

  202. 長谷川智希 @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);
    }

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  212. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    PHP
    インタープリタ
    ソースコードをphpコマンドで実行
    $ php helllo-world.php
    49
    echo 'Hello, world.'
    hello-world.php
    $ php -dopcache.enable_cli=1 -dopcache.opt_debug_level=0x10000
    hello-world.php
    $_main: ; (lines=2, args=0, vars=0, tmps=0)
    ; (before optimizer)
    ; /home/tom/tmp/php/hello-world.php:1-3
    L0 (2): ECHO string("Hello, world.")
    L1 (3): RETURN int(1)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide