Pythonを改造して機能を追加した話

※このブログはeeicの実験「大規模ソフトウェアを手探る」のレポートとして書かれたものです。

東京大学工学部電子情報工学科/電気電子工学科(eeic)の選択できる実験として「大規模ソフトウェアを手探る」があります。これは、OSS(オープンソースソフトウェア)として公開されている大規模なプログラムを改良/機能拡張することで、普段授業で扱うような小規模なプログラムでは触れられない、全容を把握することが困難なプログラムを扱う方法を身につけるというものです。 今回、自分たちは授業でも使い馴染みのあるPythonを手探ることにしました。

リンク

環境

準備

まず作業用のディレクトリを作成します(ここでは~/cpython)。 Github上のPython3.10(cpython)からgit cloneを用いてリポジトリを複製します。

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

ビルド

configureMakefileを作成します。このとき--prefixオプションをもちいて最終的にプログラムをどこに配置するかを決定します(ここでは~/python-install)。また環境変数CFLAGS-O0を付けることで最適化レベルを落とし、さらに-gを付けることで実行可能ファイルに「デバッグシンボル」を含めます。こうすることで、gdbを使ってプログラムの挙動を1行ずつ追うことができます。

configureMakefileが作成できたら、makemake installコンパイルとインストールを行います。

$ CFLAGS="-g -O0" ./configure --prefix=/home/[username]/python-install/
$ make 
$ make install

これでビルドが完了し、~/python-install/bin/python3を実行することで、pythonが起動できます。 コードを変更したときは、make cleanをしてからmakeをする必要があります。

デバッガで追跡

Emacsを起動し、M-x shellコマンドで~/python-install/bin/に移動します。 移動できたらM-x gud-gdbgdb --fullname python3を叩いてgdbを起動、これを用いてプログラムの追跡を行いました。

参考資料

大規模ソフトウェアを手探る

  • 実験のホームページです。

CPythonの公式ドキュメント(Changing CPython’s Grammar)

CPythonの公式ドキュメント(Design of CPython’s Compiler)

  • pythonに文法を追加する際にどのファイルを変更すればよいかが記載されています。

GNU readline公式ドキュメント

Pythonを改造してみた はじめに

  • unless文をPythonに追加したEEICの先輩の記事です。Pythonを改造するにあたって、何から始めればいいかを参考にしました。