RPythonToolChainでOok!を実装した時のノウハウ紹介。PyPy Advent Calendar 2011 7日目

この記事は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を実際に試しに視覚化してみましょう。

事前準備
生成物の例

f:id:rokujyouhitoma:20111207225935p:image

使い方
$ python /path/to/pypy/tool/logparser.py draw-time logfile out.png

"logfile"はログファイル。"out.png"は出力する画像ファイル名。

  • 緑色がjit
    • 更に、jit-optimize, jit-tracing, jit-backendが細かく色分けされている。
  • 赤色がgc
    • jitと同様にgc-minorが色分けされている。translate.pyでコンパイルする際にgcオプションで他のgcも色分けされるよう。

ook-jit-debug-cのlogfileを視覚化。

先ほどのook-jit-debug-cが生成したlogfileの場合は次の通りです。

f:id:rokujyouhitoma:20111208003314p:image

バトン

それでは、次はid:jbkingにPyPy Advent Calendar 2011のバトンを渡そうと思います。