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

Pythonはどうやって動くのか / Python How to Work

kaityo256
PRO
December 13, 2022

Pythonはどうやって動くのか / Python How to Work

プログラミング基礎同演習10

kaityo256
PRO

December 13, 2022
Tweet

More Decks by kaityo256

Other Decks in Education

Transcript

  1. 1
    24
    Pythonはどうやって動くのか
    プログラミング基礎同演習
    慶應義塾大学理工学部物理情報工学科
    渡辺

    View Slide

  2. 2
    24
    Pythonが動く仕組み
    抽象構文木
    仮想マシンとバイトコード

    View Slide

  3. 3
    24
    Pythonが動く仕組みを知らなくてもPythonは使える
    ではなぜ学ぶか?→それが教養だから
    電子レンジも冷蔵庫も、仕組みを知らなくても問題なく使えるが、
    我々はなんとなく仕組みを知っているし、知っているべき

    View Slide

  4. 4
    24
    コンピュータは
    1. メモリから命令とデータを取ってくる
    2. 命令に従って演算器にデータを投げる
    3. 演算器から返ってきた結果をメモリに書き戻す
    という処理を繰り返す
    メモリ
    CPU
    演算器
    発注
    製造依頼
    製品
    納品

    View Slide

  5. 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
    何をするか データ

    View Slide

  6. 6
    24
    0 3 4 1 8 5
    メモリ
    メモリから命令とデータを取ってくる
    0 3 4
    opcode operand
    命令表を見て、どの演算
    器に投げるか決める
    加算器 減算器 乗算器 除算器
    3 4
    0

    1

    2
    ×
    3
    ÷
    命令表(オペコード)
    0

    View Slide

  7. 7
    24
    機械語は数字の羅列
    コンピュータは機械語しか理解できない
    「3+4」は「0,3,4」という数字列で表現
    機械語 (Machine Language)
    アセンブリ言語 (Assembly Language)
    「0,3,4」が「3+4」というのは分かりづらい
    機械語と一対一対応する形でわかりやすく
    0 3 4
    opcode operand
    ADD 3,4
    アセンブラ
    ※ 実行バイナリ作成にはリンカも必要

    View Slide

  8. 8
    24
    ADD 3,4
    アセンブリ言語 (Assembly Language)
    ではまだわかりづらい
    機械語はCPUによって異なる
    → アセンブリ言語もCPUによって異なる
    → 人間にわかりやすい形、かつ共通な書き方をしたい
    プログラム言語 (Programming Language)
    3+4
    人間がわかりやすい形で書く
    ADD 3,4
    アセンブリに変換 機械語に変換
    0,3,4
    ここの変換を行うのがコンパイラ
    アセンブラ

    View Slide

  9. 9
    24
    「3+4」を「ADD 3, 4」に変換したい・・・どうやって?
    字句解析
    "3 + 4"
    プログラムを意味のある最小単位(トークン)にバラす
    3 + 4
    数 加算記号 数
    構文解析
    トークンの関係を解析する
    3 + 4 3
    +
    4
    抽象構文木(Abstract Syntax Tree, AST)

    View Slide

  10. 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

    View Slide

  11. 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"

    View Slide

  12. 12
    24
    "3 + 4" LOAD_CONST 3
    LOAD_CONST 4
    BINARY_ADD
    プログラム バイトコード 仮想マシン
    バイトコード
    仮想マシン
    仮想的なコンピュータの動作をエミュレートするもの
    スタックマシンの形を取ることが多い
    仮想マシンのためのアセンブリ言語
    プログラムの中間表現

    View Slide

  13. 13
    24
    荷物置き場が一つだけあり
    ・一番上に積む(push)
    ・一番上から取り出す(pop)
    ことしかできないデータ構造
    push pop
    途中にデータを挿入する
    ことはできない
    途中のデータを
    取り出すこともできない
    ※荷物は重いので一度に一つしか持てない

    View Slide

  14. 14
    24
    メモリとしてスタックを使う仮想マシン
    "3 + 4"
    LOAD_CONST 3
    LOAD_CONST 4
    BINARY_ADD
    プログラム バイトコード
    スタックに3を積む
    スタックに4を積む
    スタックの上二つを足す
    スタックマシンでの動作

    View Slide

  15. 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

    View Slide

  16. 16
    24
    "3 + 4"
    LOAD_CONST 3
    LOAD_CONST 4
    BINARY_ADD
    プログラム
    (中置記法)
    バイトコード 逆ポーランド記法
    (後置記法)
    3 4 +
    演算子を、被演算子の後ろに置く記法

    View Slide

  17. 17
    24
    演算子でないものはスタックに積む
    (二項)演算子が来たら、スタックの上から二つ取り出し、演算結果を積む
    逆ポーランド記法の読み方
    3 4 + 3をスタックに積む
    4をスタックに積む
    + スタックから二つ取り出して加算
    LOAD_CONST 3
    LOAD_CONST 4
    BINARY_ADD
    スタックマシンのバイトコードは逆ポーランド記法で記述されている

    View Slide

  18. 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

    View Slide

  19. 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

    View Slide

  20. 20
    24
    なくて良い
    別に
    ・Pythonではプログラムを抽象構文木に、さらに
    バイトコードに変換し、仮想マシン上で実行する
    ・バイトコードは仮想的なコンピュータのアセンブリ
    ・Pythonの仮想マシンはスタックマシン
    ・スタックマシンと逆ポーランド記法は相性が良い

    View Slide

  21. 21
    24
    プログラム 抽象構文木
    Abstract Syntax Tree,
    AST
    バイトコード
    LOAD_CONST 3
    LOAD_CONST 4
    BINARY_ADD
    Byte Code
    Programming
    Language
    3
    +
    4
    "3 + 4"
    ここを確認する

    View Slide

  22. 22
    24
    プログラム 抽象構文木
    Abstract Syntax Tree,
    AST
    バイトコード
    LOAD_CONST 3
    LOAD_CONST 4
    BINARY_ADD
    Byte Code
    Programming
    Language
    3
    +
    4
    "3 + 4"
    ここを確認する

    View Slide

  23. 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"
    ここを作る

    View Slide

  24. 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 * +

    View Slide