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

プログラムを実行するとはどういうことか / 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. 4 ௕୩઒ஐر ͸͕ͤΘ ͱ΋͖  @tomzoh ςοΫΧϯϑΝϨϯεӡӦࢀՃ 8FCJ04ΞϓϦ։ൃ  $16

    ϨτϩήʔϜػ ిࢠ޻࡞ Ϗʔϧ  αοΧʔ؍ઓ ϨϯλϧΧʔτϨʔε ʜ ϥΠϑϫʔΫ
  2. 長谷川智希 @tomzoh プログラムを実行するとはどういうことか CPUがそのまま実行できるもの • CPUは何を実行できるのか • マシン語, 機械語 •

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

    条件分岐, 演算, レジスタ, メモリアクセス, … • ない: クラス, 関数, ループ, 変数, … • マシン語の実行 • プログラムカウンタ(PC)が指しているアドレスのメモリから命令を読み込んで実行する • 実行したらPCを++する • 余談 • ジャンプ命令はPCへの値のセット • マルチスレッドCPUはPCを2つ持っている 14
  4. 長谷川智希 @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); }
  5. 長谷川智希 @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レジスタにキャラクタ コードを入れてコールする
  6. 長谷川智希 @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
  7. 長谷川智希 @tomzoh プログラムを実行するとはどういうことか CPUがそのまま実行できないものをどう実行するか • CPUがそのまま実行できないもの = ソースコード • 2つの戦略がある

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

    構文解析してマシン語に変換していく • マシン語になればそのまま実行できる • 変換したものは通常ファイルなどに保存する • コンパイル直後(Just-In-Time)に実行するコンパイラをJITコンパイラと言ったりする 21
  9. 長谷川智希 @tomzoh プログラムを実行するとはどういうことか コンパイラ よもやま話 • 必ずしもマシン語に変換する訳ではない • 世の中で言われるコンパイラのほとんどは出力はマシン語ではないのでは[要出展] •

    SCSSとかJavaとかTypeScriptとか • 変換先がまた別のプログラミング言語の場合トランスパイルと言ったりもする • JavaコンパイラはJavaのソースコードをJavaバイトコードに変換する • JavaバイトコードはCPUがそのまま実行できない • Javaチップという夢 • C/C++, Go, Rust あたりはマシン語に変換するコンパイラ言語 22
  10. 長谷川智希 @tomzoh プログラムを実行するとはどういうことか インタープリタ • まさに通訳者 • 自身がマシン語のプログラム • ソースコードをトークン化,

    構文解析するところまではコンパイラと同じ • インタープリタはマシン語に変換しないでそのまま実行する • 実行 = プログラムに書かれた動作をする • 世の中のほとんどの言語はインタープリタだと思って良い • PHP, Perl, Python, Ruby, Java, … 24
  11. 長谷川智希 @tomzoh プログラムを実行するとはどういうことか インタープリタを表現する言語 • 「自身がマシン語のプログラム」 • マシン語でなくても良い • ほとんどマシン語なのはパフォーマンス上の理由

    • "PHPで書かれたJavaバイトコードインタープリタ"でも良い •最終的にはマシン語で書かれたインタープリタ or マシン語プログラムにたどり着 くはず • 再掲: マシン語 = プログラムの原子 25
  12. 長谷川智希 @tomzoh プログラムを実行するとはどういうことか インタープリタの派生形 • 言語っぽくないものを実行するインタープリタ • VM(Virtual Machine /

    仮想マシン)と呼ばれることもある • Java VM, HHVM, … • 別のCPUのマシン語を実行するインタープリタ • いわゆるCPUエミュレータ 26
  13. 長谷川智希 @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マシン語 プログラム
  14. 長谷川智希 @tomzoh プログラムを実行するとはどういうことか CPUの内部での命令実行 - CPUの回路ブロック図 36 Aレジスタ Bレジスタ 出力ポート

    プログラム カウンタ 入力ポート データ セレクタ 演算器 メモリ 命令 CPUの命令 = 演算器にどことどこから 
 データを入れてどんな演算をして 
 どこに戻すかの回路を切り替えるもの データの通り道 TD4の構成を一部アレンジしています
  15. 長谷川智希 @tomzoh プログラムを実行するとはどういうことか Cコンパイラのソースコード • Cコンパイラのソースコードは何で書かれているか • Cで書かれている • そのソースコードはどうやってコンパイルを…?

    • 最小機能のCコンパイラをアセンブラ直書きで作り、少しずつ機能を足していく • 足した機能だけを使ってCコンパイラを書く • 機能が増えたらリファクタリングする 39
  16. 長谷川智希 @tomzoh プログラムを実行するとはどういうことか Cコンパイラを作るといろいろ捗る • トークン化, 構文解析といったプログラム言語の実装の知識 • C言語そのものの理解 •

    Cにおけるグローバル変数とローカル変数の違い • Cの関数コールとABI • Cのポインタとデリファレンス • 低レイヤを知りたい人のためのCコンパイラ作成入門 • Rui Ueyamaさん • https://www.sigbus.info/compilerbook 40
  17. 長谷川智希 @tomzoh プログラムを実行するとはどういうことか CPU 3つの視点 - 1: プログラム実行環境 • 対象CPUで動くプログラムを書く

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

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

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

    • ハードウェアエミュレータから見たCPU • コンピュータのCPUのフリをする 
 ハードウェア • ハードウェアエミュレータを作るとCPU がどう見えるか 46