Shed Skinは、
Pythonプログラムを静的に型付けされた
C++プログラムに変換する実験的な
コンパイラです。このツールは、特に型に関する制約を満たすために、元のプログラムのいくつかの部分を修正する必要があるものの、修正後でも元の
Pythonプログラムの正しさを維持します。現在、Shed Skinは主に
Pythonの標準ライブラリをほとんど使用しない、小規模なプログラム向けに設計されています。これまでに、最大1,600行のコードを変換できることが確認されています。
型の制約
Shed Skinの特徴的な点は、変数が単一の型のみを持たなければならないことです。例えば、`a=1`の後に`a='1'`のような型の変更は許されません。ただし、単一の型であれば、
抽象型や汎用型(
C++のテンプレートに相当)は許可されており、同じ基底クラスを持つ異なるクラスのインスタンスを扱うことは可能です。
性能について
Shed Skinを利用したプログラムは、最適化された同一コードに対して、
Psycoの`psyco.full()`を使用した場合よりも2倍から40倍の速度向上が見込まれます。しかし、Shed Skinは特定のプログラムにおいて、
CPythonの方が大幅に優れていることがあります。特に
CPythonでは、`set`や`str`型に関する最適化が充実しているため、これらに強く依存するプログラムではShed Skinのパフォーマンスが劣ります。
ランタイム依存性
Shed Skinにより生成された
C++コードは、
Pythonのランタイムに一切依存しておらず、ハードウェア制約があるような組み込みシステムでも動作可能です。また、生成されたコードは難読化に利用されることもあり、
C++コンパイラが生成する機械語は
Pythonの
バイトコードよりもリバースエンジニアリングが難しいため、セキュリティ強化にも役立ちます。
型推論の仕組み
C++の型宣言(例: `int`など)を生成するため、Shed Skinは型推論の技術を取り入れています。具体的には、Ole AgesenのCartesian Product AlgorithmとJohn PlevyakのIterative Class Splittingを組み合わせた手法を使用しており、一定の限界を持ちながらも、プログラムサイズが増加した際の型解析に挑んでいます。
開発の現状
Shed Skinは、6,500行のコードで記述されています。そのほとんどは、
Pythonの一部の機能をサポートした簡易な組み込みライブラリの
C++実装を除いています。これは
Pyrex、Boo、R
Pythonなどの先行プロジェクトに似たアプローチです。
制限事項
Shed Skinの利用にはいくつかの制限があります。まず、
Pythonの標準ライブラリの利用が制限されており、一部の一般的なインポートのみが可能です(詳細はlib/*.pyを参照)。また、型解析が数百行以上のプログラムでうまく機能しないことが報告されています。バージョン0.0.22ではまだ簡単な拡張モジュールの生成は可能ですが、カスタムクラスや戻り値・引数の再帰的コピーはサポートされていません。
生成される
C++プログラムは、libstdc++に加えてlibgc(BoehmGC)、libgcc(GCC)、libpcre(PCRE)などに依存します。
参考リンク
このように、Shed Skinは
Pythonから
C++への変換を目指す試みの一つとして、特定の要件と制約を持ちながら活用されているプロジェクトです。