プログラミング基礎同演習10
124Pythonはどうやって動くのかプログラミング基礎同演習慶應義塾大学理工学部物理情報工学科渡辺
View Slide
224Pythonが動く仕組み抽象構文木仮想マシンとバイトコード
324Pythonが動く仕組みを知らなくてもPythonは使えるではなぜ学ぶか?→それが教養だから電子レンジも冷蔵庫も、仕組みを知らなくても問題なく使えるが、我々はなんとなく仕組みを知っているし、知っているべき
424コンピュータは1. メモリから命令とデータを取ってくる2. 命令に従って演算器にデータを投げる3. 演算器から返ってきた結果をメモリに書き戻すという処理を繰り返すメモリCPU演算器発注製造依頼製品納品
524整数を二つ受け取って四則演算をして返す計算機を考える「3+4」や「8-5」という式を数字で表現演算方法を数字で表現する0+1-2×3÷命令表(オペコード)例えば「3+4」は「0,3,4」、「8-5」は「1,8,5」で表す0 3 4opcode operand何をするか データ
6240 3 4 1 8 5メモリメモリから命令とデータを取ってくる0 3 4opcode operand命令表を見て、どの演算器に投げるか決める加算器 減算器 乗算器 除算器3 40+1-2×3÷命令表(オペコード)0
724機械語は数字の羅列コンピュータは機械語しか理解できない「3+4」は「0,3,4」という数字列で表現機械語 (Machine Language)アセンブリ言語 (Assembly Language)「0,3,4」が「3+4」というのは分かりづらい機械語と一対一対応する形でわかりやすく0 3 4opcode operandADD 3,4アセンブラ※ 実行バイナリ作成にはリンカも必要
824ADD 3,4アセンブリ言語 (Assembly Language)ではまだわかりづらい機械語はCPUによって異なる→ アセンブリ言語もCPUによって異なる→ 人間にわかりやすい形、かつ共通な書き方をしたいプログラム言語 (Programming Language)3+4人間がわかりやすい形で書くADD 3,4アセンブリに変換 機械語に変換0,3,4ここの変換を行うのがコンパイラアセンブラ
924「3+4」を「ADD 3, 4」に変換したい・・・どうやって?字句解析"3 + 4"プログラムを意味のある最小単位(トークン)にバラす3 + 4数 加算記号 数構文解析トークンの関係を解析する3 + 4 3+4抽象構文木(Abstract Syntax Tree, AST)
1024プログラム 抽象構文木Abstract Syntax Tree, ASTアセンブリ言語AssemblyLanguage機械語Machine Language人間が読める 計算機が読めるコンパイラ0 3 4opcodeoperand字句解析構文解析意味解析etc."3 + 4"3+4ADD 3,4ProgrammingLanguage
1124プログラム 抽象構文木Abstract Syntax Tree, ASTバイトコードLOAD_CONST 3LOAD_CONST 4BINARY_ADDByte CodeProgrammingLanguage人間が読める パーサ仮想マシンVirtual Machine, VMインタプリタ計算機が読める3+4"3 + 4"
1224"3 + 4" LOAD_CONST 3LOAD_CONST 4BINARY_ADDプログラム バイトコード 仮想マシンバイトコード仮想マシン仮想的なコンピュータの動作をエミュレートするものスタックマシンの形を取ることが多い仮想マシンのためのアセンブリ言語プログラムの中間表現
1324荷物置き場が一つだけあり・一番上に積む(push)・一番上から取り出す(pop)ことしかできないデータ構造push pop途中にデータを挿入することはできない途中のデータを取り出すこともできない※荷物は重いので一度に一つしか持てない
1424メモリとしてスタックを使う仮想マシン"3 + 4"LOAD_CONST 3LOAD_CONST 4BINARY_ADDプログラム バイトコードスタックに3を積むスタックに4を積むスタックの上二つを足すスタックマシンでの動作
1524LOAD_CONST 33pushLOAD_CONST 44push3 3434BINARY_ADD3 4pop43 + = 77push734pop
1624"3 + 4"LOAD_CONST 3LOAD_CONST 4BINARY_ADDプログラム(中置記法)バイトコード 逆ポーランド記法(後置記法)3 4 +演算子を、被演算子の後ろに置く記法
1724演算子でないものはスタックに積む(二項)演算子が来たら、スタックの上から二つ取り出し、演算結果を積む逆ポーランド記法の読み方3 4 + 3をスタックに積む4をスタックに積む+ スタックから二つ取り出して加算LOAD_CONST 3LOAD_CONST 4BINARY_ADDスタックマシンのバイトコードは逆ポーランド記法で記述されている
1824a b * c +a * b + c中置記法 逆ポーランド記法apush bpusha abababcpushabcababcab+c ab+cBINARY_MULTIPLYBINARY_ADD
1924a b c * +a + b * c中置記法 逆ポーランド記法apush bpusha abcpushabcbca abcabc a+bc a+bcBINARY_MULTIPLYBINARY_ADD
2024なくて良い別に・Pythonではプログラムを抽象構文木に、さらにバイトコードに変換し、仮想マシン上で実行する・バイトコードは仮想的なコンピュータのアセンブリ・Pythonの仮想マシンはスタックマシン・スタックマシンと逆ポーランド記法は相性が良い
2124プログラム 抽象構文木Abstract Syntax Tree,ASTバイトコードLOAD_CONST 3LOAD_CONST 4BINARY_ADDByte CodeProgrammingLanguage3+4"3 + 4"ここを確認する
2224プログラム 抽象構文木Abstract Syntax Tree,ASTバイトコードLOAD_CONST 3LOAD_CONST 4BINARY_ADDByte CodeProgrammingLanguage3+4"3 + 4"ここを確認する
2324スタックマシンで計算機を実装するプログラム 抽象構文木Abstract Syntax Tree,ASTバイトコードLOAD_CONST 3LOAD_CONST 4BINARY_ADDByte CodeProgrammingLanguage仮想マシンVirtual Machine, VM計算機が読める3+4"3 + 4"ここを作る
2424プログラム 抽象構文木Abstract Syntax Tree,ASTバイトコードLOAD_CONST 3LOAD_CONST 4BINARY_ADDByte CodeProgrammingLanguage仮想マシンVirtual Machine, VM計算機が読める3+4"3 + 4"ここを作る中置記法 逆ポーランド記法3 + 4 3 4 +a + b x c a b c * +