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

14,282 views

Published on

PyPy の紹介

Published in: Technology

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

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

×