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

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

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

PHPカンファンレンス沖縄 2023の資料です。
https://fortee.jp/phpcon-okinawa-2023/proposal/d1fcf65d-99aa-4e86-befc-64338f1e22c6

現代のコンピュータはハードウェアから私たちプログラマが書くプログラムの動作までの間が多くのレイヤーに分けられて動作しています。
各レイヤーは自分より下を抽象化し、下のレイヤーを詳しく理解しなくても多くの場合プログラマはプログラムを書けます。
一方、プログラムが期待した様に動作しない時には下のレイヤーの動作の理解が問題の解決の助けになることもあります。

このトークでは私たちが愛するPHPをスタート地点にして、「CPUによる"プログラム実行"」「 PHPやJavaとC言語の根本的な違い」など、コンピュータプログラムがどの様に動作するのかを解説します。

コンピュータのレイヤー構造を理解すると、いままでは見えていなかった角度からプログラミングを楽しめるようになります。
このトークを通じて、低レイヤーが好きになったり、いろいろなレイヤーで面白いことをしたりする方が増えることを期待しています!

HASEGAWA Tomoki

September 16, 2023
Tweet

More Decks by HASEGAWA Tomoki

Other Decks in Technology

Transcript

  1. 長谷川智希
    𝕏
    @tomzoh
    2023/09/15 PHPカンファレンス沖縄 2023
    プログラムの実行とレイヤー化されたコンピュータ
    PHPからはじめる


    コ ンピュータ ア ーキテクチャ

    View Slide

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

    View Slide

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

    Ϗʔϧ αοΧʔ؍ઓ ϨϯλϧΧʔτϨʔε ʜ
    ϥΠϑϫʔΫ
    𝕏

    View Slide

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


    コ ンピュータ ア ーキテクチャ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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


    レイヤ化
    6

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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


    • アセンブラ


    • コンパイラ

    View Slide

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


    • アセンブラ


    • コンパイラ
    • インタープリタ


    • VM

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい
    9

    View Slide

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

    データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい
    • レジスタは決まった名前/サイズで決まった個数あるだけ
    9

    View Slide

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

    データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい
    • レジスタは決まった名前/サイズで決まった個数あるだけ
    • 命令は単体で完結し、文法はない
    9

    View Slide

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

    データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい
    • レジスタは決まった名前/サイズで決まった個数あるだけ
    • 命令は単体で完結し、文法はない
    • プログラム言語とは言えないぐらい原始的
    9

    View Slide

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

    データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい
    • レジスタは決まった名前/サイズで決まった個数あるだけ
    • 命令は単体で完結し、文法はない
    • プログラム言語とは言えないぐらい原始的
    • 電気回路として実装されている
    9

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    プログラムをアセンブラと呼ぶ
    10

    View Slide

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

    プログラムをアセンブラと呼ぶ
    • 転じてニーモニックで書かれたプログラムをアセンブラとかアセンブリ言語と言ったり
    10

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    → バイトコード(バイナリ / HelloWorld.class) → java HelloWorld
    11

    View Slide

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

    → バイトコード(バイナリ / HelloWorld.class) → java HelloWorld
    • どちらの方式でも

    実行 = 命令を読み込んでその通りに動作する

    ということ
    11

    View Slide

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


    $a=100;
    test.php

    View Slide

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


    $a=100;
    test.php

    View Slide

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


    $a=100;
    test.php

    View Slide

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

    変数名は$aで確定。ということは次の = は代入で、100 は数字。

    次に ; があるからここまで実行しよう」と解釈する
    12


    $a=100;
    test.php

    View Slide

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

    変数名は$aで確定。ということは次の = は代入で、100 は数字。

    次に ; があるからここまで実行しよう」と解釈する
    • $a が既に存在しているかを調べる
    12


    $a=100;
    test.php

    View Slide

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

    変数名は$aで確定。ということは次の = は代入で、100 は数字。

    次に ; があるからここまで実行しよう」と解釈する
    • $a が既に存在しているかを調べる
    • 存在していなければメモリ上に $a の中身を保存する領域を

    確保する
    12


    $a=100;
    test.php

    View Slide

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

    変数名は$aで確定。ということは次の = は代入で、100 は数字。

    次に ; があるからここまで実行しよう」と解釈する
    • $a が既に存在しているかを調べる
    • 存在していなければメモリ上に $a の中身を保存する領域を

    確保する
    • メモリ上の $a の領域に 100 を書く
    12


    $a=100;
    test.php

    View 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 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 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 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 Slide

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

    View Slide

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


    echo 'Hello, world.'
    hello-world.php

    View Slide

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

    $ php helllo-world.php
    16


    echo 'Hello, world.'
    hello-world.php

    View Slide

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

    View Slide

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

    $ python3 hello-world.py
    17
    print('Hello, world.')
    hello-world.py

    View Slide

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

    View Slide

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

    $ node hello-world.js
    18
    console.log("Hello, world.");
    hello-world.js

    View Slide

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

    $ node hello-world.js
    複数のエンジン実装
    18
    console.log("Hello, world.");
    hello-world.js

    View Slide

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

    $ node hello-world.js
    複数のエンジン実装
    • Node.js
    18
    console.log("Hello, world.");
    hello-world.js

    View Slide

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

    $ node hello-world.js
    複数のエンジン実装
    • Node.js
    • ブラウザ
    18
    console.log("Hello, world.");
    hello-world.js

    View Slide

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

    $ node hello-world.js
    複数のエンジン実装
    • Node.js
    • ブラウザ
    • Bun
    18
    console.log("Hello, world.");
    hello-world.js

    View Slide

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

    $ node hello-world.js
    複数のエンジン実装
    • Node.js
    • ブラウザ
    • Bun
    複数の実装があるのは珍しくはない
    18
    console.log("Hello, world.");
    hello-world.js

    View Slide

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

    $ node hello-world.js
    複数のエンジン実装
    • Node.js
    • ブラウザ
    • Bun
    複数の実装があるのは珍しくはない
    • RubyとかPythonも実装が複数ある
    18
    console.log("Hello, world.");
    hello-world.js

    View Slide

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

    $ node hello-world.js
    複数のエンジン実装
    • Node.js
    • ブラウザ
    • Bun
    複数の実装があるのは珍しくはない
    • RubyとかPythonも実装が複数ある
    • PHPもHackがあったり
    18
    console.log("Hello, world.");
    hello-world.js

    View Slide

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

    View Slide

  91. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    Java
    コンパイラ + インタープリタ
    ソースコード(テキストファイル)
    19
    class HelloWorld {


    public static void main(String[] args){


    System.out.println("Hello, world.");


    }


    }


    HelloWorld.java

    View Slide

  92. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    Java
    コンパイラ + インタープリタ
    ソースコード(テキストファイル)
    Javaコンパイラ → バイトコード(バイナリ)
    19
    class HelloWorld {


    public static void main(String[] args){


    System.out.println("Hello, world.");


    }


    }


    HelloWorld.java

    View Slide

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

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

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

    View Slide

  96. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    C
    コンパイラ
    ソースコード(テキストファイル)
    20
    #include


    int main(void){


    printf("Hello, world.");


    }
    hello-world.c

    View Slide

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

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

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

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

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

    View Slide

  102. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    Go
    コンパイラ
    ソースコード(テキスト)
    21
    package main


    import "fmt"


    func main() {


    fmt.Printf("Hello, world.")


    }


    hello-world.go

    View Slide

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

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

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

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

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


    👉 レイヤ化
    22

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

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

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

    View Slide

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


    PHPプログラム
    phpコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro

    View Slide

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


    PHPプログラム
    phpコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro

    View Slide

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


    PHPプログラム
    phpコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro

    View Slide

  121. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    我々がPHPプログラムを実行すると…
    $ php hello-world.php
    • CPUはphpコマンドを実行する
    • Cで書かれたプログラム
    • コンパイルされアセンブルされリンクされ

    マシン語の実行ファイルになっている
    24
    hello-world.php


    PHPプログラム
    phpコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro

    View Slide

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

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

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

    View Slide

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


    CPU
    Mac Book Pro
    hello-worldコマンド

    View Slide

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


    CPU
    Mac Book Pro
    hello-worldコマンド

    View Slide

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

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

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

    View Slide

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

    CPUで動いているのは

    マシン語のプログラム
    26

    View Slide

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

    CPUで動いているのは

    マシン語のプログラム
    PHP phpコマンドが

    PHPプログラムを都度解釈して

    実行する

    → コンパイル不要
    26
    hello-world.php


    PHPプログラム
    phpコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro

    View Slide

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

  133. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    もっと下のレイヤ
    27
    hello-world.php


    PHPプログラム
    phpコマンド
    Linux
    CPU
    PC

    View Slide

  134. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    もっと下のレイヤ
    下のレイヤを気にしないのは

    もっと下のレイヤでも同じ
    27
    hello-world.php


    PHPプログラム
    phpコマンド
    Linux
    CPU
    PC

    View Slide

  135. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    もっと下のレイヤ
    下のレイヤを気にしないのは

    もっと下のレイヤでも同じ
    Linuxは自分を実行しているの
    が実CPUなのか仮想CPUなの
    かは気にしない
    27
    hello-world.php


    PHPプログラム
    phpコマンド
    Linux
    CPU
    PC

    View Slide

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

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

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


    ✅ レイヤ化
    28

    View Slide

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

    View Slide

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

    終わりです
    30

    View Slide

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


    下のレイヤを気にしないなら
    31

    View Slide

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

    View Slide

  143. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    hello-world.php


    PHPプログラム
    phpコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro
    下のレイヤが好きにやる
    33

    View Slide

  144. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    hello-world.php


    PHPプログラム
    phpコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro
    下のレイヤが好きにやる
    • PHPで書かれたプログラム(hello-world.php)は

    自分より下を気にしていない
    33

    View Slide

  145. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    hello-world.php


    PHPプログラム
    phpコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro
    ここは何でもいい
    下のレイヤが好きにやる
    • PHPで書かれたプログラム(hello-world.php)は

    自分より下を気にしていない
    33

    View Slide

  146. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    hello-world.php


    PHPプログラム
    phpコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro
    ここは何でもいい
    下のレイヤが好きにやる
    • PHPで書かれたプログラム(hello-world.php)は

    自分より下を気にしていない
    • 自分を実行してくれれば何でも良い
    33

    View Slide

  147. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    HelloWorld.class


    Javaバイトコード
    javaコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro
    下のレイヤが好きにやる
    34

    View Slide

  148. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    HelloWorld.class


    Javaバイトコード
    javaコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro
    下のレイヤが好きにやる
    Javaで書かれ、

    Javaバイトコードに

    変換されたプログラム

    (HelloWorld.class)
    34

    View Slide

  149. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    HelloWorld.class


    Javaバイトコード
    javaコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro
    下のレイヤが好きにやる
    Javaで書かれ、

    Javaバイトコードに

    変換されたプログラム

    (HelloWorld.class)
    javaコマンドより下は

    気にしていない
    34

    View Slide

  150. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    HelloWorld.class


    Javaバイトコード
    javaコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro
    ここは何でもいい
    下のレイヤが好きにやる
    Javaで書かれ、

    Javaバイトコードに

    変換されたプログラム

    (HelloWorld.class)
    javaコマンドより下は

    気にしていない
    34

    View Slide

  151. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    HelloWorld.class


    Javaバイトコード
    javaコマンド
    macOS
    Apple Silicon


    CPU
    Mac Book Pro
    ここは何でもいい
    下のレイヤが好きにやる
    Javaで書かれ、

    Javaバイトコードに

    変換されたプログラム

    (HelloWorld.class)
    javaコマンドより下は

    気にしていない
    なら好きにしてみよう
    34

    View Slide

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

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

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

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

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

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

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

    View Slide

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

    View Slide

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


    6502
    PPU
    RAM V-RAM
    APU
    カートリッジ

    View Slide

  161. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    みんな大好き ファミコン
    • カートリッジ左半分には6502*1用の

    マシン語プログラムが格納されている
    37
    CPU


    6502
    PPU
    RAM V-RAM
    APU
    カートリッジ
    マシン語


    プログラム
    *1 実際は6502ベースのカスタムIC RP2A03

    View Slide

  162. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    みんな大好き ファミコン
    • カートリッジ左半分には6502*1用の

    マシン語プログラムが格納されている
    • カートリッジ右半分には

    キャラクタのパターンが格納されている
    37
    CPU


    6502
    PPU
    RAM V-RAM
    APU
    カートリッジ
    マシン語


    プログラム
    キャラクタ


    パターン
    *1 実際は6502ベースのカスタムIC RP2A03

    View Slide

  163. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    みんな大好き ファミコン
    • カートリッジ左半分には6502*1用の

    マシン語プログラムが格納されている
    • カートリッジ右半分には

    キャラクタのパターンが格納されている
    • このマシン語プログラムも当然

    下のレイヤは気にしない
    37
    CPU


    6502
    PPU
    RAM V-RAM
    APU
    カートリッジ
    マシン語


    プログラム
    キャラクタ


    パターン
    *1 実際は6502ベースのカスタムIC RP2A03

    View Slide

  164. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    みんな大好き ファミコン
    • カートリッジ左半分には6502*1用の

    マシン語プログラムが格納されている
    • カートリッジ右半分には

    キャラクタのパターンが格納されている
    • このマシン語プログラムも当然

    下のレイヤは気にしない
    37
    CPU


    6502
    PPU
    RAM V-RAM
    APU
    カートリッジ
    マシン語


    プログラム
    キャラクタ


    パターン
    *1 実際は6502ベースのカスタムIC RP2A03
    ここは何でもいい

    View Slide

  165. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    みんな大好き ファミコン
    • カートリッジ左半分には6502*1用の

    マシン語プログラムが格納されている
    • カートリッジ右半分には

    キャラクタのパターンが格納されている
    • このマシン語プログラムも当然

    下のレイヤは気にしない
    • なら好きにさせてもらおう
    37
    CPU


    6502
    PPU
    RAM V-RAM
    APU
    カートリッジ
    マシン語


    プログラム
    キャラクタ


    パターン
    *1 実際は6502ベースのカスタムIC RP2A03
    ここは何でもいい

    View Slide

  166. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    みんな大好き ファミコン
    • カートリッジ左半分には6502*1用の

    マシン語プログラムが格納されている
    • カートリッジ右半分には

    キャラクタのパターンが格納されている
    • このマシン語プログラムも当然

    下のレイヤは気にしない
    • なら好きにさせてもらおう
    37
    CPU


    6502
    PPU
    RAM V-RAM
    APU
    カートリッジ
    マシン語


    プログラム
    キャラクタ


    パターン
    *1 実際は6502ベースのカスタムIC RP2A03

    View Slide

  167. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    みんな大好き ファミコン
    • カートリッジ左半分には6502*1用の

    マシン語プログラムが格納されている
    • カートリッジ右半分には

    キャラクタのパターンが格納されている
    • このマシン語プログラムも当然

    下のレイヤは気にしない
    • なら好きにさせてもらおう
    37
    CPU


    6502
    PPU
    RAM V-RAM
    APU
    カートリッジ
    マシン語


    プログラム
    キャラクタ


    パターン
    *1 実際は6502ベースのカスタムIC RP2A03
    話は聞かせて


    もらった!!

    View Slide

  168. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    みんな大好き ファミコン
    • カートリッジ左半分には6502*1用の

    マシン語プログラムが格納されている
    • カートリッジ右半分には

    キャラクタのパターンが格納されている
    • このマシン語プログラムも当然

    下のレイヤは気にしない
    • なら好きにさせてもらおう
    37
    CPU


    6502
    PPU
    RAM V-RAM
    APU
    カートリッジ
    マシン語


    プログラム
    キャラクタ


    パターン
    *1 実際は6502ベースのカスタムIC RP2A03
    話は聞かせて


    もらった!!
    好きにさせて


    もらおう!

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    JavaScript実装の写経
    38
    *1 https://github.com/hasegawa-tomoki/php-terminal-nes-emulator

    View Slide

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

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

    View Slide

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

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

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

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

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

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

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

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  190. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    ファミコンエミュレータの実装 - CPU
    • CPUのエミュレーションは簡単
    • マシン語を実行するだけだから
    • マシン語は構文解析なしに実行できる
    • PCレジスタ = イマココ
    • STA abs
    • 引数で指定されたメモリにAレジスタの

    データを保存する
    41
    ※ php-terminal-nes-emulatorのコードではありません

    View Slide

  191. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    ファミコンエミュレータの実装 - CPU
    • CPUのエミュレーションは簡単
    • マシン語を実行するだけだから
    • マシン語は構文解析なしに実行できる
    • PCレジスタ = イマココ
    • STA abs
    • 引数で指定されたメモリにAレジスタの

    データを保存する
    41
    $8D $00 $20
    $8004 STA abs
    ※ php-terminal-nes-emulatorのコードではありません

    View Slide

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

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

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


    6502
    PPU
    RAM V-RAM
    APU
    カートリッジ
    マシン語


    プログラム
    キャラクタ


    パターン

    View Slide

  195. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    ファミコンエミュレータの実装 - 画面
    • CPUから特定のメモリアドレスを

    読み書きするとPPUにアクセスできる
    42
    CPU


    6502
    PPU
    RAM V-RAM
    APU
    カートリッジ
    マシン語


    プログラム
    キャラクタ


    パターン

    View Slide

  196. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    ファミコンエミュレータの実装 - 画面
    • CPUから特定のメモリアドレスを

    読み書きするとPPUにアクセスできる
    • ということは↓の世界
    42
    CPU


    6502
    PPU
    RAM V-RAM
    APU
    カートリッジ
    マシン語


    プログラム
    キャラクタ


    パターン
    $this->ram[$addr] = $value

    View Slide

  197. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    ファミコンエミュレータの実装 - 画面
    • CPUから特定のメモリアドレスを

    読み書きするとPPUにアクセスできる
    • ということは↓の世界
    42
    CPU


    6502
    PPU
    RAM V-RAM
    APU
    カートリッジ
    マシン語


    プログラム
    キャラクタ


    パターン
    $this->ram[$addr] = $value
    • CPU命令実行したあとに

    PPUのターンを作る

    View Slide

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

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

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

    View Slide

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

    View Slide

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


    • Apple SiliconのMacでIntel CPU用のバイナリ(マシン語)を動作させる


    • Intel CPU用バイナリはIntel CPUの上で動いているつもりで動作してる
    44

    View Slide

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


    • Apple SiliconのMacでIntel CPU用のバイナリ(マシン語)を動作させる


    • Intel CPU用バイナリはIntel CPUの上で動いているつもりで動作してる
    • Docker


    • Mac上でLinuxを動作させる
    44

    View Slide

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


    • Apple SiliconのMacでIntel CPU用のバイナリ(マシン語)を動作させる


    • Intel CPU用バイナリはIntel CPUの上で動いているつもりで動作してる
    • Docker


    • Mac上でLinuxを動作させる
    • 仮想マシン


    • 物理PC上で仮想PCを動作させる


    • EC2とかさくらのVPSとか
    44

    View Slide

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

    View Slide

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


    ✅ レイヤ化


    ✅ 好きにやる
    46

    View Slide

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


    • CPUでの実行 (電気回路による実行) or プログラムでの実行


    • PHP, Python, Java, JavaScript, C, Goの実行の違い


    • 近代のコンピュータはレイヤー化されている


    • 下のレイヤのことは気にしなくて良くなっている


    • 仮想サーバとかDockerとかエミュレータはその特性を活かしている


    • エミュレータは難しくない


    • エミュレータとかコンパイラとかを楽しもう
    47
    長谷川 智希
    @tomzoh
    𝕏

    View Slide

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

    View Slide

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

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

    View Slide

  211. 長谷川智希 @tomzoh
    PHPからはじめるコンピュータアーキテクチャ
    余談: トランスパイル
    • トランスパイルという言葉もある


    • 何かから何かに変換するという意味ではコンパイルと同じ


    • プログラム言語からほかのプログラム言語への変換で使われる


    • TypeScript → JavaScript とか


    • JavaScriptのPoly
    fi
    llとか


    • 動作としてはコンパイルと同じ


    • C言語 → アセンブラの場合にはコンパイルと言う


    • 高水準言語 → 高水準言語の場合を明示的に示すために使われ始めた…?
    51

    View Slide

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