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
長谷川智希 @tomzoh2022/12/21 第147回 PHP勉強会@東京プログラムを実行するとはどういうことかマシン語, インタープリタ, コンパイラ, 仮想マシン
View Slide
2୩ஐر͕ͤΘ ͱ͖ @tomzohhttp://www.dgcircus.comデジタルサーカス株式会社 副団長CTOॴଐ ٕज़ΧϯϑΝϨϯεओ࠻دߘɾஶॻ来たれ!PHPer!We are hiring!
3νέοτൢചதʂ
4୩ஐر͕ͤΘ ͱ͖ @tomzohςοΫΧϯϑΝϨϯεӡӦࢀՃ 8FCJ04ΞϓϦ։ൃ $16 ϨτϩήʔϜػ ిࢠ࡞ Ϗʔϧ αοΧʔ؍ઓ ϨϯλϧΧʔτϨʔε ʜϥΠϑϫʔΫ
長谷川智希 @tomzohプログラムを実行するとはどういうことか 5プログラムを実行するとはどういうことかマシン語, インタープリタ, コンパイラ, 仮想マシン
長谷川智希 @tomzohプログラムを実行するとはどういうことかプログラムの実行ひとくちに実行と言ってもいろいろな実行がある6MTCBOBOBTIQIQFMFQIBOUQIQKBWBCFBOTDMBTTQIQJKBWBDCFBOTKBWBHDDIFMMPDEPDLFSSVOEQIQBQBDIF
長谷川智希 @tomzohプログラムを実行するとはどういうことかプログラムは二種類ある7
長谷川智希 @tomzohプログラムを実行するとはどういうことか8① CPUがそのまま実行できるもの② CPUがそのまま実行できないもの
長谷川智希 @tomzohプログラムを実行するとはどういうことかプログラムの実行ひとくちに実行と言ってもいろいろな実行がある9MTCBOBOBTIQIQFMFQIBOUQIQKBWBCFBOTDMBTTQIQJKBWBDCFBOTKBWBHDDIFMMPDEPDLFSSVOEQIQBQBDIF
長谷川智希 @tomzohプログラムを実行するとはどういうことかプログラムは必ず最終的にはCPUで実行される10
長谷川智希 @tomzohプログラムを実行するとはどういうことか 11① CPUがそのまま実行できるもの② CPUがそのまま実行できないもの②-A コンパイラで①に変換する②-B インタープリタで実行する
長谷川智希 @tomzohプログラムを実行するとはどういうことか① CPUがそのまま実行できるもの12
長谷川智希 @tomzohプログラムを実行するとはどういうことかCPUがそのまま実行できるもの• CPUは何を実行できるのか• マシン語, 機械語• ネイティブコードとも• 関連語: ニーモニック, アセンブラ• 構文解析なしに単体で実行可能な命令• シンプルな単一機能の命令• プログラムの原子とも言えるのでは13
長谷川智希 @tomzohプログラムを実行するとはどういうことかマシン語の特長・実行• マシン語 ガチでシンプル• ある: ジャンプ, 条件分岐, 演算, レジスタ, メモリアクセス, …• ない: クラス, 関数, ループ, 変数, …• マシン語の実行• プログラムカウンタ(PC)が指しているアドレスのメモリから命令を読み込んで実行する• 実行したらPCを++する• 余談• ジャンプ命令はPCへの値のセット• マルチスレッドCPUはPCを2つ持っている14
長谷川智希 @tomzohプログラムを実行するとはどういうことかPHPとマシン語150x0000 3E 05 F5 C6 10 5F 0E 020x0008 CD 05 00 F1 3D C2 02 00マシン語(Z80)マシン語ではバイナリと命令が1:1対応しているニーモニック, アセンブラPHPfor ($i = 5; $i > 0; $i--){print($i);}
長谷川智希 @tomzohプログラムを実行するとはどういうことかPHPとマシン語16for ($i = 5; $i > 0; $i--){print($i);}ld a, 5loop:push afadd a, 16ld e, ald c, 2call _bdospop afdec ajp nz, loopPHP マシン語(Z80)ニーモニック0x0000 3E 050x0002 F50x0003 C6 100x0005 5F0x0006 0E 020x0008 CD 05 000x000B F10x000C 3D0x000D C2 00 02ld e, a+16BDOSコール• Z80用OS CP/MのAPI• CレジスタにBDOSコール番号を入れてコールする• C=2は文字表示 Eレジスタにキャラクタコードを入れてコールする
長谷川智希 @tomzohプログラムを実行するとはどういうことかCPUがそのまま実行できるもの• CPUは何を実行できるのか• マシン語, 機械語• ネイティブコードとも• 関連語: ニーモニック, アセンブラ• CPUはマシン語を実行する機械 (machine)• マシン語 = 構文解析なしに単体で実行可能な命令• シンプルな単一機能の命令• プログラムの原子とも言えるのでは17ld a, 5loop:push afadd a, 16ld e, ald c, 2call _bdospop afdec ajp nz, loop0x0000 3E 050x0002 F50x0003 C6 100x0005 5F0x0006 0E 020x0008 CD 05 000x000B F10x000C 3D0x000D C2 00 02
長谷川智希 @tomzohプログラムを実行するとはどういうことか② CPUがそのまま実行できないもの18
長谷川智希 @tomzohプログラムを実行するとはどういうことかCPUがそのまま実行できないものをどう実行するか• CPUがそのまま実行できないもの = ソースコード• 2つの戦略がある• コンパイラ• compile: 編集する, 編纂する, 作成する• "CPUがそのまま実行できないもの"を"CPUがそのまま実行できるもの"に 変換する(マシン語)プログラム• インタープリタ• interprete: 通訳する• "CPUがそのまま実行できないもの"を読み込んで解釈し、 プログラムに書かれた動作をする(マシン語)プログラム19
長谷川智希 @tomzohプログラムを実行するとはどういうことかコンパイラ20
長谷川智希 @tomzohプログラムを実行するとはどういうことかコンパイラ• 何かを何かに変換するプログラム• CコンパイラはC言語のソースコードをマシン語に変換する• ソースコードをトークン化, 構文解析してマシン語に変換していく• マシン語になればそのまま実行できる• 変換したものは通常ファイルなどに保存する• コンパイル直後(Just-In-Time)に実行するコンパイラをJITコンパイラと言ったりする21
長谷川智希 @tomzohプログラムを実行するとはどういうことかコンパイラ よもやま話• 必ずしもマシン語に変換する訳ではない• 世の中で言われるコンパイラのほとんどは出力はマシン語ではないのでは[要出展]• SCSSとかJavaとかTypeScriptとか• 変換先がまた別のプログラミング言語の場合トランスパイルと言ったりもする• JavaコンパイラはJavaのソースコードをJavaバイトコードに変換する• JavaバイトコードはCPUがそのまま実行できない• Javaチップという夢• C/C++, Go, Rust あたりはマシン語に変換するコンパイラ言語22
長谷川智希 @tomzohプログラムを実行するとはどういうことかインタープリタ23
長谷川智希 @tomzohプログラムを実行するとはどういうことかインタープリタ• まさに通訳者• 自身がマシン語のプログラム• ソースコードをトークン化, 構文解析するところまではコンパイラと同じ• インタープリタはマシン語に変換しないでそのまま実行する• 実行 = プログラムに書かれた動作をする• 世の中のほとんどの言語はインタープリタだと思って良い• PHP, Perl, Python, Ruby, Java, …24
長谷川智希 @tomzohプログラムを実行するとはどういうことかインタープリタを表現する言語• 「自身がマシン語のプログラム」• マシン語でなくても良い• ほとんどマシン語なのはパフォーマンス上の理由• "PHPで書かれたJavaバイトコードインタープリタ"でも良い•最終的にはマシン語で書かれたインタープリタ or マシン語プログラムにたどり着くはず• 再掲: マシン語 = プログラムの原子25
長谷川智希 @tomzohプログラムを実行するとはどういうことかインタープリタの派生形• 言語っぽくないものを実行するインタープリタ• VM(Virtual Machine / 仮想マシン)と呼ばれることもある• Java VM, HHVM, …• 別のCPUのマシン語を実行するインタープリタ• いわゆるCPUエミュレータ26
長谷川智希 @tomzohプログラムを実行するとはどういうことかプログラム実行の階層構造27M1M1phpコマンドPHP言語hello worldPHP言語 プログラムM1マシン語 インタープリタCPUPHPプログラムの実行M1M1M1マシン語PHP VMPHP言語hello worldPHP言語 プログラムM1マシン語 インタープリタCPUM1マシン語hello worldPHP Opcode プログラムM1マシン語PHPコンパイラM1マシン語 コンパイラPHPプログラムの実行こう見ることもできるM1M1CPUM1マシン語Rosetta 2M1マシン語 インタープリタM1マシン語M1非対応アプリIntelCPU用プログラムM1 Mac 上でのIntel Mac用アプリ実行Rosetta 2はコンパイラとして動作してM1用バイナリをキャッシュしてるかもM1M1CPUM1マシン語gccC言語 コンパイラM1マシン語hello worldC言語 プログラムマシン語の実行M1マシン語hello worldM1マシン語 プログラム
長谷川智希 @tomzohプログラムを実行するとはどういうことか 28プログラムを実行するとはどういうことかマシン語, インタープリタ, コンパイラ, 仮想マシンまとめ
長谷川智希 @tomzohプログラムを実行するとはどういうことかプログラムを実行するということ• プログラムの実行には2つのパターンがある• CPUによるマシン語プログラムの実行• インタープリタによるプログラムの実行• どんなプログラム実行も最終的にはマシン語に行き着く29
長谷川智希 @tomzohプログラムを実行するとはどういうことかコンピュータの中で実行されているプログラムがどのように実行されているかの理解30パフォーマンスチューニング, デバッグに役立ったりコンパイラ, インタープリタ, エミュレータの開発に役立ったり…
長谷川智希 @tomzohプログラムを実行するとはどういうことかEnjoy hacking!!31
32୩ஐر͕ͤΘ ͱ͖ @tomzohプログラムを実行するとはどういうことかマシン語, インタープリタ, コンパイラ,仮想マシンおわり
長谷川智希 @tomzohプログラムを実行するとはどういうことかCPUは命令をどのように実行するか33余談
長谷川智希 @tomzohプログラムを実行するとはどういうことか名著 「CPUの創りかた」34https://amzn.to/3PF5vCC
長谷川智希 @tomzohプログラムを実行するとはどういうことかCPUの内部での命令実行 - CPUの回路35
長谷川智希 @tomzohプログラムを実行するとはどういうことかCPUの内部での命令実行 - CPUの回路ブロック図36AレジスタBレジスタ出力ポートプログラムカウンタ入力ポートデータセレクタ 演算器メモリ命令CPUの命令 =演算器にどことどこから データを入れてどんな演算をして どこに戻すかの回路を切り替えるものデータの通り道TD4の構成を一部アレンジしています
長谷川智希 @tomzohプログラムを実行するとはどういうことかCコンパイラよもやま話37余談
長谷川智希 @tomzohプログラムを実行するとはどういうことかCコンパイラ• CコンパイラはC言語のソースコードをマシン語に変換する• 正確にはマシン語と(おおむね)1:1対応するニーモニックに変換する• ニーモニックからマシン語のバイナリに変換するにはアセンブラを使う• そのままマシン語のバイナリを出力しても良いけどデバッグがたいへん…• ラベルなどニーモニック独自の機能もある38
長谷川智希 @tomzohプログラムを実行するとはどういうことかCコンパイラのソースコード• Cコンパイラのソースコードは何で書かれているか• Cで書かれている• そのソースコードはどうやってコンパイルを…?• 最小機能のCコンパイラをアセンブラ直書きで作り、少しずつ機能を足していく• 足した機能だけを使ってCコンパイラを書く• 機能が増えたらリファクタリングする39
長谷川智希 @tomzohプログラムを実行するとはどういうことかCコンパイラを作るといろいろ捗る• トークン化, 構文解析といったプログラム言語の実装の知識• C言語そのものの理解• Cにおけるグローバル変数とローカル変数の違い• Cの関数コールとABI• Cのポインタとデリファレンス• 低レイヤを知りたい人のためのCコンパイラ作成入門• Rui Ueyamaさん• https://www.sigbus.info/compilerbook40
長谷川智希 @tomzohプログラムを実行するとはどういうことかCPUに興味がわいた方向け41余談
長谷川智希 @tomzohプログラムを実行するとはどういうことか「CPUとは何か」をPHPで考えるPHP Conference Japan 2019• 「CPUとは何か」をPHPで考える• CPUを3つの視点で見た• プログラム実行環境• エミュレート対象• 電気回路42
長谷川智希 @tomzohプログラムを実行するとはどういうことかCPU 3つの視点 - 1: プログラム実行環境• 対象CPUで動くプログラムを書く• CPUをプログラム実行環境として見ると:• CPUはプログラム言語の様に見える• CPUの命令セットを理解し、プログラムを書く43
長谷川智希 @tomzohプログラムを実行するとはどういうことかCPU 3つの視点 - 2: エミュレート対象• 対象CPUのエミュレータを作る• CPUをエミュレート対象として見ると:• 他人の書いたプログラムを受け入れる存在に見える• CPUエミュレータと外部との境界は曖昧• CPUエミュレータ単体でなくコンピュータのエミュレータの中の1コンポーネントとして 実装される / グラフィックやサウンド、入出力との境界は曖昧• Hardware specification as Code• エミュレータのソースを読むとハードウェアの仕様がわかる• Undocumentedな仕様もエミュレータのソースには書いてある44
長谷川智希 @tomzohプログラムを実行するとはどういうことかCPU 3つの視点 - 3: 電気回路• 対象CPUを電気回路として作る• CPUを電気回路として見ると:• 外部から供給されるクロックによって内部状態が切り替わる状態装置に見える• クロック: 心臓の鼓動• クロック ➡ CPUの状態変化• PC(プログラムカウンタ)が示すメモリアドレスから命令をフェッチする(読み込む)• フェッチした内容によってデータフロー・演算器のモードが決定される• 演算器の出力がレジスタやメモリに格納される• プログラム実行環境, エミュレータの様な1本の流れとしての実行ではなく 複数の回路が同時に切り替わる形での実行45
長谷川智希 @tomzohプログラムを実行するとはどういうことか続CPUとは何かPHP Conference Japan 2022• 4つ目の視点• ハードウェアエミュレータから見たCPU• コンピュータのCPUのフリをする ハードウェア• ハードウェアエミュレータを作るとCPUがどう見えるか46
47୩ஐر͕ͤΘ ͱ͖ @tomzohプログラムを実行するとはどういうことかマシン語, インタープリタ, コンパイラ,仮想マシンおわり