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

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

kaityo256
December 13, 2022

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

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

kaityo256

December 13, 2022
Tweet

More Decks by kaityo256

Other Decks in Education

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size 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 full-size slide

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

    1

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

    View full-size 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 full-size slide

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

    View full-size slide

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

    View full-size 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 full-size 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size 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 full-size slide

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

    View full-size slide

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

    View full-size 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 full-size 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 full-size slide

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

    View full-size 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 full-size 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 full-size 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 full-size 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 full-size slide