Shed Skin
リポジトリ | |
---|---|
対応OS | クロスプラットフォーム |
種別 | Python コンパイラ |
ライセンス | GNU General Public License (GPL) |
公式サイト | https://code.google.com/archive/p/shedskin |
Shed Skin は、暗黙的に静的に型付けされたPythonプログラムを最適化されたC++プログラムに変換する実験的なコンパイラである。型についての制約条件を満たすため、プログラムは多くの場合変更する必要があるが、変更した後でも、Python プログラムとしての正しさは保つことができる。Shed Skin は現在のところ Python の標準ライブラリをそれほど使用していない小さなプログラムに限定されている。現在までに変換できた最大のプログラムは 1,600 行である。
Shed Skin では、変数は単一の型のみ持つことができる。すなわち、たとえば a=1; a='1'
といったコードは許容されない。単一の型であれば、抽象型や汎用型 (C++におけるテンプレート)でよく、クラス A とクラス B が共通の基底クラスをもてば a=A(); a=B()
というコードは許容される。
ShedSkin の開発者によって作成されたテストケースでは、Shed Skin は Psyco の psyco.full()
による方法を使って最適化した同一のコードに対して 2-40 倍高速に動作する。しかし、ShedSkin はコンパイル可能ないくつかのプログラムで、CPython よりも著しく低速に動作する(たとえば、CPython でよく最適化されている set や str 型に大きく依存したプログラム)。[1].
Shed Skin によって生成されたコードは Python のランタイムにまったく依存しておらず、ハードウェアの制約がある組み込みシステムでも利用可能である。また Shed Skin はコードの難読化に用いることもできる。C++ コンパイラで生成した機械語はPython のバイトコードよりリバースエンジニアリングが難しいためである。
C++ の型宣言(たとえばint
など)を生成するための型を推測するため、Shed Skin は型推論の技法を用いている。Shed Skin の型推論は Ole Agesen の Cartesian Product Algorithm と John Plevyak の Iterative Class Splitting の技法を組み合わせて用いている。こうした技法はプログラムサイズの増加に対して、これまでのテストで見られた以上に対応することはできない可能性がある。
Shed Skin は Python の一部の機能のみをサポートした組み込みライブラリの C++ 実装を除くと 6,500 行のコードで記述されている。 Shed Skin は Pyrex, Boo, RPython などのプロジェクトに類似した試みである。
Shed Skin の制限
[編集]- プログラムは Python の標準ライブラリを自由に使うことができない。一部の共通のインポートは可能である(lib/*.py を参照)
- 現在のところ、型の解析は数百行以上のコードではうまく動作しない。
- バージョン 0.0.22 の時点で、簡単な拡張モジュールを生成することができるが、カスタムのクラスや、戻り値・引数の再帰的なコピーがサポートされていない。
- 生成されたC++ プログラムはlibstdc++ のほか、libgc (BoehmGC) 、libgcc (GCC)、libpcre (PCRE) 等に依存する。
関連項目
[編集]参考文献
[編集]- ^ Flavio Codeco Coelho (Monday, 6 August 2007). “Set implementation performance”. 2008年8月24日閲覧。