次世代言語 python による pypy を使った次世代の処理系開発
DESCRIPTION
PyPy の紹介TRANSCRIPT
次世代言語 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/extending.html
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.html
● 細かな違いはここら辺(翻訳途中)
● http://readthedocs.org/docs/pypyja/en/latest/cpython_differences.html
ここまでコピペ
● ここらへんからコピペしました● PyPy 紹介● http://www.slideshare.net/ShomaHosaka/pypy-10114795● 受付のお姉さんの感想は「フォントが可愛い」でした
● こっから先も大体コピペです
その他の資料
● PyPy Advent Calendar 5日目 - PyPyとCPythonの違いを知ろう - Ehrenの日記● http://d.hatena.ne.jp/Ehren/20111205/1323078809
● PyPy Advent Calendar 2011 6日目 Frequently Asked Questions - YAMAGUCHI::weblog● http://d.hatena.ne.jp/ymotongpoo/20111206/1323163518
やること
● 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/translation.html
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/coding-guide.html#id1
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/rtyper.html
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.html
● 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/1324859357
● 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-calendar-2011
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 が代表総帥なので掛けあってみてください
ご清聴ありがとうございました