【Python】hello worldの裏で起こっていること

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

このバイトコードはスタックマシン上で実行されている
つまり、スタックマシンが行っているのは、意味解析が終わった最後のバイトコードの実行のところということだ。
なるほど、スタックマシンについて少し理解した。