main.py
print("Hello, World")
$ python3 main.py
Hello, World
### python実行の流れ
– ソースコード読み込み
– 字句解析
– 構文解析
– 意味解析
– バイトコードを実行(仮想マシン上)
### 字句解析/構文解析の流れ
import ast source = """ print("Hello, World") """ tree = ast.parse(source) print(ast.dump(tree))
$ python3 main.py
Module(body=[Expr(value=Call(func=Name(id=’print’, ctx=Load()), args=[Constant(value=’Hello, World’)], keywords=[]))], type_ignores=[])
### バイトコード
import ast import dis source = """ print("Hello, World") """ tree = ast.parse(source) compiled_code = compile(tree, filename="<ast>", mode="exec") bytecode = dis.dis(compiled_code) print(bytecode)
$ python3 main.py
2 0 LOAD_NAME 0 (print). // stackにpush
2 LOAD_CONST 0 (‘Hello, World’) // stackにpush
4 CALL_FUNCTION 1 // print関数の呼び出し
6 POP_TOP // stackのtopを破棄
8 LOAD_CONST 1 (None) // Noneスタックを入れてスタックから戻る
10 RETURN_VALUE
None
このバイトコードはスタックマシン上で実行されている
つまり、スタックマシンが行っているのは、意味解析が終わった最後のバイトコードの実行のところということだ。
なるほど、スタックマシンについて少し理解した。