前回に続き、Pythonそのものの講演について紹介したいと思います。今回は、PyPyというPythonで実装されたPythonの講演を紹介します。本カンファレンスに一緒に参加した池さん(@rokujyouhitoma)がPyPyというプロジェクトにとても興味をもたれたという話を受け、以下のPyPyの講演のレポートは池さんに執筆していただきました。Rigo氏が講演されました。大学にてプログラミング言語および言語実装を研究。PyPyプロジェクトのリーダー。CPythonのJITコンパイラであるPsycoの作者。Cuni氏らとPyPyに関する論文を共著。Cuni氏2006年よりPyPyのメインコミッター。CLI/.NET、JITコンパイラの開発者。PyPyの開発・研究により2010年にPhDを取得。pdb++の作者/マネージャ、virtualenvのコントリビュータ。現在はOpenEndに雇われておりPyPyのフルタイム開発者。Rigo氏PyPyって何?最初にPyPyについて紹介します。PyPyプロジェクトは2003年にスタートし、EUなどから支援を受けたOSSプロジェクトです。EUからは2004年12月から2007年3月の期間、資金援助を受けました。PyPyには大きく2つの使命があります。1つ目は動的言語を作成するためのフレームワークとしてのPyPyです。これは言語仕様と実装を明確に分離し、動的言語の共通的な変換のためによりユーザの実装を助けるフレームワークです。Toolchainと呼んでいます。2つ目は、Python実装としてのPyPyです。Toolchainを使って、Python言語準拠の実装を新しく先進的な高レベルの機能を盛り込み、低レベルな変換を行うことなく、柔軟かつ処理速度が高速な実装を目指しています。これらの2つから、PyPyは動的言語の実装のためのJust-in-Timeコンパイラを自動生成することを実現しています。最適化の適用そもそもJITコンパイラを持っているかどうかなど、動的言語実装時における実装決定へのミックス&マッチ手法を可能にします。PyPyはさらにその先の目標を設定しています。伝統的に言語処理系は、C/POSIX、Java、C#ののようなターゲットプラットフォームの言語で書かれてきました。PyPyはアプリケーションと各ターゲット環境間の基本的なマッピングを提供し、.NETフレームワークやJava仮想環境のように言語実装をサポートするための標準化することによって、より高いレベルの機能を提供することが可能になることを目指しています。1.5PyPy1.5は2011年4月30日にリリースされました。1.5ではCPythonの2.6と2.7.1の標準ライブラリを含むすべての機能をサポートしました。PyPyはCPythonと互換性を持った実装処理系です。CPython拡張モジュールのAPIも修正され、様々なライブラリが利用可能になりました。速度は平均して25%程度のパフォーマンスが改善されました。PyPyの今後PyPyは大規模な並列処理のためにマイクロスレッドをサポートしたStacklessバージョンも別にあります。StacklessバージョンとJITコンパイラの統合が現在進行中です。cpyextはCPythonのC-API互換性レイヤーです。現状cpyextはどんな場面でもちゃんと動くというわけではありませんが、wxPython、PIL、cx_Oracle、mysqldb、pycairoなどでは問題なく動きます。さらなるサポート領域を広げるために開発が進行中です。メモリ消費が少ないコンパクトなインスタンス(例えば__slots__など)を調査しており、将来使えるようになる予定です。次のグラフは、CPythonを1.00とした場合のPyPyの速度を表しています。Python処理系の実装としての速度は、ほとんどの処理においてCPythonより速いです。CPython次のグラフは、PyPyのコードがリポジトリにコミットされる度に、Djangoの実行速度が改善されているのを示しています。PyPyは頻繁にコミットが行われており、速度が日増しによくなっています。次のグラフは、先程の表にCPython2.6.3を加え比較出来るようにしたものです。CPython2.6.3よりもDjangoの処理速度が速いのが読み取れます。2.6.2で公開されています。PyPy活用事例PyPyが実際に使われている事例を紹介します。1つ目の事例は、LWNのgitdmです。gitdmはLinuxカーネルの開発者の動向を追うために、gitのログデータを読み込み開発者のつながり、雇用主の特定、パッチコードについてなどの情報をデータマイニングするツールです。gitdmはCPythonでは63秒かかるのに対して、PyPyでは21秒と、より早い結果となりました。2つ目の事例は、MyHDLです。MyHDLはPythonを使ったハードウェア記述するDSL言語と検証言語を提供しているライブラリです。MyHDLのサイトによれば、PyPyインタプリタを使用することによって、シミュレーションプログラムは6?12倍高速に実行されたとのことです。3つ目の事例は、PyPyプロジェクト自体です。PyPyは巨大で複雑なアーキテクチャを持ったソフトウェアです。PyPyのロゴ通り、自分の尾を飲み込み蛇(Ouroboros、ウロボロス)ですね。Ouroboros他にも様々な場面でPyPyが活用されていますが、次の事例は、是非ともみなさんが作って下さい!PyPyを使う価値があるかもしれません。HANDS-ONセッションの内容は次の2つを予定していました。Part1:アプリケーションをPyPyで動かすPart2:PyPyを使用して独自のインタプリタを書くしかし残念ながら、時間の都合上、Part2に達することはできませんでした。HANDS-ONPyPy環境の構築Part1に入る前にPyPyの環境を作りましょう。PyPy1.5を用意します。PyPy.1.5のダウンロードはこちらです。installインストールに関するドキュメントはこちらです。PyPybitbucket.orgのPyPyリポジトリからpypyのパッケージを持ってきてください。release-1.5次に、JITコンパイラのログファイルを解析を助けるツールjitviewerをインストールします。jitviewerは他のパッケージに依存しており、それらのパッケージをインストールするために、distributeをインストールすることを推奨します。distributeのインストールは次の通りです。distribute_setup.pyまた、サードパーティーのライブラリをインストールしたいのであれば、pipをインストールすることをお勧めします。get-pip.pydistributeがインストールされたら、jitviewerをインストールします。developPart1:アプリケーションをPyPyで動かすPart1では、アプリケーションをPyPyで動かしたいユーザ向けに、次のような内容でした。JITコンパイラの概要説明PyPyの試し方JITコンパイラにより生成されたトレースログを表示する方法PyPyのバグとバグフィックスJust-in-TimeコンパイラPyPyのJust-in-Time(JIT)コンパイラについての説明です。JITコンパイラはコード実行時に、最適化されたマシンコードを自動生成するアーキテクチャです。ループの場合、抽象構文木に変換後、値の型、条件分岐を記録し、最適化されたバイトコードを生成します。条件分岐の記録が失敗しますが、その際は、失敗した箇所から再度トレースを開始する仕組みになっています。x86、amd64プロセッサをサポートしており、直にARMをサポート予定です。MozilaプロジェクトのTraceMonkeyによく似たアーキテクチャです。PyPyのPythonインタプリタは高水準言語であるRPythonで書かれています。JITコンパイラジェネレーションを使い、このRPythonのコードからJITコンパイラを自動生成しています。HANDS-ONPyPyを実行するには、次のように簡単に実行できます。program.pyここでCPythonより速い、簡単なコードを実演します。次のcount.pyは5の倍数と5の倍数ではない数字の個数をカウントするコードです。main()PyPyで実行してみます。secsPython2.7で実行してみます。secsPython2.7よりもPyPyの処理速度が速い結果となりました。次に、JITコンパイラのログを取ってみましょう。JITコンパイラのログは次の通り、環境変数PYPYLOGを設定する事によって出力できます。10000000その結果、logファイルが生成されます。jitviewerはPyPyのJITコンパイラが生成するログファイルの分析ツールです。実際にjitviewerを起動してみます。logjitviewerが起動したらhttp://localhost:5000/へウェブブラウザでアクセスします。リンクをクリックすると展開され、Pythonバイトコード命令が表示されます。Instructionsを確認下さい。HANDS-ONセッションではPyPyのバグフィックスのハンズオンがありました。実際のバグの事例は次の通りです。html_fibo.py(フィボナッチ数を計算しHTMLを生成するプログラム)このプログラムをCPythonで実行しますこのプログラムをPyPyで実行します結果はCPythonとPyPyの挙動が異なり、PyPyのバグフィックスをします!実際にCPythonでhtml_fibo.pyを実行してみましょう。<li>144</li></ul>PyPyでhtml_fibo.pyを実行すると、何も表示されません。参加者は、講師とともにこのバグフィックスに挑戦しましたが、結果的には誰もバグフィックスに至りませんでした。Toolchainを持っています。Part2では、独自のプログラミング言語を実装する人、JITコンパイラの内部動作を詳しく知りたい人向けのパートを予定していました。時間の都合上、実際には行われませんでした(筆者は心から落胆しましたが、内容がハード過ぎます。仕方ないですね⁠)⁠。Toolchainを使った動的言語の実装が紹介されています。Toolchainを使って、独自の動的言語を作成したいのであれば、次の資料を参考するのがよいでしょう。HANDS-ONは終わりです。HANDS-ONで公開されています。Frameworkに出る予定でした。Frameworkの皆さんごめんなさい。PyPyの皆さん急にごめんなさい⁠)⁠。PyPyのSPRINTSでは、周りのエンジニアは次のことをしていました。issuesのバグフィックス(FreeBSDでのコンパイル失敗の原因調査、PyPyでのctypesのバグトレース)はじめてPyPyの開発に参加するエンジニアが、シニアエンジニアからレクチャーを受ける筆者は、SPRINTSの前日から開発ドキュメントの翻訳を始めました。翻訳を始めた理由をあげます。言語処理系の知識(言語処理系全般の基礎知識や、JITコンパイラについて)を有していないため、言語処理系の理解を深める英語が苦手であり、SPRINTSでいきなり会話するのは厳しい。ドキュメント翻訳は英語に慣れる素晴らしい環境(英語重要)日本語翻訳ドキュメントがなく、日本人エンジニアには敷居が高いので敷居を下げる(英語超重要)最大の理由は、開発者ドキュメントが整備されており、読まずにいきなりコードを修正する自信が筆者にはありません。PyPyの実装に取り掛かりたいのが本音です。Rigo氏がおられたので、急遽作った資料でプレゼンテーションを行い、次のことを宣言してきました。日本で協力者を募りPyPyの開発者ドキュメントを日本語翻訳する。Groupsにpypy-jaというメーリングリストを作ります!(筆者個人として、コード読んでコミッターになるべく頑張るね!そして、また会いましょう!)そして、最後に日本のPythonistaを代弁し次のことを伝えました。日本のPythonistaはあなた方を追いかけます!宣言してしまったからには仕方ありませんね。日本のPythonistaとして一丸となって一緒に頑張って行きましょう。いうわけで、筆者は、協力者を募集しています。翻訳は始まったばかりで入りやすいのではないでしょうか?筆者もわからない事だらけです。筆者は日本のPythonistaが翻訳に興味があるのを知っています。JPの翻訳に関するPython界隈の翻訳プロジェクトにおいてQ.翻訳プロジェクトで協力者を募集していたら参加しますか?という設問に、日本のPythonistaが11%の方が翻訳に参加する、58%の方が興味のある技術なら参加するとアンケートに答えたことを決して忘れません。さんのPyPyの講演等に関するレポートです。PyPyに興味をもった人がいましたら是非、池さんに声をかけてみてください。次回は、アプリケーションに関する講演について紹介したいと思います。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します⁠。個別にライセンスが設定されている記事等はそのライセンスに従います。