$30 off During Our Annual Pro Sale. View Details »

プログラムを実行するとはどういうことか / What does it mean to execute a program?

プログラムを実行するとはどういうことか / What does it mean to execute a program?

2022/12/21 第147回 PHP勉強会@東京の資料です。

関連:
「CPUとは何か」をPHPで考える / What is a CPU?
https://speakerdeck.com/tomzoh/what-is-a-cpu

続CPUとは何か / What is a CPU continued
https://speakerdeck.com/tomzoh/what-is-a-cpu-continued-e3c0ab67-5139-4f90-aa12-5d9fa924274f

HASEGAWA Tomoki

December 21, 2022
Tweet

More Decks by HASEGAWA Tomoki

Other Decks in Technology

Transcript

  1. 長谷川智希  @tomzoh
    2022/12/21 第147回 PHP勉強会@東京
    プログラムを実行するとは


    どういうことか
    マシン語, インタープリタ, コンパイラ, 仮想マシン

    View Slide

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

    View Slide

  3. 3
    νέοτൢചதʂ

    View Slide

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

    View Slide

  5. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか 5
    プログラムを実行するとは


    どういうことか
    マシン語, インタープリタ, コンパイラ, 仮想マシン

    View Slide

  6. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    プログラムの実行
    ひとくちに実行と言ってもいろいろな実行がある
    6
    MT
    CBOBOBTI
    QIQFMFQIBOUQIQ
    KBWBCFBOTDMBTT
    QIQJ
    KBWBDCFBOTKBWB
    HDDIFMMPD
    EPDLFSSVOEQIQBQBDIF

    View Slide

  7. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    プログラムは二種類ある
    7

    View Slide

  8. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    8
    ① CPUがそのまま実行できるもの
    ② CPUがそのまま実行できないもの

    View Slide

  9. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    プログラムの実行
    ひとくちに実行と言ってもいろいろな実行がある
    9
    MT
    CBOBOBTI
    QIQFMFQIBOUQIQ
    KBWBCFBOTDMBTT
    QIQJ
    KBWBDCFBOTKBWB
    HDDIFMMPD
    EPDLFSSVOEQIQBQBDIF

    View Slide

  10. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    プログラムは必ず


    最終的にはCPUで実行される
    10

    View Slide

  11. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか 11
    ① CPUがそのまま実行できるもの
    ② CPUがそのまま実行できないもの
    ②-A コンパイラで①に変換する


    ②-B インタープリタで実行する

    View Slide

  12. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    ① CPUがそのまま実行できるもの
    12

    View Slide

  13. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    CPUがそのまま実行できるもの
    • CPUは何を実行できるのか


    • マシン語, 機械語


    • ネイティブコードとも


    • 関連語: ニーモニック, アセンブラ


    • 構文解析なしに単体で実行可能な命令


    • シンプルな単一機能の命令


    • プログラムの原子とも言えるのでは
    13

    View Slide

  14. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    マシン語の特長・実行
    • マシン語 ガチでシンプル


    • ある: ジャンプ, 条件分岐, 演算, レジスタ, メモリアクセス, …


    • ない: クラス, 関数, ループ, 変数, …


    • マシン語の実行


    • プログラムカウンタ(PC)が指しているアドレスのメモリから命令を読み込んで実行する


    • 実行したらPCを++する


    • 余談


    • ジャンプ命令はPCへの値のセット


    • マルチスレッドCPUはPCを2つ持っている
    14

    View Slide

  15. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    PHPとマシン語
    15
    0x0000 3E 05 F5 C6 10 5F 0E 02


    0x0008 CD 05 00 F1 3D C2 02 00
    マシン語(Z80)
    マシン語ではバイナリと


    命令が1:1対応している
    ニーモニック, アセンブラ
    PHP
    for ($i = 5; $i > 0; $i--){


    print($i);


    }

    View Slide

  16. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    PHPとマシン語
    16
    for ($i = 5; $i > 0; $i--){


    print($i);


    }
    ld a, 5


    loop:


    push af


    add a, 16


    ld e, a


    ld c, 2


    call _bdos


    pop af


    dec a


    jp nz, loop
    PHP マシン語(Z80)ニーモニック
    0x0000 3E 05


    0x0002 F5


    0x0003 C6 10


    0x0005 5F


    0x0006 0E 02


    0x0008 CD 05 00


    0x000B F1


    0x000C 3D


    0x000D C2 00 02


    ld e, a+16


    BDOSコール


    • Z80用OS CP/MのAPI


    • CレジスタにBDOSコール番号を入れて
    コールする


    • C=2は文字表示 Eレジスタにキャラクタ
    コードを入れてコールする


    View Slide

  17. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    CPUがそのまま実行できるもの
    • CPUは何を実行できるのか


    • マシン語, 機械語


    • ネイティブコードとも


    • 関連語: ニーモニック, アセンブラ


    • CPUはマシン語を実行する機械 (machine)


    • マシン語 = 構文解析なしに単体で実行可能な
    命令


    • シンプルな単一機能の命令


    • プログラムの原子とも言えるのでは
    17
    ld a, 5


    loop:


    push af


    add a, 16


    ld e, a


    ld c, 2


    call _bdos


    pop af


    dec a


    jp nz, loop
    0x0000 3E 05


    0x0002 F5


    0x0003 C6 10


    0x0005 5F


    0x0006 0E 02


    0x0008 CD 05 00


    0x000B F1


    0x000C 3D


    0x000D C2 00 02


    View Slide

  18. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    ② CPUがそのまま実行できないもの
    18

    View Slide

  19. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    CPUがそのまま実行できないものをどう実行するか
    • CPUがそのまま実行できないもの = ソースコード


    • 2つの戦略がある


    • コンパイラ


    • compile: 編集する, 編纂する, 作成する


    • "CPUがそのまま実行できないもの"を"CPUがそのまま実行できるもの"に

    変換する(マシン語)プログラム


    • インタープリタ


    • interprete: 通訳する


    • "CPUがそのまま実行できないもの"を読み込んで解釈し、

    プログラムに書かれた動作をする(マシン語)プログラム
    19

    View Slide

  20. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    コンパイラ
    20

    View Slide

  21. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    コンパイラ
    • 何かを何かに変換するプログラム


    • CコンパイラはC言語のソースコードをマシン語に変換する


    • ソースコードをトークン化, 構文解析してマシン語に変換していく


    • マシン語になればそのまま実行できる


    • 変換したものは通常ファイルなどに保存する


    • コンパイル直後(Just-In-Time)に実行するコンパイラをJITコンパイラと言ったりする
    21

    View Slide

  22. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    コンパイラ よもやま話
    • 必ずしもマシン語に変換する訳ではない


    • 世の中で言われるコンパイラのほとんどは出力はマシン語ではないのでは[要出展]


    • SCSSとかJavaとかTypeScriptとか


    • 変換先がまた別のプログラミング言語の場合トランスパイルと言ったりもする


    • JavaコンパイラはJavaのソースコードをJavaバイトコードに変換する


    • JavaバイトコードはCPUがそのまま実行できない


    • Javaチップという夢


    • C/C++, Go, Rust あたりはマシン語に変換するコンパイラ言語
    22

    View Slide

  23. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    インタープリタ
    23

    View Slide

  24. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    インタープリタ
    • まさに通訳者


    • 自身がマシン語のプログラム


    • ソースコードをトークン化, 構文解析するところまではコンパイラと同じ


    • インタープリタはマシン語に変換しないでそのまま実行する


    • 実行 = プログラムに書かれた動作をする


    • 世の中のほとんどの言語はインタープリタだと思って良い


    • PHP, Perl, Python, Ruby, Java, …
    24

    View Slide

  25. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    インタープリタを表現する言語
    • 「自身がマシン語のプログラム」


    • マシン語でなくても良い


    • ほとんどマシン語なのはパフォーマンス上の理由


    • "PHPで書かれたJavaバイトコードインタープリタ"でも良い


    •最終的にはマシン語で書かれたインタープリタ or マシン語プログラムにたどり着
    くはず


    • 再掲: マシン語 = プログラムの原子
    25

    View Slide

  26. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    インタープリタの派生形
    • 言語っぽくないものを実行するインタープリタ


    • VM(Virtual Machine / 仮想マシン)と呼ばれることもある


    • Java VM, HHVM, …


    • 別のCPUのマシン語を実行するインタープリタ


    • いわゆるCPUエミュレータ
    26

    View Slide

  27. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    プログラム実行の階層構造
    27
    M1


    M1
    phpコマンド
    PHP言語


    hello world
    PHP言語 プログラム
    M1マシン語 インタープリタ
    CPU
    PHPプログラムの実行
    M1


    M1
    M1マシン語


    PHP VM
    PHP言語


    hello world
    PHP言語 プログラム
    M1マシン語 インタープリタ
    CPU
    M1マシン語


    hello world
    PHP Opcode プログラム
    M1マシン語


    PHPコンパイラ
    M1マシン語 コンパイラ
    PHPプログラムの実行
    こう見ることもできる
    M1


    M1
    CPU
    M1マシン語


    Rosetta 2
    M1マシン語 インタープリタ
    M1マシン語


    M1非対応アプリ
    IntelCPU用プログラム
    M1 Mac 上での


    Intel Mac用アプリ実行
    Rosetta 2はコンパイラとして


    動作してM1用バイナリをキャッシュ


    してるかも
    M1


    M1
    CPU
    M1マシン語


    gcc
    C言語 コンパイラ
    M1マシン語


    hello world
    C言語 プログラム
    マシン語の実行
    M1マシン語


    hello world
    M1マシン語 プログラム

    View Slide

  28. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか 28
    プログラムを実行するとは


    どういうことか
    マシン語, インタープリタ, コンパイラ, 仮想マシン
    まとめ

    View Slide

  29. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    プログラムを実行するということ
    • プログラムの実行には2つのパターンがある


    • CPUによるマシン語プログラムの実行


    • インタープリタによるプログラムの実行


    • どんなプログラム実行も最終的にはマシン語に行き着く
    29

    View Slide

  30. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    コンピュータの中で実行されているプログラムが


    どのように実行されているかの理解
    30
    パフォーマンスチューニング, デバッグに役立ったり


    コンパイラ, インタープリタ, エミュレータの開発に


    役立ったり…

    View Slide

  31. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    Enjoy hacking!!
    31

    View Slide

  32. 32
    ௕୩઒ஐر
    ͸͕ͤΘ ͱ΋͖
     @tomzoh
    プログラムを実行するとは


    どういうことか
    マシン語, インタープリタ, コンパイラ,
    仮想マシン
    おわり

    View Slide

  33. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    CPUは命令をどのように実行するか
    33
    余談

    View Slide

  34. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    名著 「CPUの創りかた」
    34
    https://amzn.to/3PF5vCC

    View Slide

  35. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    CPUの内部での命令実行 - CPUの回路
    35

    View Slide

  36. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    CPUの内部での命令実行 - CPUの回路ブロック図
    36
    Aレジスタ
    Bレジスタ
    出力ポート
    プログラム


    カウンタ
    入力ポート
    データ


    セレクタ 演算器
    メモリ
    命令
    CPUの命令 =


    演算器にどことどこから

    データを入れてどんな演算をして

    どこに戻すかの回路を切り替えるもの
    データの通り道
    TD4の構成を一部アレンジしています

    View Slide

  37. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    Cコンパイラよもやま話
    37
    余談

    View Slide

  38. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    Cコンパイラ
    • CコンパイラはC言語のソースコードをマシン語に変換する


    • 正確にはマシン語と(おおむね)1:1対応するニーモニックに変換する


    • ニーモニックからマシン語のバイナリに変換するにはアセンブラを使う


    • そのままマシン語のバイナリを出力しても良いけどデバッグがたいへん…


    • ラベルなどニーモニック独自の機能もある
    38

    View Slide

  39. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    Cコンパイラのソースコード
    • Cコンパイラのソースコードは何で書かれているか


    • Cで書かれている


    • そのソースコードはどうやってコンパイルを…?


    • 最小機能のCコンパイラをアセンブラ直書きで作り、少しずつ機能を足していく


    • 足した機能だけを使ってCコンパイラを書く


    • 機能が増えたらリファクタリングする
    39

    View Slide

  40. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    Cコンパイラを作るといろいろ捗る
    • トークン化, 構文解析といったプログラム言語の実装の知識


    • C言語そのものの理解


    • Cにおけるグローバル変数とローカル変数の違い


    • Cの関数コールとABI


    • Cのポインタとデリファレンス


    • 低レイヤを知りたい人のためのCコンパイラ作成入門


    • Rui Ueyamaさん


    • https://www.sigbus.info/compilerbook
    40

    View Slide

  41. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    CPUに興味がわいた方向け
    41
    余談

    View Slide

  42. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    「CPUとは何か」をPHPで考える
    PHP Conference Japan 2019
    • 「CPUとは何か」をPHPで考える


    • CPUを3つの視点で見た


    • プログラム実行環境


    • エミュレート対象


    • 電気回路
    42

    View Slide

  43. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    CPU 3つの視点 - 1: プログラム実行環境
    • 対象CPUで動くプログラムを書く


    • CPUをプログラム実行環境として見ると:


    • CPUはプログラム言語の様に見える


    • CPUの命令セットを理解し、プログラムを書く
    43

    View Slide

  44. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    CPU 3つの視点 - 2: エミュレート対象
    • 対象CPUのエミュレータを作る


    • CPUをエミュレート対象として見ると:


    • 他人の書いたプログラムを受け入れる存在に見える


    • CPUエミュレータと外部との境界は曖昧


    • CPUエミュレータ単体でなくコンピュータのエミュレータの中の1コンポーネントとして

    実装される / グラフィックやサウンド、入出力との境界は曖昧


    • Hardware speci
    fi
    cation as Code


    • エミュレータのソースを読むとハードウェアの仕様がわかる


    • Undocumentedな仕様もエミュレータのソースには書いてある
    44

    View Slide

  45. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    CPU 3つの視点 - 3: 電気回路
    • 対象CPUを電気回路として作る


    • CPUを電気回路として見ると:


    • 外部から供給されるクロックによって内部状態が切り替わる状態装置に見える


    • クロック: 心臓の鼓動


    • クロック ➡ CPUの状態変化


    • PC(プログラムカウンタ)が示すメモリアドレスから命令をフェッチする(読み込む)


    • フェッチした内容によってデータフロー・演算器のモードが決定される


    • 演算器の出力がレジスタやメモリに格納される


    • プログラム実行環境, エミュレータの様な1本の流れとしての実行ではなく

    複数の回路が同時に切り替わる形での実行
    45

    View Slide

  46. 長谷川智希 @tomzoh
    プログラムを実行するとはどういうことか
    続CPUとは何か
    PHP Conference Japan 2022
    • 4つ目の視点


    • ハードウェアエミュレータから見たCPU


    • コンピュータのCPUのフリをする

    ハードウェア


    • ハードウェアエミュレータを作るとCPU
    がどう見えるか
    46

    View Slide

  47. 47
    ௕୩઒ஐر
    ͸͕ͤΘ ͱ΋͖
     @tomzoh
    プログラムを実行するとは


    どういうことか
    マシン語, インタープリタ, コンパイラ,
    仮想マシン
    おわり

    View Slide