Share
Embed
PHPからはじめるコンピュータアーキテクチャ 15分ダイジェスト版 / PHP Meets Silicon: A Fun Dive into Computer Structures 15mins ver
PHPカンファレンス北海道2024の発表資料です
PHP Conference Japan 2023の発表の15分ダイジェスト版です。
HASEGAWA Tomoki
January 12, 2024
Transcript
220 slides
-
2 ୩ஐر ͕ͤΘ ͱ͖ @tomzoh http://www.dgcircus.com デジタルサーカス株式会社 副団長CTO ॴଐ ٕज़ΧϯϑΝϨϯεओ࠻
دߘɾஶॻ 来たれ!PHPer!We are hiring! 𝕏 -
3 ୩ஐر ͕ͤΘ ͱ͖ @tomzoh ςοΫΧϯϑΝϨϯεӡӦࢀՃ 8FCJ04ΞϓϦ։ൃ $16 ϨτϩήʔϜػ
ిࢠ࡞ Ϗʔϧ αοΧʔ؍ઓ ϨϯλϧΧʔτϨʔε ʜ ϥΠϑϫʔΫ 𝕏 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 • プログラムを実行するというのは具体的に何をしているか • みなさんはふだん何を実行していますか? • PHPのプログラム
• Docker • JavaScript (ブラウザ, Node.js) 12 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 • プログラムを実行するというのは具体的に何をしているか • みなさんはふだん何を実行していますか? • PHPのプログラム
• Docker • JavaScript (ブラウザ, Node.js) • Safari, Chrome, … 12 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 • プログラムを実行するというのは具体的に何をしているか • みなさんはふだん何を実行していますか? • PHPのプログラム
• Docker • JavaScript (ブラウザ, Node.js) • Safari, Chrome, … • PhpStorm 12 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ プログラムの実行 • プログラムを実行するというのは具体的に何をしているか • みなさんはふだん何を実行していますか? • PHPのプログラム
• Docker • JavaScript (ブラウザ, Node.js) • Safari, Chrome, … • PhpStorm • macOS 12 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ • プログラムの実行方法は2種類ある • CPUでの実行 (電気回路による実行) • プログラムでの実行
2つの実行 13 • マシン語(機械語) • アセンブラ • コンパイラ -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ • プログラムの実行方法は2種類ある • CPUでの実行 (電気回路による実行) • プログラムでの実行
2つの実行 13 • マシン語(機械語) • アセンブラ • コンパイラ • インタープリタ • VM -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 • CPUが実行できるのはマシン語(機械語・アセンブラ・アセンブリ言語)のみ • 文法を持たない単純な命令のセット •
Instruction Set: IS • メインの機能は: データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい 14 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 • CPUが実行できるのはマシン語(機械語・アセンブラ・アセンブリ言語)のみ • 文法を持たない単純な命令のセット •
Instruction Set: IS • メインの機能は: データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい • レジスタは決まった名前/サイズで決まった個数あるだけ 14 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 • CPUが実行できるのはマシン語(機械語・アセンブラ・アセンブリ言語)のみ • 文法を持たない単純な命令のセット •
Instruction Set: IS • メインの機能は: データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい • レジスタは決まった名前/サイズで決まった個数あるだけ • 命令は単体で完結し、文法はない 14 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 • CPUが実行できるのはマシン語(機械語・アセンブラ・アセンブリ言語)のみ • 文法を持たない単純な命令のセット •
Instruction Set: IS • メインの機能は: データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい • レジスタは決まった名前/サイズで決まった個数あるだけ • 命令は単体で完結し、文法はない • プログラム言語とは言えないぐらい原始的 14 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式1: CPUでの実行 • CPUが実行できるのはマシン語(機械語・アセンブラ・アセンブリ言語)のみ • 文法を持たない単純な命令のセット •
Instruction Set: IS • メインの機能は: データをメモリ/レジスタ(変数)の間でコピーする, 演算する, (条件付きで)ジャンプする ぐらい • レジスタは決まった名前/サイズで決まった個数あるだけ • 命令は単体で完結し、文法はない • プログラム言語とは言えないぐらい原始的 • 電気回路として実装されている 14 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11
の3バイトでアドレス 1111 にジャンプするとかそんな感じ 15 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11
の3バイトでアドレス 1111 にジャンプするとかそんな感じ • スパルタすぎる… 15 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11
の3バイトでアドレス 1111 にジャンプするとかそんな感じ • スパルタすぎる… • C3 = JP みたいに人間にとってわかりやすい名前が付いてたりする 15 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11
の3バイトでアドレス 1111 にジャンプするとかそんな感じ • スパルタすぎる… • C3 = JP みたいに人間にとってわかりやすい名前が付いてたりする • JP 1111 って書くと少しマシ 15 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11
の3バイトでアドレス 1111 にジャンプするとかそんな感じ • スパルタすぎる… • C3 = JP みたいに人間にとってわかりやすい名前が付いてたりする • JP 1111 って書くと少しマシ • ニーモニックという 15 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11
の3バイトでアドレス 1111 にジャンプするとかそんな感じ • スパルタすぎる… • C3 = JP みたいに人間にとってわかりやすい名前が付いてたりする • JP 1111 って書くと少しマシ • ニーモニックという • ニーモニックで書かれたプログラム(テキストファイル)をマシン語のバイナリに変換する プログラムをアセンブラと呼ぶ 15 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ マシン語 • 見た目は生のバイナリ • C3 11 11
の3バイトでアドレス 1111 にジャンプするとかそんな感じ • スパルタすぎる… • C3 = JP みたいに人間にとってわかりやすい名前が付いてたりする • JP 1111 って書くと少しマシ • ニーモニックという • ニーモニックで書かれたプログラム(テキストファイル)をマシン語のバイナリに変換する プログラムをアセンブラと呼ぶ • 転じてニーモニックで書かれたプログラムをアセンブラとかアセンブリ言語と言ったり 15 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式2: プログラムでの実行 • プログラムがプログラムを読み込んで解釈して実行する • 例: PHPコマンド(プログラム)がPHPのソースコード(テキスト)を読み込んで解釈して実行する
• 解釈 = パース • 読み込む対象はソースコード(テキスト)でないこともある 16 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式2: プログラムでの実行 • プログラムがプログラムを読み込んで解釈して実行する • 例: PHPコマンド(プログラム)がPHPのソースコード(テキスト)を読み込んで解釈して実行する
• 解釈 = パース • 読み込む対象はソースコード(テキスト)でないこともある • Java: ソースコード(テキストファイル / HelloWorld.java) → バイトコード(バイナリ / HelloWorld.class) → java HelloWorld 16 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 実行方式2: プログラムでの実行 • プログラムがプログラムを読み込んで解釈して実行する • 例: PHPコマンド(プログラム)がPHPのソースコード(テキスト)を読み込んで解釈して実行する
• 解釈 = パース • 読み込む対象はソースコード(テキスト)でないこともある • Java: ソースコード(テキストファイル / HelloWorld.java) → バイトコード(バイナリ / HelloWorld.class) → java HelloWorld • 読み込むものがテキストでもバイナリでも 実行 = 命令を読み込んでその通りに動作する ということ 16 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ インタープリタとコンパイラ • プログラムを順次実行していくプログラムをインタープリタと呼ぶ • プログラムを他の形式に変換するプログラムをコンパイラと呼ぶ • 変換動作はコンパイル
何から何に変換してもコンパイル • Cコンパイラ C言語のソースコード(テキストファイル)をアセンブリ(テキストファイル)に変換する 17 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ インタープリタとコンパイラ • プログラムを順次実行していくプログラムをインタープリタと呼ぶ • プログラムを他の形式に変換するプログラムをコンパイラと呼ぶ • 変換動作はコンパイル
何から何に変換してもコンパイル • Cコンパイラ C言語のソースコード(テキストファイル)をアセンブリ(テキストファイル)に変換する • Javaコンパイラ Javaのソースコード(テキストファイル)をバイトコード(バイナリファイル)に変換 する 17 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ インタープリタとコンパイラ • プログラムを順次実行していくプログラムをインタープリタと呼ぶ • プログラムを他の形式に変換するプログラムをコンパイラと呼ぶ • 変換動作はコンパイル
何から何に変換してもコンパイル • Cコンパイラ C言語のソースコード(テキストファイル)をアセンブリ(テキストファイル)に変換する • Javaコンパイラ Javaのソースコード(テキストファイル)をバイトコード(バイナリファイル)に変換 する • インタープリタとコンパイラは言語の特徴として対比して使われる 17 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ インタープリタとコンパイラ • プログラムを順次実行していくプログラムをインタープリタと呼ぶ • プログラムを他の形式に変換するプログラムをコンパイラと呼ぶ • 変換動作はコンパイル
何から何に変換してもコンパイル • Cコンパイラ C言語のソースコード(テキストファイル)をアセンブリ(テキストファイル)に変換する • Javaコンパイラ Javaのソースコード(テキストファイル)をバイトコード(バイナリファイル)に変換 する • インタープリタとコンパイラは言語の特徴として対比して使われる • が昨今はインタープリタ言語でも内部でコンパイルしてたりして単純ではない 17 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする • PC全体を仮想化したVMとは違う文脈
• PHP関連で言うと… • PHP VM, HHVM (HipHop Virtual Machine) 18 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする • PC全体を仮想化したVMとは違う文脈
• PHP関連で言うと… • PHP VM, HHVM (HipHop Virtual Machine) • PHP Opcodeを実行するプログラム 18 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする • PC全体を仮想化したVMとは違う文脈
• PHP関連で言うと… • PHP VM, HHVM (HipHop Virtual Machine) • PHP Opcodeを実行するプログラム • PHP Opcode = PHPのソースコードからコンパイルされたバイナリ 18 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする • PC全体を仮想化したVMとは違う文脈
• PHP関連で言うと… • PHP VM, HHVM (HipHop Virtual Machine) • PHP Opcodeを実行するプログラム • PHP Opcode = PHPのソースコードからコンパイルされたバイナリ • Java VM 18 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ VM: Virtual Machine • バイナリのプログラムを実行するプログラムをVMと言ったりする • PC全体を仮想化したVMとは違う文脈
• PHP関連で言うと… • PHP VM, HHVM (HipHop Virtual Machine) • PHP Opcodeを実行するプログラム • PHP Opcode = PHPのソースコードからコンパイルされたバイナリ • Java VM • Javaバイトコードを実行するプログラム 18 -
長谷川智希 @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のソースコードからコンパイルされたバイナリ 18 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ レイヤ化されたコンピュータ • 現代のコンピュータはソフトウェア/ハードウェアともにレイヤ化・抽象化されている • 各レイヤは下のレイヤのことは気にしなくて良い • PHPプログラム(hello-world.php)から見たら下のレイヤは…
• PHPコマンド • macOS, Linux, FreeBSD, Windows, Raspberry Pi OS, Solaris, … 20 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ レイヤ化されたコンピュータ • 現代のコンピュータはソフトウェア/ハードウェアともにレイヤ化・抽象化されている • 各レイヤは下のレイヤのことは気にしなくて良い • PHPプログラム(hello-world.php)から見たら下のレイヤは…
• PHPコマンド • macOS, Linux, FreeBSD, Windows, Raspberry Pi OS, Solaris, … • Intel x86, Apple Silicon, ARM, SPARC, … 20 -
長谷川智希 @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, … 20 -
長谷川智希 @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コマンドで実行されることだけ意識すれば良い (だいたいは) 20 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 我々がPHPプログラムを実行すると… $ php hello-world.php 21 hello-world.php PHPプログラム
phpコマンド macOS Apple Silicon CPU Mac Book Pro -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 我々がPHPプログラムを実行すると… $ php hello-world.php • CPUはphpコマンドを実行する 21
hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 我々がPHPプログラムを実行すると… $ php hello-world.php • CPUはphpコマンドを実行する •
Cで書かれたプログラム 21 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 我々がPHPプログラムを実行すると… $ php hello-world.php • CPUはphpコマンドを実行する •
Cで書かれたプログラム • コンパイルされアセンブルされリンクされ マシン語の実行ファイルになっている 21 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 我々がPHPプログラムを実行すると… $ php hello-world.php • CPUはphpコマンドを実行する •
Cで書かれたプログラム • コンパイルされアセンブルされリンクされ マシン語の実行ファイルになっている • CPUでそのまま実行できる 21 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 我々がPHPプログラムを実行すると… $ php hello-world.php • CPUはphpコマンドを実行する •
Cで書かれたプログラム • コンパイルされアセンブルされリンクされ マシン語の実行ファイルになっている • CPUでそのまま実行できる • phpコマンドはPHPプログラムを読み込み、解釈し、 実行する 21 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Goだと…? $ go build hello-world.go; ./hello-world 22
macOS Apple Silicon CPU Mac Book Pro hello-worldコマンド -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Goだと…? $ go build hello-world.go; ./hello-world •
CPUはhello-worldコマンドを実行する 22 macOS Apple Silicon CPU Mac Book Pro hello-worldコマンド -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Goだと…? $ go build hello-world.go; ./hello-world •
CPUはhello-worldコマンドを実行する • Goで書かれたプログラムがコンパイルされ マシン語の実行ファイルになっている 22 macOS Apple Silicon CPU Mac Book Pro hello-worldコマンド -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Goだと…? $ go build hello-world.go; ./hello-world •
CPUはhello-worldコマンドを実行する • Goで書かれたプログラムがコンパイルされ マシン語の実行ファイルになっている • CPUでそのまま実行できる 22 macOS Apple Silicon CPU Mac Book Pro hello-worldコマンド -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPとGoの違い PHPもGoも CPUで動いているのは マシン語のプログラム PHP phpコマンドが PHPプログラムを都度解釈して
実行する → コンパイル不要 23 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPとGoの違い PHPもGoも CPUで動いているのは マシン語のプログラム PHP phpコマンドが PHPプログラムを都度解釈して
実行する → コンパイル不要 Go 事前にコンパイルしてCPUが 直接実行可能なファイルを作る → ハイパフォーマンス 23 hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU Mac Book Pro hello-worldコマンド macOS Apple Silicon CPU Mac Book Pro -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ もっと下のレイヤ 下のレイヤを気にしないのは もっと下のレイヤでも同じ Linuxは自分を実行しているの が実CPUなのか仮想CPUなの かは気にしない 24
hello-world.php PHPプログラム phpコマンド Linux CPU PC -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ もっと下のレイヤ 下のレイヤを気にしないのは もっと下のレイヤでも同じ Linuxは自分を実行しているの が実CPUなのか仮想CPUなの かは気にしない 24
hello-world.php PHPプログラム phpコマンド Linux CPU PC Mac hello-world.php PHPプログラム phpコマンド Linux VM (仮想ハードウェア) macOS CPU -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ もっと下のレイヤ 下のレイヤを気にしないのは もっと下のレイヤでも同じ Linuxは自分を実行しているの が実CPUなのか仮想CPUなの かは気にしない VM
= CPUとハードウェアのフ リをするソフトウェア 24 hello-world.php PHPプログラム phpコマンド Linux CPU PC Mac hello-world.php PHPプログラム phpコマンド Linux VM (仮想ハードウェア) macOS CPU -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU
Mac Book Pro 下のレイヤが好きにやる 30 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU
Mac Book Pro 下のレイヤが好きにやる • PHPで書かれたプログラム(hello-world.php)は 自分より下を気にしていない 30 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU
Mac Book Pro ここは何でもいい 下のレイヤが好きにやる • PHPで書かれたプログラム(hello-world.php)は 自分より下を気にしていない 30 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ hello-world.php PHPプログラム phpコマンド macOS Apple Silicon CPU
Mac Book Pro ここは何でもいい 下のレイヤが好きにやる • PHPで書かれたプログラム(hello-world.php)は 自分より下を気にしていない • 自分を実行してくれれば何でも良い 30 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ HelloWorld.class Javaバイトコード javaコマンド macOS Apple Silicon CPU
Mac Book Pro 下のレイヤが好きにやる 31 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ HelloWorld.class Javaバイトコード javaコマンド macOS Apple Silicon CPU
Mac Book Pro 下のレイヤが好きにやる Javaで書かれ、 Javaバイトコードに 変換されたプログラム (HelloWorld.class) 31 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ HelloWorld.class Javaバイトコード javaコマンド macOS Apple Silicon CPU
Mac Book Pro 下のレイヤが好きにやる Javaで書かれ、 Javaバイトコードに 変換されたプログラム (HelloWorld.class) javaコマンドより下は 気にしていない 31 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ HelloWorld.class Javaバイトコード javaコマンド macOS Apple Silicon CPU
Mac Book Pro ここは何でもいい 下のレイヤが好きにやる Javaで書かれ、 Javaバイトコードに 変換されたプログラム (HelloWorld.class) javaコマンドより下は 気にしていない 31 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ HelloWorld.class Javaバイトコード javaコマンド macOS Apple Silicon CPU
Mac Book Pro ここは何でもいい 下のレイヤが好きにやる Javaで書かれ、 Javaバイトコードに 変換されたプログラム (HelloWorld.class) javaコマンドより下は 気にしていない なら好きにしてみよう 31 -
長谷川智希 @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コマンドより下は 気にしていない なら好きにしてみよう 31 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたJVM PHPJava • @m3m0r7 さん • バイトコードを解釈し実行する
32 https://fortee.jp/phperkaigi-2019/proposal/6f792375-335a-432e-b1b4-7b649a5152e4 https://github.com/php-java/php-java -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたJVM PHPJava • @m3m0r7 さん • バイトコードを解釈し実行する
32 https://fortee.jp/phperkaigi-2019/proposal/6f792375-335a-432e-b1b4-7b649a5152e4 https://github.com/php-java/php-java -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたJVM PHPJava • @m3m0r7 さん • バイトコードを解釈し実行する
• PHPerKaigi 2019 にトークあります 32 https://fortee.jp/phperkaigi-2019/proposal/6f792375-335a-432e-b1b4-7b649a5152e4 https://github.com/php-java/php-java -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたJVM PHPJava • @m3m0r7 さん • バイトコードを解釈し実行する
• PHPerKaigi 2019 にトークあります • PHPerKaigi 2024(3/7-9)では PHPでRubyVMを作る話をして くれます。お楽しみに。 32 https://fortee.jp/phperkaigi-2019/proposal/6f792375-335a-432e-b1b4-7b649a5152e4 https://github.com/php-java/php-java -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている 34 CPU
6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム *1 実際は6502ベースのカスタムIC RP2A03 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には
キャラクタのパターンが格納されている 34 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には
キャラクタのパターンが格納されている • このマシン語プログラムも当然 下のレイヤは気にしない 34 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には
キャラクタのパターンが格納されている • このマシン語プログラムも当然 下のレイヤは気にしない 34 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03 ここは何でもいい -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には
キャラクタのパターンが格納されている • このマシン語プログラムも当然 下のレイヤは気にしない • なら好きにさせてもらおう 34 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03 ここは何でもいい -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には
キャラクタのパターンが格納されている • このマシン語プログラムも当然 下のレイヤは気にしない • なら好きにさせてもらおう 34 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には
キャラクタのパターンが格納されている • このマシン語プログラムも当然 下のレイヤは気にしない • なら好きにさせてもらおう 34 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03 話は聞かせて もらった!! -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ みんな大好き ファミコン • カートリッジ左半分には6502*1用の マシン語プログラムが格納されている • カートリッジ右半分には
キャラクタのパターンが格納されている • このマシン語プログラムも当然 下のレイヤは気にしない • なら好きにさせてもらおう 34 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン *1 実際は6502ベースのカスタムIC RP2A03 話は聞かせて もらった!! 好きにさせて もらおう! -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたファミコンエミュレータ • php-terminal-nes-emulator *1 • 長谷川が書いた 35
*1 https://github.com/hasegawa-tomoki/php-terminal-nes-emulator -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたファミコンエミュレータ • php-terminal-nes-emulator *1 • 長谷川が書いた •
bokuweb/ fl ownes という既存の JavaScript実装の写経 35 *1 https://github.com/hasegawa-tomoki/php-terminal-nes-emulator -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPで書かれたファミコンエミュレータ • php-terminal-nes-emulator *1 • 長谷川が書いた •
bokuweb/ fl ownes という既存の JavaScript実装の写経 • PHPでファミコンのCPU/PPUの フリをする 35 *1 https://github.com/hasegawa-tomoki/php-terminal-nes-emulator -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 37 ※
php-terminal-nes-emulatorのコードではありません -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから
37 ※ php-terminal-nes-emulatorのコードではありません -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから
• マシン語は構文解析なしに実行できる 37 ※ php-terminal-nes-emulatorのコードではありません -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから
• マシン語は構文解析なしに実行できる • 前提事項: PCレジスタ = イマココ 37 ※ php-terminal-nes-emulatorのコードではありません -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから
• マシン語は構文解析なしに実行できる • 前提事項: PCレジスタ = イマココ • STA abs 37 ※ php-terminal-nes-emulatorのコードではありません -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから
• マシン語は構文解析なしに実行できる • 前提事項: PCレジスタ = イマココ • STA abs • 引数で指定されたメモリにAレジスタの データを保存する 37 ※ php-terminal-nes-emulatorのコードではありません -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから
• マシン語は構文解析なしに実行できる • 前提事項: PCレジスタ = イマココ • STA abs • 引数で指定されたメモリにAレジスタの データを保存する 37 $8D $00 $20 $8004 STA abs ※ php-terminal-nes-emulatorのコードではありません -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから
• マシン語は構文解析なしに実行できる • 前提事項: PCレジスタ = イマココ • STA abs • 引数で指定されたメモリにAレジスタの データを保存する 37 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のコードではありません -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - CPU • CPUのエミュレーションは簡単 • マシン語を実行するだけだから
• マシン語は構文解析なしに実行できる • 前提事項: PCレジスタ = イマココ • STA abs • 引数で指定されたメモリにAレジスタの データを保存する 37 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のコードではありません めちゃ単純 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - 画面 38 CPU 6502 PPU
RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - 画面 • CPUから特定のメモリアドレスを 読み書きするとPPUにアクセスできる 38
CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - 画面 • CPUから特定のメモリアドレスを 読み書きするとPPUにアクセスできる •
ということは↓の世界 38 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン $this->ram[$addr] = $value -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - 画面 • CPUから特定のメモリアドレスを 読み書きするとPPUにアクセスできる •
ということは↓の世界 38 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン $this->ram[$addr] = $value • CPU命令実行したあとに PPUのターンを作る -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - 画面 • CPUから特定のメモリアドレスを 読み書きするとPPUにアクセスできる •
ということは↓の世界 38 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン $this->ram[$addr] = $value • CPU命令実行したあとに PPUのターンを作る while (true) { $this->cpu->run(); $this->ppu->run(); } -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ファミコンエミュレータの実装 - 画面 • CPUから特定のメモリアドレスを 読み書きするとPPUにアクセスできる •
ということは↓の世界 38 CPU 6502 PPU RAM V-RAM APU カートリッジ マシン語 プログラム キャラクタ パターン $this->ram[$addr] = $value • CPU命令実行したあとに PPUのターンを作る • PPUのターンではVRAMの内容を 絵にするだけ while (true) { $this->cpu->run(); $this->ppu->run(); } -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ まとめ • そもそもプログラムを実行するとは何か • CPUでの実行 (電気回路による実行) or
プログラムでの実行 • 近代のコンピュータはレイヤー化されている • 下のレイヤのことは気にしなくて良くなっている • 仮想サーバとかDockerとかエミュレータはその特性を活かしている • エミュレータは難しくない • エミュレータとかコンパイラとかを楽しもう 41 長谷川 智希 @tomzoh 𝕏 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100;
という文字列を見たら… 43 <?php $a=100; test.php -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100;
という文字列を見たら… • 「$があるのでここから変数名で=は変数名に使えない文字なので 変数名は$aで確定。ということは次の = は後ろに = が無いので 代入で、100 は数字。次に ; があるからここまで実行しよう」と解釈する 43 <?php $a=100; test.php -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100;
という文字列を見たら… • 「$があるのでここから変数名で=は変数名に使えない文字なので 変数名は$aで確定。ということは次の = は後ろに = が無いので 代入で、100 は数字。次に ; があるからここまで実行しよう」と解釈する • $a が既に存在しているかを調べる 43 <?php $a=100; test.php -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100;
という文字列を見たら… • 「$があるのでここから変数名で=は変数名に使えない文字なので 変数名は$aで確定。ということは次の = は後ろに = が無いので 代入で、100 は数字。次に ; があるからここまで実行しよう」と解釈する • $a が既に存在しているかを調べる • 存在していなければメモリ上に $a の中身を保存する領域を確保する 43 <?php $a=100; test.php -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100;
という文字列を見たら… • 「$があるのでここから変数名で=は変数名に使えない文字なので 変数名は$aで確定。ということは次の = は後ろに = が無いので 代入で、100 は数字。次に ; があるからここまで実行しよう」と解釈する • $a が既に存在しているかを調べる • 存在していなければメモリ上に $a の中身を保存する領域を確保する • メモリ上の $a の領域に 100 を書く 43 <?php $a=100; test.php -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100;
という文字列を見たら… • 「$があるのでここから変数名で=は変数名に使えない文字なので 変数名は$aで確定。ということは次の = は後ろに = が無いので 代入で、100 は数字。次に ; があるからここまで実行しよう」と解釈する • $a が既に存在しているかを調べる • 存在していなければメモリ上に $a の中身を保存する領域を確保する • メモリ上の $a の領域に 100 を書く • プログラマからは$aという変数に100が代入された様に見える 43 <?php $a=100; test.php -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHPでの実行 • php test.php • PHPが $a=100;
という文字列を見たら… • 「$があるのでここから変数名で=は変数名に使えない文字なので 変数名は$aで確定。ということは次の = は後ろに = が無いので 代入で、100 は数字。次に ; があるからここまで実行しよう」と解釈する • $a が既に存在しているかを調べる • 存在していなければメモリ上に $a の中身を保存する領域を確保する • メモリ上の $a の領域に 100 を書く • プログラマからは$aという変数に100が代入された様に見える • このように順次実行していくプログラムをインタープリタと呼ぶ 43 <?php $a=100; test.php -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHP インタープリタ ソースコードをphpコマンドで実行 $ php helllo-world.php 44
<?php 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) -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 余談: トランスパイル • トランスパイルという言葉もある • 何かから何かに変換するという意味ではコンパイルと同じ •
プログラム言語からほかのプログラム言語への変換で使われる • TypeScript → JavaScript とか • JavaScriptのPoly fi llとか • 動作としてはコンパイルと同じ • C言語 → アセンブラの場合にはコンパイルと言う • 高水準言語 → 高水準言語の場合を明示的に示すために使われ始めた…? 46 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHP インタープリタ ソースコードをphpコマンドで実行 48 <?php echo 'Hello,
world.' hello-world.php -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ PHP インタープリタ ソースコードをphpコマンドで実行 48 <?php echo 'Hello,
world.' hello-world.php -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 複数のエンジン実装 • Node.js
50 console.log("Hello, world."); hello-world.js -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 複数のエンジン実装 • Node.js
• ブラウザ 50 console.log("Hello, world."); hello-world.js -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 複数のエンジン実装 • Node.js
• ブラウザ • Bun 50 console.log("Hello, world."); hello-world.js -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 複数のエンジン実装 • Node.js
• ブラウザ • Bun 複数の実装があるのは珍しくはない 50 console.log("Hello, world."); hello-world.js -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 複数のエンジン実装 • Node.js
• ブラウザ • Bun 複数の実装があるのは珍しくはない • RubyとかPythonも実装が複数ある 50 console.log("Hello, world."); hello-world.js -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ JavaScript インタープリタ ソースコードを nodeコマンドで実行 複数のエンジン実装 • Node.js
• ブラウザ • Bun 複数の実装があるのは珍しくはない • RubyとかPythonも実装が複数ある • PHPもHackがあったり 50 console.log("Hello, world."); hello-world.js -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Java コンパイラ + インタープリタ ソースコード(テキストファイル) 51 class
HelloWorld { public static void main(String[] args){ System.out.println("Hello, world."); } } HelloWorld.java -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Java コンパイラ + インタープリタ ソースコード(テキストファイル) Javaコンパイラ →
バイトコード(バイナリ) 51 class HelloWorld { public static void main(String[] args){ System.out.println("Hello, world."); } } HelloWorld.java -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Java コンパイラ + インタープリタ ソースコード(テキストファイル) Javaコンパイラ →
バイトコード(バイナリ) 51 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 |.....<init>...()| 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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Java コンパイラ + インタープリタ ソースコード(テキストファイル) Javaコンパイラ →
バイトコード(バイナリ) javaコマンドで実行 $ java HelloWorld 51 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 |.....<init>...()| 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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ C コンパイラ ソースコード(テキストファイル) 52 #include <stdio.h> int
main(void){ printf("Hello, world."); } hello-world.c -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ C コンパイラ ソースコード(テキストファイル) Cコンパイラ → ニーモニック(テキストファイル) 52
#include <stdio.h> 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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ C コンパイラ ソースコード(テキストファイル) Cコンパイラ → ニーモニック(テキストファイル) アセンブラ
→ マシン語(バイナリ) 52 #include <stdio.h> 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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ C コンパイラ ソースコード(テキストファイル) Cコンパイラ → ニーモニック(テキストファイル) アセンブラ
→ マシン語(バイナリ) 52 #include <stdio.h> 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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ C コンパイラ ソースコード(テキストファイル) Cコンパイラ → ニーモニック(テキストファイル) アセンブラ
→ マシン語(バイナリ) CPUで実行 $ ./hello-world 52 #include <stdio.h> 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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Go コンパイラ ソースコード(テキスト) 53 package main import
"fmt" func main() { fmt.Printf("Hello, world.") } hello-world.go -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Go コンパイラ ソースコード(テキスト) go build コマンド →
マシン語(バイナリ) 53 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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Go コンパイラ ソースコード(テキスト) go build コマンド →
マシン語(バイナリ) CPUで実行 ./hello-world 53 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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Go コンパイラ ソースコード(テキスト) go build コマンド →
マシン語(バイナリ) CPUで実行 ./hello-world go run hello-world.go でも実行できる (内部的に go build してるんじゃないかな…) 53 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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ Go コンパイラ ソースコード(テキスト) go build コマンド →
マシン語(バイナリ) CPUで実行 ./hello-world go run hello-world.go でも実行できる (内部的に go build してるんじゃないかな…) 53 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 $ݴޠͱಉ͡ʹݟ͑Δ͚Ͳɺ&-'ϔομ όΠτͱ͔͋ΔΒ͍͠ͷͰʜ -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 余談: CとGoの違い • どちらも最終的にマシン語の実行ファイルができる • Cで作った hello-world
と Go で作った hello-world • 動作は同じなのにサイズがだいぶ違う Cは17KB, Goは 2MB • 動的リンクと静的リンク • libc • 静的リンクすると852KB 54 $ 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* -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 55 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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 • 基本的に1バイト = 1命令 55 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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 • 基本的に1バイト = 1命令 • 命令に引数が付くこともある
55 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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 • 基本的に1バイト = 1命令 • 命令に引数が付くこともある
55 $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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 • 基本的に1バイト = 1命令 • 命令に引数が付くこともある
• $78(16進数の78) = SEI 命令 55 $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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 • 基本的に1バイト = 1命令 • 命令に引数が付くこともある
• $78(16進数の78) = SEI 命令 • $A9 = LDA 命令 55 $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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ 6502のマシン語 • 基本的に1バイト = 1命令 • 命令に引数が付くこともある
• $78(16進数の78) = SEI 命令 • $A9 = LDA 命令 • 引数の値をAレジスタに入れる 55 $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 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ほかの下のレイヤが好きにやるパターン • Rosetta 2 • Apple SiliconのMacでIntel
CPU用のバイナリ(マシン語)を動作させる • Intel CPU用バイナリはIntel CPUの上で動いているつもりで動作してる 56 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ほかの下のレイヤが好きにやるパターン • Rosetta 2 • Apple SiliconのMacでIntel
CPU用のバイナリ(マシン語)を動作させる • Intel CPU用バイナリはIntel CPUの上で動いているつもりで動作してる • Docker • Mac上でLinuxを動作させる 56 -
長谷川智希 @tomzoh PHPからはじめるコンピュータアーキテクチャ ほかの下のレイヤが好きにやるパターン • Rosetta 2 • Apple SiliconのMacでIntel
CPU用のバイナリ(マシン語)を動作させる • Intel CPU用バイナリはIntel CPUの上で動いているつもりで動作してる • Docker • Mac上でLinuxを動作させる • 仮想マシン • 物理PC上で仮想PCを動作させる • EC2とかさくらのVPSとか 56