その爆速っぷりで巷を震撼させた「Google Chrome」のJavaScript Engine「v8」。その「v8」をなんとサーバサイドに実装させてしまう「v8cgi」に挑戦。
まず、システム要件は、
- Linux (Intel or ARM-based).
- Windows XP SP2 or later, or Windows Vista.
- Mac OS X 10.5 (Leopard).
とのことだが、今回はFedora12 32bit版で挑戦する。
以下はそれを前提に進める。
「v8」及び「v8cgi」をビルドするためのツールを準備する。
- Subversion 1.4以上
- Python 2.4以上
- SCons 1.0.0以上
幸いこの辺のツールは、Fedoraでrpmが準備されているので、入ってないものだけ、yumでサクッとかたづける。
# yum install subversion
# yum install python
# yum install scons
他にもコンパイラとして、
- Linux、MacOSXの場合、GCC 4.x.x
- Windowsの場合、Visual Studio 2005、Visual Studio 2008、またはVisual C++ 2008 Express Edition
「v8cgi」には「v8」も同梱されているので、一緒にダウンロードできる。
今回も/usr/local/srcで展開する。
# cd /usr/local/src
# mkdir v8
# cd v8
# wget http://v8cgi.googlecode.com/files/v8cgi-0.8.0-src.tar.gz
# tar xzvf v8cgi-0.8.0-src.tar.gz
では早速「v8」をビルド。
したいところだが、そこはすんなり行ってくれない。いきなり環境変数の設定などでハマる。
そこで、おまじないしてからビルドする。
# cd v8cgi-0.8.0-src
# export GCC_VERSION=44
# vi SConstruct
(GCC_EXTRA_CCFLAGS = ['-fno-tree-vrp']
を
GCC_EXTRA_CCFLAGS = ['-fno-tree-vrp', '-fno-strict-aliasing']
に書き換える)
# scons library=shared
(「libv8.so」ができてるはず)
# cp libv8.so /usr/lib
これで「v8」のshared libraryはOK。
次に「v8cgi」をビルド。
ところがここでもいろいろ失敗。mysqlとsqliteがうまくいかない。
今回は動かすとこまでが目的なので、あとの宿題としておく。
あと、いろいろ便利なライブラリは、/opt/v8cgi/libに準備する。
# cd ../v8cgi
# scons reuse_context=1 mysql=0 sqlite=0 apache_path=/usr/include/httpd apr_path=/usr/include/apr-1
(mod_v8cgi.soとv8cgiができてるはず)
# cp mod_v8cgi.so /etc/httpd/modules/mod_v8cgi.so
# cp v8cgi.conf.posix /etc/v8cgi.conf
# mkdir /opt/v8cgi
# cp -r lib /opt/v8cgi
# vi /etc/v8cgi.conf
(require.paths.push("/opt/v8cgi/lib")にする。)
次にApacheの設定。あーめんどくさい。
httpd.confに
LoadModule v8cgi_module modules/mod_v8cgi.so
AddHandler v8cgi-script .sjs .jst
を追加。
これでApacheを再起動すれば、拡張子「.sjs」と「.jst」でサーバサイドでv8を利用したJavaScriptエンジンが利用できる。
「v8cgi」を展開したディレクトリのexample/htdocsにサンプルがあるので、
適当に突っ込んで動かそうとすると動かない。ちなみにindex.sjsの中身は、
printbr('Server-side JS with mod_v8cgi in action!');
printbr('<a href="test.jst">See Jst template based pages in action</a>');
printbr('<a href="testjst.sjs">See Jst templates in pages in action</a>');
printbr('<a href="errortest.sjs">See compilation error page</a>');<br />printbr('<a href="errortest2.sjs">See runtime error page</a>');
こんな感じ、「printbrが未定義だ」みたいなエラーで怒られる。
1行目に
require('requestHandler');
をぶっこめば動く。「#!」ではじまるシェバングなどは不要。testjst.sjsも同様。
ただ、公式のwikiによると、requestHandlerは近い将来に削除されるらしく、「response.write()」の利用が推奨されている。
また、test.jstという<% ~ %>でJavascriptが埋め込まれたPHPライクなサンプルもあるが、それは動かない。
これまた公式のwikiで質問があがっていたが、回答は、
「v8cgiはPHPじゃねぇ。response.write()とJSTモジュール使え。」とのこと。
え?逆ギレっすか?
testjst.sjsとtest.tplで同様の事はできるけど…。
サンプルやらhttpd.confの設定の中にあるってことは、古い仕様なのか将来実装されるのか、それはわからない。
で、さっそく以前の「フィボナッチでベンチマーク
」と同じロジックを動かしてみたが、4秒程度で完了。
うをおおおおお!爆速!!!















Comments