Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
1 24 Pythonはどうやって動くのか プログラミング基礎同演習 慶應義塾大学理工学部物理情報工学科 渡辺
Slide 2
Slide 2 text
2 24 Pythonが動く仕組み 抽象構文木 仮想マシンとバイトコード
Slide 3
Slide 3 text
3 24 Pythonが動く仕組みを知らなくてもPythonは使える ではなぜ学ぶか?→それが教養だから 電子レンジも冷蔵庫も、仕組みを知らなくても問題なく使えるが、 我々はなんとなく仕組みを知っているし、知っているべき
Slide 4
Slide 4 text
4 24 コンピュータは 1. メモリから命令とデータを取ってくる 2. 命令に従って演算器にデータを投げる 3. 演算器から返ってきた結果をメモリに書き戻す という処理を繰り返す メモリ CPU 演算器 発注 製造依頼 製品 納品
Slide 5
Slide 5 text
5 24 整数を二つ受け取って四則演算をして返す計算機を考える 「3+4」や「8-5」という式を数字で表現 演算方法を数字で表現する 0 + 1 - 2 × 3 ÷ 命令表(オペコード) 例えば「3+4」は「0,3,4」、「8-5」は「1,8,5」で表す 0 3 4 opcode operand 何をするか データ
Slide 6
Slide 6 text
6 24 0 3 4 1 8 5 メモリ メモリから命令とデータを取ってくる 0 3 4 opcode operand 命令表を見て、どの演算 器に投げるか決める 加算器 減算器 乗算器 除算器 3 4 0 + 1 - 2 × 3 ÷ 命令表(オペコード) 0
Slide 7
Slide 7 text
7 24 機械語は数字の羅列 コンピュータは機械語しか理解できない 「3+4」は「0,3,4」という数字列で表現 機械語 (Machine Language) アセンブリ言語 (Assembly Language) 「0,3,4」が「3+4」というのは分かりづらい 機械語と一対一対応する形でわかりやすく 0 3 4 opcode operand ADD 3,4 アセンブラ ※ 実行バイナリ作成にはリンカも必要
Slide 8
Slide 8 text
8 24 ADD 3,4 アセンブリ言語 (Assembly Language) ではまだわかりづらい 機械語はCPUによって異なる → アセンブリ言語もCPUによって異なる → 人間にわかりやすい形、かつ共通な書き方をしたい プログラム言語 (Programming Language) 3+4 人間がわかりやすい形で書く ADD 3,4 アセンブリに変換 機械語に変換 0,3,4 ここの変換を行うのがコンパイラ アセンブラ
Slide 9
Slide 9 text
9 24 「3+4」を「ADD 3, 4」に変換したい・・・どうやって? 字句解析 "3 + 4" プログラムを意味のある最小単位(トークン)にバラす 3 + 4 数 加算記号 数 構文解析 トークンの関係を解析する 3 + 4 3 + 4 抽象構文木(Abstract Syntax Tree, AST)
Slide 10
Slide 10 text
10 24 プログラム 抽象構文木 Abstract Syntax Tree, AST アセンブリ言語 Assembly Language 機械語 Machine Language 人間が読める 計算機が読める コンパイラ 0 3 4 opcode operand 字句解析 構文解析 意味解析 etc. "3 + 4" 3 + 4 ADD 3,4 Programming Language
Slide 11
Slide 11 text
11 24 プログラム 抽象構文木 Abstract Syntax Tree, AST バイトコード LOAD_CONST 3 LOAD_CONST 4 BINARY_ADD Byte Code Programming Language 人間が読める パーサ 仮想マシン Virtual Machine, VM インタプリタ 計算機が読める 3 + 4 "3 + 4"
Slide 12
Slide 12 text
12 24 "3 + 4" LOAD_CONST 3 LOAD_CONST 4 BINARY_ADD プログラム バイトコード 仮想マシン バイトコード 仮想マシン 仮想的なコンピュータの動作をエミュレートするもの スタックマシンの形を取ることが多い 仮想マシンのためのアセンブリ言語 プログラムの中間表現
Slide 13
Slide 13 text
13 24 荷物置き場が一つだけあり ・一番上に積む(push) ・一番上から取り出す(pop) ことしかできないデータ構造 push pop 途中にデータを挿入する ことはできない 途中のデータを 取り出すこともできない ※荷物は重いので一度に一つしか持てない
Slide 14
Slide 14 text
14 24 メモリとしてスタックを使う仮想マシン "3 + 4" LOAD_CONST 3 LOAD_CONST 4 BINARY_ADD プログラム バイトコード スタックに3を積む スタックに4を積む スタックの上二つを足す スタックマシンでの動作
Slide 15
Slide 15 text
15 24 LOAD_CONST 3 3 push LOAD_CONST 4 4 push 3 3 4 3 4 BINARY_ADD 3 4 pop 4 3 + = 7 7 push 7 3 4 pop
Slide 16
Slide 16 text
16 24 "3 + 4" LOAD_CONST 3 LOAD_CONST 4 BINARY_ADD プログラム (中置記法) バイトコード 逆ポーランド記法 (後置記法) 3 4 + 演算子を、被演算子の後ろに置く記法
Slide 17
Slide 17 text
17 24 演算子でないものはスタックに積む (二項)演算子が来たら、スタックの上から二つ取り出し、演算結果を積む 逆ポーランド記法の読み方 3 4 + 3をスタックに積む 4をスタックに積む + スタックから二つ取り出して加算 LOAD_CONST 3 LOAD_CONST 4 BINARY_ADD スタックマシンのバイトコードは逆ポーランド記法で記述されている
Slide 18
Slide 18 text
18 24 a b * c + a * b + c 中置記法 逆ポーランド記法 a push b push a a b ab ab c push ab c a b ab c ab+c ab+c BINARY_MULTIPLY BINARY_ADD
Slide 19
Slide 19 text
19 24 a b c * + a + b * c 中置記法 逆ポーランド記法 a push b push a a b c push a b c b c a a bc a bc a+bc a+bc BINARY_MULTIPL Y BINARY_AD D
Slide 20
Slide 20 text
20 24 なくて良い 別に ・Pythonではプログラムを抽象構文木に、さらに バイトコードに変換し、仮想マシン上で実行する ・バイトコードは仮想的なコンピュータのアセンブリ ・Pythonの仮想マシンはスタックマシン ・スタックマシンと逆ポーランド記法は相性が良い
Slide 21
Slide 21 text
21 24 プログラム 抽象構文木 Abstract Syntax Tree, AST バイトコード LOAD_CONST 3 LOAD_CONST 4 BINARY_ADD Byte Code Programming Language 3 + 4 "3 + 4" ここを確認する
Slide 22
Slide 22 text
22 24 プログラム 抽象構文木 Abstract Syntax Tree, AST バイトコード LOAD_CONST 3 LOAD_CONST 4 BINARY_ADD Byte Code Programming Language 3 + 4 "3 + 4" ここを確認する
Slide 23
Slide 23 text
23 24 スタックマシンで計算機を実装する プログラム 抽象構文木 Abstract Syntax Tree, AST バイトコード LOAD_CONST 3 LOAD_CONST 4 BINARY_ADD Byte Code Programming Language 仮想マシン Virtual Machine, VM 計算機が読める 3 + 4 "3 + 4" ここを作る
Slide 24
Slide 24 text
24 24 プログラム 抽象構文木 Abstract Syntax Tree, AST バイトコード LOAD_CONST 3 LOAD_CONST 4 BINARY_ADD Byte Code Programming Language 仮想マシン Virtual Machine, VM 計算機が読める 3 + 4 "3 + 4" ここを作る 中置記法 逆ポーランド記法 3 + 4 3 4 + a + b x c a b c * +