Contenu connexe
Similaire à 次世代言語 Python による PyPy を使った次世代の処理系開発
Similaire à 次世代言語 Python による PyPy を使った次世代の処理系開発 (20)
次世代言語 Python による PyPy を使った次世代の処理系開発
- 2. お前、誰よ
● しょーま or しょうま
● twitter: @shomah4a
● id:shomah4a
● pypy-ja とか PyCon JP とかやってるみたい
● PyPy を使ってみた切っ掛けは俺言語が作りたかっ
たから
● 仕事? こまけぇこたぁいいんだよ
- 3. やること
● PyPy ってなに?
● Python で Python を実装するとは
● 高速化のヒミツ
● その他情報まとめ
- 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 を実装するとは
● 高速化のヒミツ
● その他情報まとめ
- 17. そもそも何を作るの?
● 言語の処理系に必要なもの全部
● ソースのパース
● VM のバイナリに落とし込む
● VM そのものの実装
● VM 上の型システム
● 標準ライブラリ
● etc
● …
- 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
- 24. やること
● PyPy ってなに?
● Python で Python を実装するとは
● 高速化のヒミツ
● その他情報まとめ
- 26. 速度について
● Python で Python を実装している PyPy
● でも 5 倍くらい速いらしい
- 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
- 41. Transform
● Transform
● FlowGraph の構造を弄るイメージ
● Stackless 変換(deprecated)
– continulet になりました
– http://readthedocs.org/docs/pypyja/en/latest/stackless.h
● CPS 変換とかもできそうじゃない?(適当)
● Lisp のマクロみたいな何か
- 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 ばっかりなのであんまり使われていなかったり…