CPythonに機能追加してみた(ビルド&構造把握)


1. はじめに

ここでは、CPythonに機能追加する上で必要となるCPythonのビルドとCPythonのファイル構造について説明します。
本記事ではPython3.10を使用しています。
* この記事はEEIC(東京大学工学部 電気電子工学科/電子情報工学科)3年の後期実験「大規模ソフトウェアを手探る」のレポートとして書きました。
* 以下の記事はチームメンバーが書いたものです。

CPythonに機能追加してみた(三項演算子)
pythonに2種類のswitch文を追加する
Pythonに前置インクリメントを追加

2. CPythonとは

CPythonとは、C言語で書かれたPythonのことで、一般的にPythonと呼ぶ時、このPythonのことを指してることが多いです。コードはGitHub上で管理されておりPRを出すこともできます。

3. CPythonのビルド

CPythonのビルドについては公式の記事が非常に参考になります。まず、CPython3.10のリポジトリからコードをcloneします。


$ git clone https://github.com/python/cpython

次に、ディレクトリを移動し、configureスクリプトを実行します。ここでは、-gで実行可能ファイルに「デバッグシンボル」を含め、-O0で最適化を最低レベルにしています。また、--prefixをつけることでインストールするフォルダを指定しています。


$ cd cpython
$ CFLAGS="-O0 -g" ./configure  --with-pydebug   --prefix=(インストールするディレクトリ)

続いて、コンパイル&インストールを行います。

$ make -s -j2
$ make install

以上で、CPythonが無事インストールできます。インストールしたPythonを実行するには以下のようにします。

$ cd (インストールしたディレクトリ)/bin
$ ./python3

4. CPythonに機能追加

CPythonに機能追加する時のチェックリストが公式によりまとめられています。以下では、こちらを参考にして説明していきます。

4.1 CPythonのファイル構成

CPythonに機能追加を行う際に主に変更を加えるファイルで重要なのはこの4つとなります。順に見ていきます。

4.1.1 python.gram

まず、python.gramについて説明します。

CPythonのGrammer/python.gramにあるファイルです。python.gramではPythonの文法を規定しています。追加する文法をこのファイルに記述します。


$ make regen-pegen

よりParserを自動生成してくれます。

4.1.2 python.asdl

続いて、python.asdlについて説明します。

抽象構文木(AST)を作成するためのファイルです。python.gramで新たな関数を定義したなら、このファイルにも関数定義を記述する必要があります。


$ make regen-ast

よりASTが自動生成されます。

4.1.3 compile.c

続いて、compile.cについて説明します。

ASTをバイトコードに変換するファイルです。構文ごとの処理をバイトコードで記述します。文法追加の際、その文法の処理をバイトコードでこちらに記述します。

4.1.4 ceval.c

続いて、ceval.cについて説明します。

バイトコードを実行します。既存のバイトコードで実装不可能な場合、こちらに新しいバイトコードを追加します。

5. まとめ

以上では、CPythonのビルドと構造把握について説明しました。CPythonはコード量こそ膨大ですが、公式のチェックリストで文法変更の手順がまとまっていたので、注目する必要のあるコード量については少なく感じました。

参考資料