Pythonのバイトコードまで
PythonスクリプトからPythonのバイトコードまで、どうなっているかを追いかけてみた。
具体的には、Pythonスクリプトから、pycファイルが保存されるまでである。
コマンドラインやスクリプトで実行する場合は以下に相当する
# python -m compileall file.py
import py_compile
py_compile.compile("file.py")
Pythonのスクリプトは、パースされ、AST (抽象構文木) を生成し、CFG (制御フローグラフ) となり、バイトコードとして生成される。CFGから、バイトコードは、assemble()で生成する。
pycの書式は、以下からなっている。(_code_to_bytecode()関数にて)
- MAGIC_NUMBER
- mtime
- size
- code
ついでながら、codeは、marshall(シリアライズ)している。
- ソースコード
- コンパイルするためのスクリプト
- pycの書込み
- pycを実行するコード
- MAGIC_NUMBER
- pycへの書き込みデータ (_code_to_bytecode)
- バイトコードへのコンパイルから実行までの主なコード群
- cpython/ceval.c at 3.5 · python/cpython · GitHub(VM engine)
- cpython/ceval.h at 3.5 · python/cpython · GitHub
- cpython/compile.c at 3.5 · python/cpython · GitHub(Bytecode compiler)
- cpython/compile.h at 3.5 · python/cpython · GitHub
- cpython/frameobject.c at 3.5 · python/cpython · GitHub(execution frames)
- cpython/frameobject.h at 3.5 · python/cpython · GitHub
- cpython/opcode.h at 3.5 · python/cpython · GitHub(bytecodes)
- cpython/code.h at 3.5 · python/cpython · GitHub(PyCodeObject)
- cpython/pystate.c at 3.5 · python/cpython · GitHub(interpreter state)
- cpython/pystate.h at 3.5 · python/cpython · GitHub
- cpython/pythonrun.c at 3.5 · python/cpython · GitHub(entry point)
- cpython/pythonrun.h at 3.5 · python/cpython · GitHub
- ドキュメント
- DevGuide
- Library
- marshal — Internal Python object serialization — Python 3.7.3 documentation
- 29.12. inspect — Inspect live objects — Python 3.5.7 documentation
- importlib — The implementation of import — Python 3.7.3 documentation
- ast — Abstract Syntax Trees — Python 3.7.3 documentation
- py_compile — Compile Python source files — Python 3.7.3 documentation
- compileall — Byte-compile Python libraries — Python 3.7.3 documentation
- dis — Disassembler for Python bytecode — Python 3.7.3 documentation
- その他
- CPythonVmInternals - Python Wiki
- Pythonの内部構造の授業(10時間)
- Python VM (ceval.c) の動きを説明している。(PyFrameObjectの動き等々)
- 動的情報をどこにおいてあるかの説明(PyFrameObject => PyCodeObject)
- python2.7の場合
- https://www.usenix.org/legacy/event/woot08/tech/full_papers/portnoy/portnoy.pdf
- python2.5の場合
- 500 Lines or Less | A Python Interpreter Written in Python