ラクダと猿: SpiderMonkeyでjavascriptをperlに組込む


長いブログを書くことで有名なグーグルのαブロガーSteve Yeggeのポストを読んで、
ブラウザの外で動かすjavascriptに関心が湧いた。よく見てみると、javascriptという
言語自体はそう悪いものではない。インストールベースで考えると、史上最高の言語に
間違いない。なぜなら、ブラウザーの殆どがインタープリタなのだから。そうすると、
javascriptをに触れたことのある人は{perl|php|python|ruby}プログラマ
数を多きく上回るはず。

Yegge氏が押すサーバサイドのjavascript
rhino project
だが、javaのランタイムをインストールする気にもならない。FreeBSD
ports内を探してみると、mozillaの内部に使われているjavascriptのランタイムがライブラリとして
提供されているではないか。その名はspidermonkey

インストール
$ cd /usr/ports/lang/spidermonkey; sudo make install

インタプリタが「js」という簡潔な名でコマンド化されている。

$ js
js> function foo() { print("hi there") }
js> foo();
hi there
js> ^D

ネイティブインターフェースもかなりわかりやすい。これは好感が持てる。
更に調べてみると、perlspidermonkeyを組込むモジュールがある。

インストール (FreeBSD5.3 & 6.2-RELEASEでテスト済み)

$ cd /usr/ports/lang/p5-JavaScript-SpiderMonkey/; sudo make install

インストールは無事に済んだが、テストプログラムを走らせるとリンクエラーが:
/libexec/ld-elf.so.1: /usr/local/lib/libnspr4.so.1: Undefined symbol "pthread_condattr_init"

おかしい。pthreadのライブラリはインストールされているのに、、
よく見ると、Makefileのリンクフラッグから「-lpthread」が抜けている。
この パッチ を当て直すして再トライ。

$ cd /usr/ports/lang/p5-JavaScript-SpiderMonkey/
$ sudo make
$ cd work/JavaScript-SpiderMonkey-0.16/
# パッチする。
$ patch JavaScript-SpiderMonkey.Makefile.PL.patch
# -lpthread あるかな?
$ grep pthread Makefile.PL
["-L$JS_LIB_DIR -l$JS_LIB_NAME -lpthread"], # e.g., '-lm'
# よし。再メイク。
$ make clean
$ perl Makefile.PL
$ make
$ make test
$ cd ../..
# 再インストール
$ sudo make deinstall
$ sudo make install

早速、SpiderMonkeyhello world

==== spidermonkey.pl
#!/usr/local/bin/perl -w
use strict;
use JavaScript::SpiderMonkey;

my $js = JavaScript::SpiderMonkey->new();
$js->init();
# javascriptからperlの関数を呼出せるようにする
$js->function_set("print_to_perl", sub { print "@_\n"; });
# javascriptはこのように走らせる。
my $rc = $js->eval(q! print_to_perl("hi there"); !);
# あと片付け。
$js->destroy();

spidermonkeyportsから重要なドキュメントが漏れている。
このようにインストールしておこう。一読の価値あり。
sudo cp /usr/local/share/doc/js/README.html /usr/ports/lang/spidermonkey/work/js/src/README.html

Rhinoのように本格的なjavascript環境があるのに何故、perl内にjavascriptを埋め込むようなことするのか?
と聞かれたら答えようがない。ただ思い付いたからやる。出来るからやる。それだけだ。ハッキングにまともな理由は必要ない。