この記事はPyPy Advent Calendar 2011 7日目の記事であるとともに、仕事で来ているサンフランシスコのホテルでまさに書いています。
明日は id:jbking です!よろしくお願いします!
http://d.hatena.ne.jp/ymotongpoo/
前日の id:ymotongpoo からid:jbkingにバトンが渡る予定でしたが、割り込みしました。
RPythonToolChain
以前、Brainf*ckの類縁Ook!をPyPyのRPythonToolChainを利用して実装しました。
その時溜まったノウハウを紹介しようと思います。
RPythonToolchainで実装している処理系のログ
RPythonToolchainで実装している処理系のログを出力する方法を紹介します。
ログの出力については下記に書かれている通りです。
jit組み込みの例。
def get_location(pc, program, bracket_map): return "%s_%s_%s" % ( program[:pc], program[pc], program[pc+1:] ) jitdriver = JitDriver(greens=['pc', 'program', 'bracket_map'], reds=['tape'], get_printable_location=get_location)
上記のget_locationとjitdriverが組み込まれたOok!はこちらです。
実際にook-jit-debug.pyをtranslate.pyでコンパイルしてバイナリを作成します。
$ hg clone https://bitbucket.org/rokujyouhitoma/lang-ook $ python /path/to/pypy/translator/goal/translate.py --opt=jit ook-jit-debug.py
ログファイルを出力して実行しましょう。
$ PYPYLOG=jit-log-opt:logfile ook-jit-debug-c samples/mandel.ook
生成されたlogfileはこちら。
pypy/tool/logparser.py
pypy/tool/logparser.pyを使うと、logファイルを画像ファイルに変換し、GCやJITの発生を時間軸を元に視覚化することができます。
先ほどのlogfileを実際に試しに視覚化してみましょう。
事前準備
- PILのインストール
- PyPyの環境にPILをインストールする際にはまったので。virtualenv + pypyの環境でpip installでPILをインストールする
バトン
それでは、次はid:jbkingにPyPy Advent Calendar 2011のバトンを渡そうと思います。