tag

#compiler

9 pages tagged

18. トークン化

#18. トークン化 トークン化は、CPython のコンパイル パイプラインの最初の構造段階です。 Python ソース テキストを受け取り、トークンのストリームを生成します。パーサーはそのトークン ストリームを消費し、そこから構文構造を構築します。 この段階では、CPython はプログラムが意味があるかどうかをまだ知りません。名前、数値、文字列、演算子、改行、インデント、ファイルの終わりマーカーなどの語彙単位のみを認識します。 トークナイザーは次のように変換します。 python def add(a, b): return a + b 次のような形のストリームになります。 text NAME "def" NAME "add" LPAR "(" NAME "a" COMMA "," NAME "b" RPAR ")" COLON ":" NEWLINE "\n" INDENT " " NAME "return" NAME "a" PLUS "+" NAME "b" NEWLINE "\n" DEDENT "" ENDMARKER "" 正確なトークン名とパーサー インターフェイスは CPython のバージョンによって異なりますが、中心的な考え方は安定しています。 Python 標準ライブラリは、次の方法で Python レベルのトークナイザーを公開します。 tokenize 一方、CPython のパーサーは内部で独自の C トークナイザーを使用します。一般の人々…

23. コードオブジェクト

#23. コードオブジェクト コード オブジェクトは、実行可能な Python コードを CPython がコンパイルして表現したものです。 バイトコードとメタデータが含まれています。インタプリタはそれを実行できますが、コード オブジェクト自体は、グローバル、デフォルト引数、クロージャ セル、バインドされたメソッドなどの実行時状態を保持しません。 このソースの場合: python def add(a, b): return a + b 関数オブジェクト add コードオブジェクトが含まれています:```python code = add. code print(code.co_name) print(code.co_varnames) print(code.co_consts) print(code.co_names) ## 23.1 コンパイルパイプラインでの位置 コード オブジェクトはコンパイルの出力です。 ``` text source text ↓ tokenization ↓ parsing ↓ AST ↓ symbol table ↓ compiler ↓ code object ↓ frame execution ``` コード オブジェクトは、コンパイラとインタプリタ間の受け渡しです。 コンパイラはコード オブジェクトを生成します。 評価ループはフレーム内のコード オブジェクトを実行します。 ## 23.2 コードオブジェクトと関数オブジェクト 関数オブジェクトはコード オブジェクトをラップします。 例:…