52
次世代言語 Python による PyPy を使った 次世代の処理系開発 第八回ありえるえりあ勉強会 2012/01/20 しょーま @shomah4a

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

  • Upload
    shoma-h

  • View
    11.970

  • Download
    3

Embed Size (px)

DESCRIPTION

PyPy の紹介

Citation preview

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

次世代言語 Python による

PyPy を使った次世代の処理系開発

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

しょーま@shomah4a

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

お前、誰よ

● しょーま or しょうま● twitter: @shomah4a● id:shomah4a

● pypy-ja とか PyCon JP とかやってるみたい● PyPy を使ってみた切っ掛けは俺言語が作りたかっ

たから● 仕事? こまけぇこたぁいいんだよ

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

やること

● PyPy ってなに?● Python で Python を実装するとは● 高速化のヒミツ● その他情報まとめ

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

PyPy って何?

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

twitter で見かけた説明によると

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

https://twitter.com/nati/status/121825143285747713

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

一部不適切な表現がありましたがお詫びするのも面倒だしする気もないので

次へ

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

PyPy とは

● http://pypy.org/● Python で作られた Python のインタプリタ

● 一般的にはこっち● 今日は説明だけ

● Python を作るために Python で作られた動的言語作成フレームワーク● 今日はこっちがメイン

● メインコミッターは Armin Rigo 氏

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

PyPy とは

● 前身は Psyco (さいこ)● http://psyco.sourceforge.net/

● Python に JIT を追加するモジュール

● こちらも Armin Rigo 氏がメインコミッター

● x86 しか使えない

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

Python インタプリタ

● Python で作られた Python の処理系● 速いよ!

● JIT が載っていてすごく速い● CPython の五倍くらいらしい● ベンチマークについてはここらへんに kwsk 載っている

ので参照 http://speed.pypy.org/● 高速化を…強いられているんだ!

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

互換性とか

● 現在は Python 2.7.1 互換の処理系● 開発としては 3.x 対応を進めている● 3.x 対応に向けた開発のための資金出資者募集中!!

● C 拡張もそれなりに使えるけど、まだまだ● ctypes を実装することで読めるようになっているとか● http://readthedocs.org/docs/pypy/en/latest/extending.html

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

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

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

ここまでコピペ

● ここらへんからコピペしました● PyPy 紹介● http://www.slideshare.net/ShomaHosaka/pypy-10114795● 受付のお姉さんの感想は「フォントが可愛い」でした

● こっから先も大体コピペです

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

その他の資料

● 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

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

やること

● PyPy ってなに?● Python で Python を実装するとは● 高速化のヒミツ● その他情報まとめ

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

Python で Python を実装するとは

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

そもそも何を作るの?

● 言語の処理系に必要なもの全部● ソースのパース● VM のバイナリに落とし込む● VM そのものの実装● VM 上の型システム● 標準ライブラリ● etc● …

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

はい! めんどくせーって思った人!

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

PyPy はそんなあなたをサポートします

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

PyPy とは

● 動的言語の処理系を作るための汎用フレームワーク!

● しかもフルスタック● Python なので書きやすい!

● C みたいにメモリ確保とかめんどくさい部分は PyPy が引き受けてくれたり

● dict, list みたいなリッチな組み込み型が使えたり

● PyPy の Python インタプリタの中で使い回せるものは使い回しちゃう

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

PyPy がしてくれること

● 言語を作るためのライブラリとか● EBNF によるパーサ● dict, list などの Python で使える標準的な型● 基本的な型システムとその評価器 (ObjectSpace)● Python から C ライブラリを使う仕組み

● メモリ管理はもちろん意識しない● RPython Toolchain

● JIT コンパイラ● 各種GC

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

実装実績(Python 以外)

● Brainf*ck

● Gameboy Emulator

● Grass

● HQ9+

● Io

● JavaScript

● Ook!

● Prolog

● Scheme

● Smalltalk

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

でも、遅いんでしょう?

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

やること

● PyPy ってなに?● Python で Python を実装するとは● 高速化のヒミツ● その他情報まとめ

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

高速化のヒミツ

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

速度について

● Python で Python を実装している PyPy● でも 5 倍くらい速いらしい

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

何言ってんだこいつ

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

Python で Python 実装したって速いわけねーだろ起きろ!

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

と思われるかもしれませんが

● 速さにはもちろん理由があります● RPython Toolchain がキーワード

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

RPython Toolchain とは

● RPython という言語を処理するためのツールチェイン

● FlowGraph, Annotation, RTyper, Optimize などの工程を経て、様々なバックエンドに出力できる

● バックエンドは C Binary, CLI, Python, LLVM, JVM など

● kwsk はここらへん http://readthedocs.org/docs/pypyja/en/latest/translation.html

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

RPython とは

● Restricted Python の略らしい● Zope の RestrictedPython ではない● Python をバイナリコンパイルするためにいくつか

の制限を設けたもの● 型システム含む動的な部分を制限し、静的型っぽく

なっている● Python のサブセットなので、 RPython は Python

の処理系でそのまま動く

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

RPython の制限

● 変数は一つの型しか扱えない● 継承関係にあればアップキャストできる

● モジュールグローバル変数はすべて定数として扱われる● 書き換えようとするとエラー

● for ループは組み込み型のみ● 動的関数定義や動的クラス定義は無理● ジェネレータはサポートしない● 関数などの型は一つしか推論結果を持てない

● template <typename T> T somefunc(T arg) なんだけど、実体化できるのは一つ、というイメージ

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

RPython の制限

● 文字列型のメソッドは大体使えるけど使えないのもある

● リストは一つの型しか扱えない● 辞書なんかも同様● 複数の型が入るような場合は、すべての型を含む上限境界の型が推論結果として使われる

● 最悪 TYPE <: object な推論結果になって、後々エラーになることも

● クラス周り● 後付のメソッドは不可● 単一継承は完全サポート● 単純な mixin はサポート● クラスはもちろんファーストクラスオブジェクト

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

RPython の制限

● Python の動的な部分が結構制限されて、静的型言語っぽくなる● コンパイル時なら動的に色々できる

● とはいえ Python らしい記述力は十分発揮できる● 静的型っぽいとはいえ、普通にプログラムを書いて

いれば、そんなにおかしな設計をしない限り動的型言語でも型を意識して静的型っぽくなるでしょう?

● 詳しい仕様はこちら: http://readthedocs.org/docs/pypy/en/latest/coding-guide.html#id1

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

RPython Toolchain の工程

● RPython● FlowGraph● Annotation

● Type Annotation● RTyper● Optimize (Optional)● Transform

● Output (C Binary, CLI, LLVM, etc...)

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

FlowGraph

● 平たくいえばフローチャート● RPython から分岐・繰り返し・関数呼び出しなどの

処理の流れを取り出し、データ構造にしたもの● 後の工程ではこれに対して色々やる

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

Type Annotation

● 型アノテーション● FlowGraph を辿って、型を全部チェックしていく

● みんな大好き型推論● 静的解析かも

● 型チェックしてくれてエラーも出してくれるし素敵!● Erlang の Dializer みたいなやつ?● この後のセッションで詳しく説明します

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

RTyper

● Annotator による型とバックエンドの型システムを繋ぐもの

● Annotator の High-level な型からバックエンドの Low-level な型に変換する

● signed int とか unsigned int とか● リストじゃなくて配列とか● ドキュメントはこちら

http://codespeak.net/pypy/dist/pypy/doc/rtyper.html

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

RTyper で使われる型システム

● lltypesystem● C っぽいモデル● 低レベルな操作に変換される● メモリ操作とかポインタとか● C Backend● LLVM Backend

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

RTyper で使われる型システム

● ootypesystem● High-level な型システムを持つ VM 向け● CLI● JVM● Squeak(?)

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

Transform

● Transform● FlowGraph の構造を弄るイメージ● Stackless 変換(deprecated)

– continulet になりました– http://readthedocs.org/docs/pypyja/en/latest/stackless.html

● CPS 変換とかもできそうじゃない?(適当)● Lisp のマクロみたいな何か

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

Backend

● 色々やってバックエンドにはき出す● さっき書いたよね

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

JIT コンパイラ

● Just in Time Compiler● 実行時に処理の流れを解析して最適化できるとこ

ろを最適化する● 実装した 処理系から Analyzer にヒントを与えると最適化してくれる

● 詳しくはこの後

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

結局のところ

● RPython Toolchain でバイナリになるから速い● とはいえ C でガチで書くよりは遅い● 速いのは JIT があるから

● 後のセッションにご期待下さい!

● 結局型チェックしてバイナリに落とすならそれで動的言語作らなくてもいいんじゃないの? という方はこちら● 渋日記: PyPyよりも5倍高速な最速のPython処理系

http://blog.shibu.jp/article/51727956.html

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

問題とか

● 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

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

ソースとかデモとか

● 時間があったら…● https://bitbucket.org/brownan/pypy-tutorial/

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

情報まとめ

● 本家ドキュメント● http://readthedocs.org/docs/pypy/en/latest/

● pypy-ja が翻訳中のドキュメント● http://readthedocs.org/docs/pypyja/en/latest/● 協力者募集中!

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

情報まとめ

● PyPy Tutorial● PyPy を使って BF という言語を実装するチュートリアル● 言語実装から JIT のヒント追加まで一通り● https://bitbucket.org/brownan/pypy-tutorial/● 翻訳しました

– http://shomah4a.net/pypy-tutorial/

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

情報まとめ

● PyPy Advent Calendar 2011● PyPyの紹介・翻訳・言語実装・処理系拡張・実装理論

など各種エントリが揃っているのでオススメ● http://atnd.org/events/22078● https://sites.google.com/site/pypyja/pypy-advent-calendar-2011

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

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 ばっかりなのであんまり使われていなかったり…

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

pypy-ja は皆様の参加をお待ちしております!

興味のある方は多分会場にいるであろう @rokujyouhitoma が代表総帥なので掛けあってみてください

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

ご清聴ありがとうございました