Can A Python Go Beyond The Python
- 2. PyPyとは? Python で実装された Python 処理系 解釈できる言語は RPython オリジナルの Python にはない様々な機能 処理系全てがPythonで作られている。 パーサ、抽象構文木(AST)、インタプリタ、環境フレームなども Pure Pythonなモジュールも動作実績がある Django, Pylons, BitTorrent, Twisted, SymPy, Pyglet, Nevow, Pinax
- 3. こんな感じ # トレースオプション >>>> __pytrace__ = 1 Tracing enabled >>>> a = 1 + 2 |- <<<< enter <inline>a = 1 + 2 @ 1 >>>> |- 0 LOAD_CONST 1 (W_IntObject(3)) |- 3 STORE_NAME 0 (a) |- hash(W_StringObject('a')) -> W_IntObject(-468864544) |- int_w(W_IntObject(-468864544)) -> -468864544 |- 6 LOAD_CONST 0 (<W_NoneObject()>) |- 9 RETURN_VALUE |- <<<< leave <inline>a = 1 + 2 @ 1 >>>>
- 4. PyPyとは? Python で実装された Python 処理系 解釈できる言語は RPython オリジナルの Python にはない様々な機能 Python言語のサブセット Restricted Python 一番大きな違いはyieldが使えないこと ジェネレータが使えない http://codespeak.net/pypy/dist/pypy/doc/coding-guide.html
- 5. PyPyとは? Python で実装された Python 処理系 解釈できる言語は RPython オリジナルの Python にはない様々な機能 Prologインタプリタ 多様なGC 多種なバックエンド C, CLI, JVM向けのバイナリを出力できる Stackless JIT
- 8. JIT? JIT とは ? PyPy に積まれてる JIT Just In Timeコンパイラ Sun JVMのHotSpotで使われている コードのよく実行される箇所を高速化する 最近だとTraceMonkeyやV8にも使われて話題に
- 10. JIT? JIT とは ? PyPy に積まれてる JIT Tracing JIT Trace Monkeyと同じ手法 バイトコードレベルでよく実行される箇所を検出して、それを最適化する psycoの人が関わってる 関数を超えた最適化も可能 だけど今のPyPyでの実装は、、、
- 11. こんな感じ def f(a, b) : if b % 46 == 41: return a - b else: return a + b def strange_sum(n): result = 0 while n >= 0: result = f(result, n) n -= 1 return result # corresponding trace: loop_header(result0, n0) i0 = int_mod(n0, Const(46)) i1 = int_eq(i0, Const(41)) guard_false(i1) result1 = int_add(result0, n0) n1 = int_sub(n0, Const(1)) i2 = int_ge(n1, Const(0)) guard_true(i2) jump(result1, n1) <= ガード条件に失敗するとインタプリタに戻る <= http://codespeak.net/svn/pypy/extradoc/talk/icooolps2009/bolz-tracing-jit.pdf
- 12. こんな感じ class __exten d__(PyFrame): def dispatch(self, pycode, next_instr, ec): next_instr = r_uint(next_instr) try: while True: pypyjitdriver.jit_merge_point( frame=self, ec=ec, next_instr=next_instr, pycode=pycode) co_code = pycode.co_code self.valuestackdepth = hint(self.valuestackdepth, promote=True) next_instr = self.handle_bytecode(co_code, next_instr, ec) except ExitFrame: return self.popvalue() def JUMP_ABSOLUTE(f, jumpto, next_instr, *ignored): ec = f.space.getexecutioncontext() pypyjitdriver.can_enter_jit(frame=f, ec=ec, next_instr=jumpto, pycode=f.getcode()) return jumpto