Slide 1

Slide 1 text

長谷川智希  @tomzoh 2022/12/21 第147回 PHP勉強会@東京 プログラムを実行するとは どういうことか マシン語, インタープリタ, コンパイラ, 仮想マシン

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

3 νέοτൢചதʂ

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか 5 プログラムを実行するとは どういうことか マシン語, インタープリタ, コンパイラ, 仮想マシン

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか プログラムは必ず 最終的にはCPUで実行される 10

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか CPUがそのまま実行できるもの • CPUは何を実行できるのか • マシン語, 機械語 • ネイティブコードとも • 関連語: ニーモニック, アセンブラ • 構文解析なしに単体で実行可能な命令 • シンプルな単一機能の命令 • プログラムの原子とも言えるのでは 13

Slide 14

Slide 14 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか マシン語の特長・実行 • マシン語 ガチでシンプル • ある: ジャンプ, 条件分岐, 演算, レジスタ, メモリアクセス, … • ない: クラス, 関数, ループ, 変数, … • マシン語の実行 • プログラムカウンタ(PC)が指しているアドレスのメモリから命令を読み込んで実行する • 実行したらPCを++する • 余談 • ジャンプ命令はPCへの値のセット • マルチスレッドCPUはPCを2つ持っている 14

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

長谷川智希 @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レジスタにキャラクタ コードを入れてコールする

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか CPUがそのまま実行できないものをどう実行するか • CPUがそのまま実行できないもの = ソースコード • 2つの戦略がある • コンパイラ • compile: 編集する, 編纂する, 作成する • "CPUがそのまま実行できないもの"を"CPUがそのまま実行できるもの"に 
 変換する(マシン語)プログラム • インタープリタ • interprete: 通訳する • "CPUがそのまま実行できないもの"を読み込んで解釈し、 
 プログラムに書かれた動作をする(マシン語)プログラム 19

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか コンパイラ • 何かを何かに変換するプログラム • CコンパイラはC言語のソースコードをマシン語に変換する • ソースコードをトークン化, 構文解析してマシン語に変換していく • マシン語になればそのまま実行できる • 変換したものは通常ファイルなどに保存する • コンパイル直後(Just-In-Time)に実行するコンパイラをJITコンパイラと言ったりする 21

Slide 22

Slide 22 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか コンパイラ よもやま話 • 必ずしもマシン語に変換する訳ではない • 世の中で言われるコンパイラのほとんどは出力はマシン語ではないのでは[要出展] • SCSSとかJavaとかTypeScriptとか • 変換先がまた別のプログラミング言語の場合トランスパイルと言ったりもする • JavaコンパイラはJavaのソースコードをJavaバイトコードに変換する • JavaバイトコードはCPUがそのまま実行できない • Javaチップという夢 • C/C++, Go, Rust あたりはマシン語に変換するコンパイラ言語 22

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか インタープリタ • まさに通訳者 • 自身がマシン語のプログラム • ソースコードをトークン化, 構文解析するところまではコンパイラと同じ • インタープリタはマシン語に変換しないでそのまま実行する • 実行 = プログラムに書かれた動作をする • 世の中のほとんどの言語はインタープリタだと思って良い • PHP, Perl, Python, Ruby, Java, … 24

Slide 25

Slide 25 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか インタープリタを表現する言語 • 「自身がマシン語のプログラム」 • マシン語でなくても良い • ほとんどマシン語なのはパフォーマンス上の理由 • "PHPで書かれたJavaバイトコードインタープリタ"でも良い •最終的にはマシン語で書かれたインタープリタ or マシン語プログラムにたどり着 くはず • 再掲: マシン語 = プログラムの原子 25

Slide 26

Slide 26 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか インタープリタの派生形 • 言語っぽくないものを実行するインタープリタ • VM(Virtual Machine / 仮想マシン)と呼ばれることもある • Java VM, HHVM, … • 別のCPUのマシン語を実行するインタープリタ • いわゆるCPUエミュレータ 26

Slide 27

Slide 27 text

長谷川智希 @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マシン語 プログラム

Slide 28

Slide 28 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか 28 プログラムを実行するとは どういうことか マシン語, インタープリタ, コンパイラ, 仮想マシン まとめ

Slide 29

Slide 29 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか プログラムを実行するということ • プログラムの実行には2つのパターンがある • CPUによるマシン語プログラムの実行 • インタープリタによるプログラムの実行 • どんなプログラム実行も最終的にはマシン語に行き着く 29

Slide 30

Slide 30 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか コンピュータの中で実行されているプログラムが どのように実行されているかの理解 30 パフォーマンスチューニング, デバッグに役立ったり コンパイラ, インタープリタ, エミュレータの開発に 役立ったり…

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

32 ௕୩઒ஐر ͸͕ͤΘ ͱ΋͖  @tomzoh プログラムを実行するとは どういうことか マシン語, インタープリタ, コンパイラ, 仮想マシン おわり

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか CPUの内部での命令実行 - CPUの回路ブロック図 36 Aレジスタ Bレジスタ 出力ポート プログラム カウンタ 入力ポート データ セレクタ 演算器 メモリ 命令 CPUの命令 = 演算器にどことどこから 
 データを入れてどんな演算をして 
 どこに戻すかの回路を切り替えるもの データの通り道 TD4の構成を一部アレンジしています

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか Cコンパイラ • CコンパイラはC言語のソースコードをマシン語に変換する • 正確にはマシン語と(おおむね)1:1対応するニーモニックに変換する • ニーモニックからマシン語のバイナリに変換するにはアセンブラを使う • そのままマシン語のバイナリを出力しても良いけどデバッグがたいへん… • ラベルなどニーモニック独自の機能もある 38

Slide 39

Slide 39 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか Cコンパイラのソースコード • Cコンパイラのソースコードは何で書かれているか • Cで書かれている • そのソースコードはどうやってコンパイルを…? • 最小機能のCコンパイラをアセンブラ直書きで作り、少しずつ機能を足していく • 足した機能だけを使ってCコンパイラを書く • 機能が増えたらリファクタリングする 39

Slide 40

Slide 40 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか Cコンパイラを作るといろいろ捗る • トークン化, 構文解析といったプログラム言語の実装の知識 • C言語そのものの理解 • Cにおけるグローバル変数とローカル変数の違い • Cの関数コールとABI • Cのポインタとデリファレンス • 低レイヤを知りたい人のためのCコンパイラ作成入門 • Rui Ueyamaさん • https://www.sigbus.info/compilerbook 40

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか 「CPUとは何か」をPHPで考える PHP Conference Japan 2019 • 「CPUとは何か」をPHPで考える • CPUを3つの視点で見た • プログラム実行環境 • エミュレート対象 • 電気回路 42

Slide 43

Slide 43 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか CPU 3つの視点 - 1: プログラム実行環境 • 対象CPUで動くプログラムを書く • CPUをプログラム実行環境として見ると: • CPUはプログラム言語の様に見える • CPUの命令セットを理解し、プログラムを書く 43

Slide 44

Slide 44 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか CPU 3つの視点 - 2: エミュレート対象 • 対象CPUのエミュレータを作る • CPUをエミュレート対象として見ると: • 他人の書いたプログラムを受け入れる存在に見える • CPUエミュレータと外部との境界は曖昧 • CPUエミュレータ単体でなくコンピュータのエミュレータの中の1コンポーネントとして 
 実装される / グラフィックやサウンド、入出力との境界は曖昧 • Hardware speci fi cation as Code • エミュレータのソースを読むとハードウェアの仕様がわかる • Undocumentedな仕様もエミュレータのソースには書いてある 44

Slide 45

Slide 45 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか CPU 3つの視点 - 3: 電気回路 • 対象CPUを電気回路として作る • CPUを電気回路として見ると: • 外部から供給されるクロックによって内部状態が切り替わる状態装置に見える • クロック: 心臓の鼓動 • クロック ➡ CPUの状態変化 • PC(プログラムカウンタ)が示すメモリアドレスから命令をフェッチする(読み込む) • フェッチした内容によってデータフロー・演算器のモードが決定される • 演算器の出力がレジスタやメモリに格納される • プログラム実行環境, エミュレータの様な1本の流れとしての実行ではなく 
 複数の回路が同時に切り替わる形での実行 45

Slide 46

Slide 46 text

長谷川智希 @tomzoh プログラムを実行するとはどういうことか 続CPUとは何か PHP Conference Japan 2022 • 4つ目の視点 • ハードウェアエミュレータから見たCPU • コンピュータのCPUのフリをする 
 ハードウェア • ハードウェアエミュレータを作るとCPU がどう見えるか 46

Slide 47

Slide 47 text

47 ௕୩઒ஐر ͸͕ͤΘ ͱ΋͖  @tomzoh プログラムを実行するとは どういうことか マシン語, インタープリタ, コンパイラ, 仮想マシン おわり