次世代言語 Python による
 PyPy を使った
次世代の処理系開発


第八回ありえるえりあ勉強会
   2012/01/20

      しょーま
    @shomah4a
お前、誰よ
●   しょーま or しょうま
    ●   twitter: @shomah4a
    ●   id:shomah4a
●   pypy-ja とか PyCon JP とかやってるみたい
●   PyPy を使ってみた切っ掛けは俺言語が作りたかっ
    たから
●   仕事? こまけぇこたぁいいんだよ
やること
●   PyPy ってなに?
●   Python で Python を実装するとは
●   高速化のヒミツ
●   その他情報まとめ
PyPy って何?
twitter で見かけた説明によると
https://twitter.com/nati/status/121825143285747713
一部不適切な表現がありましたがお詫
びするのも面倒だしする気もないので
       次へ
PyPy とは
●   http://pypy.org/
●   Python で作られた Python のインタプリタ
    ●   一般的にはこっち
    ●   今日は説明だけ
●   Python を作るために Python で作られた動的言
    語作成フレームワーク
    ●   今日はこっちがメイン
●   メインコミッターは Armin Rigo 氏
PyPy とは
●   前身は Psyco (さいこ)
    ●   http://psyco.sourceforge.net/
●   Python に JIT を追加す
    るモジュール
●   こちらも Armin Rigo 氏
    がメインコミッター
●   x86 しか使えない
Python インタプリタ
●   Python で作られた Python の処理系
●   速いよ!
    ●   JIT が載っていてすごく速い
    ●   CPython の五倍くらいらしい
    ●   ベンチマークについてはここらへんに kwsk 載っている
        ので参照 http://speed.pypy.org/
    ●   高速化を…強いられているんだ!
互換性とか
●   現在は Python 2.7.1 互換の処理系
    ●   開発としては 3.x 対応を進めている
    ●   3.x 対応に向けた開発のための資金出資者募集中!!
●   C 拡張もそれなりに使えるけど、まだまだ
    ●   ctypes を実装することで読めるようになっているとか
    ●   http://readthedocs.org/docs/pypy/en/latest/extend
CPython との違い
●   Garbage Collection が違う
●   CPython
    ●   参照カウント
    ●   Mark & Sweep のような何か
        –   循環参照の解放に使われる
        –   http://www.narihiro.info/translate/garbage_collection_for_python_jp.html
●   PyPy
    ●   標準は Minimark GC
    ●   その他色々選べる
    ●   http://readthedocs.org/docs/pypy/en/latest/garbage_collection.htm
●   細かな違いはここら辺(翻訳途中)
●   http://readthedocs.org/docs/pypyja/en/latest/cpython_differe
ここまでコピペ
●   ここらへんからコピペしました
    ●   PyPy 紹介
    ●   http://www.slideshare.net/ShomaHosaka/pypy-1011
    ●   受付のお姉さんの感想は「フォントが可愛い」でした
●   こっから先も大体コピペです
その他の資料
●   PyPy Advent Calendar 5日目 - PyPyとCPython
    の違いを知ろう - Ehrenの日記
    ●   http://d.hatena.ne.jp/Ehren/20111205/132307880
●   PyPy Advent Calendar 2011 6日目
    Frequently Asked Questions -
    YAMAGUCHI::weblog
    ●   http://d.hatena.ne.jp/ymotongpoo/20111206/1323
やること
●   PyPy ってなに?
●   Python で Python を実装するとは
●   高速化のヒミツ
●   その他情報まとめ
Python で Python を実装するとは
そもそも何を作るの?
●   言語の処理系に必要なもの全部
●   ソースのパース
●   VM のバイナリに落とし込む
●   VM そのものの実装
●   VM 上の型システム
●   標準ライブラリ
●   etc
●   …
はい! めんどくせーって思った人!
PyPy はそんなあなたをサポートします
PyPy とは
●   動的言語の処理系を作るための汎用フレームワー
    ク!
●   しかもフルスタック
●   Python なので書きやすい!
    ●   C みたいにメモリ確保とかめんどくさい部分は PyPy が
        引き受けてくれたり
    ●   dict, list みたいなリッチな組み込み型が使えたり
●   PyPy の Python インタプリタの中で使い回せるも
    のは使い回しちゃう
PyPy がしてくれること
●   言語を作るためのライブラリとか
    ●   EBNF によるパーサ
    ●   dict, list などの Python で使える標準的な型
    ●   基本的な型システムとその評価器 (ObjectSpace)
    ●   Python から C ライブラリを使う仕組み
●   メモリ管理はもちろん意識しない
●   RPython Toolchain
    ●   JIT コンパイラ
    ●   各種GC
実装実績(Python 以外)
●   Brainf*ck
●   Gameboy Emulator
●   Grass
●   HQ9+
●   Io
●   JavaScript
●   Ook!
●   Prolog
●   Scheme
●   Smalltalk
でも、遅いんでしょう?
やること
●   PyPy ってなに?
●   Python で Python を実装するとは
●   高速化のヒミツ
●   その他情報まとめ
高速化のヒミツ
速度について
●   Python で Python を実装している PyPy
●   でも 5 倍くらい速いらしい
何言ってんだこいつ
Python で Python 実装したって速い
      わけねーだろ起きろ!
と思われるかもしれませんが
●   速さにはもちろん理由があります
●   RPython Toolchain がキーワード
RPython Toolchain とは
●   RPython という言語を処理するためのツールチェ
    イン
●   FlowGraph, Annotation, RTyper, Optimize な
    どの工程を経て、様々なバックエンドに出力できる
●   バックエンドは C Binary, CLI, Python, LLVM,
    JVM など
●   kwsk はここらへん
    http://readthedocs.org/docs/pypyja/en/latest/t
RPython とは
●   Restricted Python の略らしい
●   Zope の RestrictedPython ではない
●   Python をバイナリコンパイルするためにいくつか
    の制限を設けたもの
●   型システム含む動的な部分を制限し、静的型っぽく
    なっている
●   Python のサブセットなので、 RPython は Python
    の処理系でそのまま動く
RPython の制限
●   変数は一つの型しか扱えない
    ●   継承関係にあればアップキャストできる
●   モジュールグローバル変数はすべて定数として扱われる
    ●   書き換えようとするとエラー
●   for ループは組み込み型のみ
●   動的関数定義や動的クラス定義は無理
●   ジェネレータはサポートしない
●   関数などの型は一つしか推論結果を持てない
    ●   template <typename T> T somefunc(T arg) なんだけど、
        実体化できるのは一つ、というイメージ
RPython の制限
●   文字列型のメソッドは大体使えるけど使えないのもある
●   リストは一つの型しか扱えない
    ●   辞書なんかも同様
    ●   複数の型が入るような場合は、すべての型を含む上限境界の型が推
        論結果として使われる
    ●   最悪 TYPE <: object な推論結果になって、後々エラーになることも
●   クラス周り
    ●   後付のメソッドは不可
    ●   単一継承は完全サポート
    ●   単純な mixin はサポート
    ●   クラスはもちろんファーストクラスオブジェクト
RPython の制限
●   Python の動的な部分が結構制限されて、静的型
    言語っぽくなる
    ●   コンパイル時なら動的に色々できる
●   とはいえ Python らしい記述力は十分発揮できる
●   静的型っぽいとはいえ、普通にプログラムを書いて
    いれば、そんなにおかしな設計をしない限り動的型
    言語でも型を意識して静的型っぽくなるでしょう?
●   詳しい仕様はこちら:
    http://readthedocs.org/docs/pypy/en/latest/co
RPython Toolchain の工程
●   RPython
●   FlowGraph
●   Annotation
    ●   Type Annotation
    ●   RTyper
    ●   Optimize (Optional)
    ●   Transform
●   Output (C Binary, CLI, LLVM, etc...)
FlowGraph
●   平たくいえばフローチャート
●   RPython から分岐・繰り返し・関数呼び出しなどの
    処理の流れを取り出し、データ構造にしたもの
●   後の工程ではこれに対して色々やる
Type Annotation
●   型アノテーション
●   FlowGraph を辿って、型を全部チェックしていく
    ●   みんな大好き型推論
    ●   静的解析かも
●   型チェックしてくれてエラーも出してくれるし素敵!
●   Erlang の Dializer みたいなやつ?
●   この後のセッションで詳しく説明します
RTyper
●   Annotator による型とバックエンドの型システムを
    繋ぐもの
●   Annotator の High-level な型からバックエンドの
    Low-level な型に変換する
●   signed int とか unsigned int とか
●   リストじゃなくて配列とか
●   ドキュメントはこちら
    http://codespeak.net/pypy/dist/pypy/doc/rtype
RTyper で使われる型システム
●   lltypesystem
    ●   C っぽいモデル
    ●   低レベルな操作に変換される
    ●   メモリ操作とかポインタとか
    ●   C Backend
    ●   LLVM Backend
RTyper で使われる型システム
●   ootypesystem
    ●   High-level な型システムを持つ VM 向け
    ●   CLI
    ●   JVM
    ●   Squeak(?)
Transform
●   Transform
    ●   FlowGraph の構造を弄るイメージ
    ●   Stackless 変換(deprecated)
        –   continulet になりました
        –   http://readthedocs.org/docs/pypyja/en/latest/stackless.h
    ●   CPS 変換とかもできそうじゃない?(適当)
    ●   Lisp のマクロみたいな何か
Backend
●   色々やってバックエンドにはき出す
●   さっき書いたよね
JIT コンパイラ
●   Just in Time Compiler
●   実行時に処理の流れを解析して最適化できるとこ
    ろを最適化する
●   実装した 処理系から Analyzer にヒントを与えると
    最適化してくれる
●   詳しくはこの後
結局のところ
●   RPython Toolchain でバイナリになるから速い
●   とはいえ C でガチで書くよりは遅い
●   速いのは JIT があるから
    ●   後のセッションにご期待下さい!
●   結局型チェックしてバイナリに落とすならそれで動
    的言語作らなくてもいいんじゃないの? という方は
    こちら
    ●   渋日記: PyPyよりも5倍高速な最速のPython処理系
        http://blog.shibu.jp/article/51727956.html
問題とか
●   x86 な Linux 以外の環境だと C-Backend 以外
    がコンパイルできなかったりする
    ●   pypy cliバックエンドに完敗 - aodag's posterous
        –   http://aodag.posterous.com/pypy-cli
    ●   jvmバックエンドに完敗 PyPy Advent Calendar 26日
        + 1日目(27日目?) - rokujyouhitomaの日記
        –   http://d.hatena.ne.jp/rokujyouhitoma/20111226/132485
    ●   PyPy Sudden Death Calendar 27日目 - JVM
        Backend に完敗した件を受けて - プログラマのネタ帳
        –   http://d.hatena.ne.jp/shomah4a/20111227/1324997958
ソースとかデモとか
●   時間があったら…
●   https://bitbucket.org/brownan/pypy-tutorial/
情報まとめ
●   本家ドキュメント
    ●   http://readthedocs.org/docs/pypy/en/latest/
●   pypy-ja が翻訳中のドキュメント
    ●   http://readthedocs.org/docs/pypyja/en/latest/
    ●   協力者募集中!
情報まとめ
●   PyPy Tutorial
    ●   PyPy を使って BF という言語を実装するチュートリアル
    ●   言語実装から JIT のヒント追加まで一通り
    ●   https://bitbucket.org/brownan/pypy-tutorial/
    ●   翻訳しました
        –   http://shomah4a.net/pypy-tutorial/
情報まとめ
●   PyPy Advent Calendar 2011
    ●   PyPyの紹介・翻訳・言語実装・処理系拡張・実装理論
        など各種エントリが揃っているのでオススメ
    ●   http://atnd.org/events/22078
    ●   https://sites.google.com/site/pypyja/pypy-advent-ca
pypy-ja について
●   闇の軍団らしいよ
●   @rokujyouhitoma が総帥
●   pypy-ja まとめサイト
    ●   https://sites.google.com/site/pypyja/
●   Google Groups
    ●   https://groups.google.com/group/pypy-ja
●   Bitbucket
    ●   https://bitbucket.org/pypyja
●   lingr
    ●   http://lingr.com/room/pypy_ja
    ●   skype ばっかりなのであんまり使われていなかったり…
pypy-ja は皆様の参加をお待ちしております!
興味のある方は多分会場にいるであろう @rokujyouhitoma が
     代表総帥なので掛けあってみてください
ご清聴ありがとうございました

次世代言語 Python による PyPy を使った次世代の処理系開発

  • 1.
    次世代言語 Python による PyPy を使った 次世代の処理系開発 第八回ありえるえりあ勉強会 2012/01/20 しょーま @shomah4a
  • 2.
    お前、誰よ ● しょーま or しょうま ● twitter: @shomah4a ● id:shomah4a ● pypy-ja とか PyCon JP とかやってるみたい ● PyPy を使ってみた切っ掛けは俺言語が作りたかっ たから ● 仕事? こまけぇこたぁいいんだよ
  • 3.
    やること ● PyPy ってなに? ● Python で Python を実装するとは ● 高速化のヒミツ ● その他情報まとめ
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
    PyPy とは ● http://pypy.org/ ● Python で作られた Python のインタプリタ ● 一般的にはこっち ● 今日は説明だけ ● Python を作るために Python で作られた動的言 語作成フレームワーク ● 今日はこっちがメイン ● メインコミッターは Armin Rigo 氏
  • 9.
    PyPy とは ● 前身は Psyco (さいこ) ● http://psyco.sourceforge.net/ ● Python に JIT を追加す るモジュール ● こちらも Armin Rigo 氏 がメインコミッター ● x86 しか使えない
  • 10.
    Python インタプリタ ● Python で作られた Python の処理系 ● 速いよ! ● JIT が載っていてすごく速い ● CPython の五倍くらいらしい ● ベンチマークについてはここらへんに kwsk 載っている ので参照 http://speed.pypy.org/ ● 高速化を…強いられているんだ!
  • 11.
    互換性とか ● 現在は Python 2.7.1 互換の処理系 ● 開発としては 3.x 対応を進めている ● 3.x 対応に向けた開発のための資金出資者募集中!! ● C 拡張もそれなりに使えるけど、まだまだ ● ctypes を実装することで読めるようになっているとか ● http://readthedocs.org/docs/pypy/en/latest/extend
  • 12.
    CPython との違い ● Garbage Collection が違う ● CPython ● 参照カウント ● Mark & Sweep のような何か – 循環参照の解放に使われる – http://www.narihiro.info/translate/garbage_collection_for_python_jp.html ● PyPy ● 標準は Minimark GC ● その他色々選べる ● http://readthedocs.org/docs/pypy/en/latest/garbage_collection.htm ● 細かな違いはここら辺(翻訳途中) ● http://readthedocs.org/docs/pypyja/en/latest/cpython_differe
  • 13.
    ここまでコピペ ● ここらへんからコピペしました ● PyPy 紹介 ● http://www.slideshare.net/ShomaHosaka/pypy-1011 ● 受付のお姉さんの感想は「フォントが可愛い」でした ● こっから先も大体コピペです
  • 14.
    その他の資料 ● PyPy Advent Calendar 5日目 - PyPyとCPython の違いを知ろう - Ehrenの日記 ● http://d.hatena.ne.jp/Ehren/20111205/132307880 ● PyPy Advent Calendar 2011 6日目 Frequently Asked Questions - YAMAGUCHI::weblog ● http://d.hatena.ne.jp/ymotongpoo/20111206/1323
  • 15.
    やること ● PyPy ってなに? ● Python で Python を実装するとは ● 高速化のヒミツ ● その他情報まとめ
  • 16.
    Python で Pythonを実装するとは
  • 17.
    そもそも何を作るの? ● 言語の処理系に必要なもの全部 ● ソースのパース ● VM のバイナリに落とし込む ● VM そのものの実装 ● VM 上の型システム ● 標準ライブラリ ● etc ● …
  • 18.
  • 19.
  • 20.
    PyPy とは ● 動的言語の処理系を作るための汎用フレームワー ク! ● しかもフルスタック ● Python なので書きやすい! ● C みたいにメモリ確保とかめんどくさい部分は PyPy が 引き受けてくれたり ● dict, list みたいなリッチな組み込み型が使えたり ● PyPy の Python インタプリタの中で使い回せるも のは使い回しちゃう
  • 21.
    PyPy がしてくれること ● 言語を作るためのライブラリとか ● EBNF によるパーサ ● dict, list などの Python で使える標準的な型 ● 基本的な型システムとその評価器 (ObjectSpace) ● Python から C ライブラリを使う仕組み ● メモリ管理はもちろん意識しない ● RPython Toolchain ● JIT コンパイラ ● 各種GC
  • 22.
    実装実績(Python 以外) ● Brainf*ck ● Gameboy Emulator ● Grass ● HQ9+ ● Io ● JavaScript ● Ook! ● Prolog ● Scheme ● Smalltalk
  • 23.
  • 24.
    やること ● PyPy ってなに? ● Python で Python を実装するとは ● 高速化のヒミツ ● その他情報まとめ
  • 25.
  • 26.
    速度について ● Python で Python を実装している PyPy ● でも 5 倍くらい速いらしい
  • 27.
  • 28.
    Python で Python実装したって速い わけねーだろ起きろ!
  • 29.
    と思われるかもしれませんが ● 速さにはもちろん理由があります ● RPython Toolchain がキーワード
  • 30.
    RPython Toolchain とは ● RPython という言語を処理するためのツールチェ イン ● FlowGraph, Annotation, RTyper, Optimize な どの工程を経て、様々なバックエンドに出力できる ● バックエンドは C Binary, CLI, Python, LLVM, JVM など ● kwsk はここらへん http://readthedocs.org/docs/pypyja/en/latest/t
  • 31.
    RPython とは ● Restricted Python の略らしい ● Zope の RestrictedPython ではない ● Python をバイナリコンパイルするためにいくつか の制限を設けたもの ● 型システム含む動的な部分を制限し、静的型っぽく なっている ● Python のサブセットなので、 RPython は Python の処理系でそのまま動く
  • 32.
    RPython の制限 ● 変数は一つの型しか扱えない ● 継承関係にあればアップキャストできる ● モジュールグローバル変数はすべて定数として扱われる ● 書き換えようとするとエラー ● for ループは組み込み型のみ ● 動的関数定義や動的クラス定義は無理 ● ジェネレータはサポートしない ● 関数などの型は一つしか推論結果を持てない ● template <typename T> T somefunc(T arg) なんだけど、 実体化できるのは一つ、というイメージ
  • 33.
    RPython の制限 ● 文字列型のメソッドは大体使えるけど使えないのもある ● リストは一つの型しか扱えない ● 辞書なんかも同様 ● 複数の型が入るような場合は、すべての型を含む上限境界の型が推 論結果として使われる ● 最悪 TYPE <: object な推論結果になって、後々エラーになることも ● クラス周り ● 後付のメソッドは不可 ● 単一継承は完全サポート ● 単純な mixin はサポート ● クラスはもちろんファーストクラスオブジェクト
  • 34.
    RPython の制限 ● Python の動的な部分が結構制限されて、静的型 言語っぽくなる ● コンパイル時なら動的に色々できる ● とはいえ Python らしい記述力は十分発揮できる ● 静的型っぽいとはいえ、普通にプログラムを書いて いれば、そんなにおかしな設計をしない限り動的型 言語でも型を意識して静的型っぽくなるでしょう? ● 詳しい仕様はこちら: http://readthedocs.org/docs/pypy/en/latest/co
  • 35.
    RPython Toolchain の工程 ● RPython ● FlowGraph ● Annotation ● Type Annotation ● RTyper ● Optimize (Optional) ● Transform ● Output (C Binary, CLI, LLVM, etc...)
  • 36.
    FlowGraph ● 平たくいえばフローチャート ● RPython から分岐・繰り返し・関数呼び出しなどの 処理の流れを取り出し、データ構造にしたもの ● 後の工程ではこれに対して色々やる
  • 37.
    Type Annotation ● 型アノテーション ● FlowGraph を辿って、型を全部チェックしていく ● みんな大好き型推論 ● 静的解析かも ● 型チェックしてくれてエラーも出してくれるし素敵! ● Erlang の Dializer みたいなやつ? ● この後のセッションで詳しく説明します
  • 38.
    RTyper ● Annotator による型とバックエンドの型システムを 繋ぐもの ● Annotator の High-level な型からバックエンドの Low-level な型に変換する ● signed int とか unsigned int とか ● リストじゃなくて配列とか ● ドキュメントはこちら http://codespeak.net/pypy/dist/pypy/doc/rtype
  • 39.
    RTyper で使われる型システム ● lltypesystem ● C っぽいモデル ● 低レベルな操作に変換される ● メモリ操作とかポインタとか ● C Backend ● LLVM Backend
  • 40.
    RTyper で使われる型システム ● ootypesystem ● High-level な型システムを持つ VM 向け ● CLI ● JVM ● Squeak(?)
  • 41.
    Transform ● Transform ● FlowGraph の構造を弄るイメージ ● Stackless 変換(deprecated) – continulet になりました – http://readthedocs.org/docs/pypyja/en/latest/stackless.h ● CPS 変換とかもできそうじゃない?(適当) ● Lisp のマクロみたいな何か
  • 42.
    Backend ● 色々やってバックエンドにはき出す ● さっき書いたよね
  • 43.
    JIT コンパイラ ● Just in Time Compiler ● 実行時に処理の流れを解析して最適化できるとこ ろを最適化する ● 実装した 処理系から Analyzer にヒントを与えると 最適化してくれる ● 詳しくはこの後
  • 44.
    結局のところ ● RPython Toolchain でバイナリになるから速い ● とはいえ C でガチで書くよりは遅い ● 速いのは JIT があるから ● 後のセッションにご期待下さい! ● 結局型チェックしてバイナリに落とすならそれで動 的言語作らなくてもいいんじゃないの? という方は こちら ● 渋日記: PyPyよりも5倍高速な最速のPython処理系 http://blog.shibu.jp/article/51727956.html
  • 45.
    問題とか ● x86 な Linux 以外の環境だと C-Backend 以外 がコンパイルできなかったりする ● pypy cliバックエンドに完敗 - aodag's posterous – http://aodag.posterous.com/pypy-cli ● jvmバックエンドに完敗 PyPy Advent Calendar 26日 + 1日目(27日目?) - rokujyouhitomaの日記 – http://d.hatena.ne.jp/rokujyouhitoma/20111226/132485 ● PyPy Sudden Death Calendar 27日目 - JVM Backend に完敗した件を受けて - プログラマのネタ帳 – http://d.hatena.ne.jp/shomah4a/20111227/1324997958
  • 46.
    ソースとかデモとか ● 時間があったら… ● https://bitbucket.org/brownan/pypy-tutorial/
  • 47.
    情報まとめ ● 本家ドキュメント ● http://readthedocs.org/docs/pypy/en/latest/ ● pypy-ja が翻訳中のドキュメント ● http://readthedocs.org/docs/pypyja/en/latest/ ● 協力者募集中!
  • 48.
    情報まとめ ● PyPy Tutorial ● PyPy を使って BF という言語を実装するチュートリアル ● 言語実装から JIT のヒント追加まで一通り ● https://bitbucket.org/brownan/pypy-tutorial/ ● 翻訳しました – http://shomah4a.net/pypy-tutorial/
  • 49.
    情報まとめ ● PyPy Advent Calendar 2011 ● PyPyの紹介・翻訳・言語実装・処理系拡張・実装理論 など各種エントリが揃っているのでオススメ ● http://atnd.org/events/22078 ● https://sites.google.com/site/pypyja/pypy-advent-ca
  • 50.
    pypy-ja について ● 闇の軍団らしいよ ● @rokujyouhitoma が総帥 ● pypy-ja まとめサイト ● https://sites.google.com/site/pypyja/ ● Google Groups ● https://groups.google.com/group/pypy-ja ● Bitbucket ● https://bitbucket.org/pypyja ● lingr ● http://lingr.com/room/pypy_ja ● skype ばっかりなのであんまり使われていなかったり…
  • 51.
  • 52.