PerlをC変換し、高速化できないか?
最近、今まで見てなかったperl.comのarticleを漁ってるんですが、perl.com: Why Not Translate Perl to C?が興味深かったので簡単に翻訳。
内容はタイトル通り、PerlからCへ変換すれば高速化できそうなのに、何故しないのか、というもの。
- 組み込み関数は既にC化されているので、これ以上手を加える必要は無い
- split,join等。
- 柔軟なデータ構造をCに置き換えてかつ高速化するのは難しい
- ある変数のデータを一つの変数が参照しているだけなら、そのデータの更新処理をCでの置き換えも簡単。
- ある変数のデータを二つ以上の変数が参照している場合は、全ての変数から更新された(orする)データが参照できないとだめなので、実データへの参照が一段はさまれる(Scalar Value = SV、Dump等で出てくるアレはこれのことか)。
- これを"double-indirection"と呼ぶ
- このため、perlでの変数のポインタ取得には、Cと比べて少なくとも2倍のコスト
- double-indirectionは柔軟なデータ構造を表現するために必要(.=を使用しないなどの制限を加えれば高速化可能だが、それはもはやCだ)
- これこそがperlが遅い理由
結論としては、Cに変換できなくはないがperlの自由度を表現するには、現状ではそれほど速くならない、ということみたいです。
上記リストだと、特にデータ構造のほうはわかりにくいし、原文には図入りで解説してあるので、是非原文を参照してみてください。
perl6ではこの辺りの高速化も考えているようで、Cで以下のようなデータ
int a[1000];
をperl6の構文で以下のように
my int @a is dim(1000);
と書くことで高速な(というか普通の)C配列に変換できるような仕組みを考えているようです。
確かにperl6でこの仕組みが導入されるなら高速化作業は楽になりそうですが、perlの自由度が制限されることを考えると、id:higeponさんのひげぽん OSとか作っちゃうかMona- - XS利用でPerl高速化 その2でも指摘されているように、perl6でもある程度枯れた処理に適用するべきでしょうね。