今週行っていた、リファレンスの実装が完了して、Perl側から数値や複素数を渡して値を更新できるようになった。これで、ポインタを受け取る関数のC言語のバインディングがとてもやりやすくなる。
現時点で必要な機能は、残り3つ。この三つを実装した後は、パフォーマンスの評価と実際の使用でうまく動くかということを、試していく。
ループ展開
ループ展開は、ループアンローリングともいう。次に実装するのは、ループ展開。
どうやって実装しようかと考えていたのだけれど、自前実装ではなくって、forループの最適化を、gccに任せることができるように、C言語ソースコードを出力するという方向性で行こうと考えている。
具体的には、現状はC言語ソースコードを出力したときに、ループは、gotoのジャンプで行っているのだけれど、これを一定の条件のときに、for文を使って書き直すというもの。
for文を残しておくと、gccがC言語を解析する時点で、for文の情報を利用できるので、これによって、最適化をしてもらおうという考え。
ビルドツール
SPVMのモジュールをCPANに簡単にリリースできるようなビルド機能を付ける。MinillaやModule::StarterのようなCPANモジュール配布を簡単に行えるようなツールを作る。
SPVMモジュールはプリコンパイルできて、共有ライブラリの形にできる。これは、XSの仕組みと同じで、XSで書いたモジュールを共有ライブラリにするのと方式は同じ。違うところは、XSはC言語+XSのAPIで書くけれど、SPVMを使うと、ほぼPerlの文法で書けるということ。
ネイティブのバインディングも簡単に書けるようにする。
AOTコンパイル
AOTコンパイルというのは、事前コンパイルのことです。バーチャルマシンというのは、通常は、バイトコードを生成して、バイトコードをバーチャルマシンで実行するという動きをします。
でも、これだと、環境にバーチャルマシンが存在していなければ、プログラムが動きません。
単独で、プログラムが動くためには、バイトコードとバーチャルマシンを合わせたプログラムを、コンパイルして実行ファイルにする必要がある。
AOTでうれしいことは、Windows、android、iphone上で動く、ネイティブで動くアプリが作成できるということ。
androidはJavaなので、かなり仕組みは違うから、はっきりとはいえないけれど、Windowsとiphoneは動くはず。Windowsでは、Win32 APIというC言語のAPIを使って、Windowsアプリを作れるし、iphoneでも、Objective-CのAPIを使えば、大丈夫。
実際、Perl MotionというPerlの文法でiphoneを動かせるプロジェクトもあった。
僕は、SPVMで、簡単なWindowsアプリをリリースするところまで挑戦しようと思う。androidとiphoneは、興味がある人がいれば、挑戦しておくれ。