Pythonを改造して機能を追加した話
※このブログはeeicの実験「大規模ソフトウェアを手探る」のレポートとして書かれたものです。
東京大学工学部電子情報工学科/電気電子工学科(eeic)の選択できる実験として「大規模ソフトウェアを手探る」があります。これは、OSS(オープンソースソフトウェア)として公開されている大規模なプログラムを改良/機能拡張することで、普段授業で扱うような小規模なプログラムでは触れられない、全容を把握することが困難なプログラムを扱う方法を身につけるというものです。 今回、自分たちは授業でも使い馴染みのあるPythonを手探ることにしました。
リンク
- 概要(Pythonを改造して機能を追加した話) ←イマここ
- PythonにC言語っぽい文法を追加する
・論理演算子として&&や||や!を追加する
・論理値のTrue,Falseをtrue,falseにも対応させる
・elifだけでなくelse ifにも対応させる - Pythonにオートインデント機能をつける
- (おまけ)Pythonにunless文を追加する
環境
- OS
Ubuntu20.04 / Ubuntu18.04 - 改造対象
Python3.10(cpython) - 使ったツール
Emacs, gdb
準備
まず作業用のディレクトリを作成します(ここでは~/cpython
)。
Github上のPython3.10(cpython)からgit clone
を用いてリポジトリを複製します。
$ mkdir cpython $ cd cpython $ git clone https://github.com/python/cpython
ビルド
configure
でMakefile
を作成します。このとき--prefix
オプションをもちいて最終的にプログラムをどこに配置するかを決定します(ここでは~/python-install
)。また環境変数CFLAGS
に-O0
を付けることで最適化レベルを落とし、さらに-g
を付けることで実行可能ファイルに「デバッグシンボル」を含めます。こうすることで、gdbを使ってプログラムの挙動を1行ずつ追うことができます。
configure
でMakefile
が作成できたら、make
とmake 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-gdb
とgdb --fullname python3
を叩いてgdbを起動、これを用いてプログラムの追跡を行いました。
参考資料
- 実験のホームページです。
CPythonの公式ドキュメント(Changing CPython’s Grammar)
CPythonの公式ドキュメント(Design of CPython’s Compiler)
- pythonに文法を追加する際にどのファイルを変更すればよいかが記載されています。
- Pythonにオートインデント機能をつけるで参考にしたドキュメントです。