1. オリエンテーション
CPython とは何か、ソースからの構築、リポジトリのレイアウト、C コードの読み取り、ランタイム モデル、ソース コードから実行までのパス。
| 章 | タイトル |
|---|---|
| 1 | CPython とは |
| 2 | ソースから CPython を構築する |
| 3 | リポジトリのレイアウト |
| 4 | CPython C コードを読む |
| 5 | ランタイムモデル |
| 6 | ソースコードから実行まで |
-
1. CPython とは
#1. CPython とは CPython は、Python プログラミング言語の主要な実装です。これは、Python を python.org、パッケージ マネージャー、Linux ディストリビューション、Homebrew、pyenv、Docker イメージ、またはほとんどのクラウド ランタイムからインストールするときにほとんどの人が使用する実装です。 CPython には 2 つの役割があります。 まず、Python 言語を実装します。これは、Python ソース コードがどのように解析、コンパイル、実行され、標準ライブラリに接続されるかを定義します。 2 番目に、Python エコシステムの実用的な参照ポイントとして機能します。他の実装は言語仕様に従う場合がありますが、CPython は、ほとんどのパッケージ、ツール、デバッガー、プロファイラー、および C 拡張機能がテストされる実装です。 CPython ソース ツリーには、インタープリター、コンパイラー、オブジェクト システム、ランタイム、C API、標準ライブラリ、テスト スイート、ドキュメント、およびビルド機構が含まれています。公式開発者ガイドでは、CPython を、ソース ツリーで維持される内部ドキュメントを持つ変化するコード ベースとして説明しています。 ([Python 開発者ガイド][1]) 1.1 言語としての Python と実装としての CPython 言語はPythonです。 CPython はその言語の実装の 1 つです。 Python 言語では、構文、名前、式、ステートメント、オブジェクト、モジュール、例外、反復、非同期動作、インポートなどの目に見える動作が記述されるため、この区別は重要です。 CPython では、その動作を実際のマシンで実行する具体的な方法の 1 つについて説明します。 次のような Python プログラム:```python def add(a, b): return a + b print(add(2, 3)) ```言語レベルの Python です。言語は私たちにそれを伝えます def 関数オブジェクトを作成します。…
-
2. ソースから CPython を構築する
2. ソースから CPython を構築する ソースから CPython をビルドすると、検査、変更、デバッグ、テストできるローカル インタプリタが得られます。これは、内部構造を真剣に読む前の実際的な最初のステップです。 ソース ビルドを使用すると、パッケージ化された Python インストールでは通常隠蔽されることを行うことができます。```text change interpreter code add debug prints inspect object layout run CPython tests use debug-only assertions trace reference counts debug crashes in C compare bytecode across builds CPython は Git リポジトリに存在します。通常のローカル チェックアウトは次のようになります。 ``` bash git clone https : // github . com / python / cpython . git cd cpython ``` リポジトリには、インタープリタ、標準ライブラリ、テスト、ドキュメント、ビルド ファイル、およびプラットフォーム サポート コードが含まれています。 簡略化したビュー : ``` text…
-
3. リポジトリのレイアウト
#3. リポジトリのレイアウト CPython リポジトリは、インタプリタの主要なサブシステム (オブジェクト実装、ランタイム機構、コンパイラ パイプライン、パーサー、組み込みモジュール、標準ライブラリ、テスト、ドキュメント、プラットフォーム ビルド ファイル) を中心に編成されています。 適切な最初のパスは、ソース ツリーを責任のマップとして扱うことです。```text cpython/ Include/ Objects/ Python/ Parser/ Modules/ Lib/ Programs/ Tools/ Doc/ Grammar/ PC/ PCbuild/ Mac/ ## 3.1 最上位構造 |ディレクトリ |主な役割 | | ----------- | --------------------------------------------------- | |`Include/`|パブリック、内部、プライベート C ヘッダー | |`Objects/`|コア オブジェクト タイプの実装 | |`Python/`|ランタイム、コンパイラ、インタープリタ ループ、初期化 | |`Parser/`|トークナイザーとパーサーのサポート コード | |`Grammar/`|文法入力ファイル | |`Modules/`| C で書かれた組み込みモジュールと拡張モジュール |`Lib/`| Python標準ライブラリ | |`Lib/test/`| CPython 回帰テスト スイート | |`Programs/`|実行可能エントリ ポイント | |`Tools/`|開発者および構築ツール | |`Doc/`|ドキュメントのソース |…
-
4. CPython C コードの読み取り
4. CPython C コードの読み取り CPython C コードを読み取るには、同時に 2 つのメンタル モデルが必要です。 最初のモデルは通常の C: 構造体、ポインター、マクロ、関数ポインター、参照の所有権、割り当て、エラー戻り値、および条件付きコンパイルです。 2 番目のモデルは Python のランタイム モデルです。オブジェクト、型、フレーム、例外、参照カウント、記述子、反復子、モジュール、バイトコードです。 ほとんどの CPython ソース ファイルは両方を組み合わせています。 C コードの行は通常のポインター操作のように見えるかもしれませんが、多くの場合、Python 言語ルールがエンコードされています。 4.1 実行時不変式から開始する 中心となる不変式は単純です。 text id="vm1twr" Every Python value is represented as a PyObject pointer or a pointer to a struct whose first field is compatible with PyObject. ほとんどの CPython 関数は値を処理します。 PyObject * 。```c id="x34zg4" PyObject *obj; 実際の動作はオブジェクトのタイプから決まります。 ``` c id = "y1r4zx" Py_TYPE ( obj…
-
5. ランタイムモデル
#5. ランタイムモデル CPython ランタイムは、プロセスの開始後、Python コードの実行が終了するまでに存在する機構です。インタプリタ状態、スレッド状態、モジュール、ビルトイン、メモリ アロケータ、例外状態、インポート状態、フレーム、保留中の呼び出し、シグナル処理、およびシャットダウン動作を所有します。 Python プログラムは一連のステートメントとして実行されるように見えます。 CPython は、階層化されたランタイム システム内でそれを実行します。```text operating system process CPython runtime interpreter state thread state frame stack executing code object bytecode instructions object operations ## 5.1 プロセス、ランタイム、インタプリタ、スレッド、フレーム 実行中の CPython プログラムには、複数のネストされた実行ユニットがあります。 | 単位 | 意味 | | ---------- -- | -------------------------------------------------------------------- | | プロセス | CPython 実行可能ファイルまたは埋め込みランタイムを含む OS プロセス | | ランタイム | プロセス全体で共有されるグローバル CPython 状態 | | 通訳 | ランタイム内の分離された Python インタープリターの状態 | | スレッドの状態…
-
6. ソースコードから実行まで
#6. ソースコードから実行まで CPython は Python ソース テキストを直接実行しません。最初のバイトコード命令が実行される前に、いくつかの内部表現を通じてソース テキストを変換します。 パスは次のとおりです。```text source text ↓ tokens ↓ parse tree ↓ abstract syntax tree ↓ symbol table ↓ code object ↓ frame ↓ bytecode evaluation ↓ object operations ## 6.1 ソーステキスト 入力はテキストとして始まります。 ``` python x = 1 + 2 print ( x ) ``` CPython はこれを実行する前に、次のことを認識している必要があります。 ``` text where statements begin and end which characters form names which characters form numbers which indentation levels…