インストール - JavaScirpt (V8, TraceMonkey, SFX)

 

JavaScriptエンジンの 3強(V8, TraceMonkey, SFX)を、インタラクティブシェルとしてビルドします。 ビルド方法へのリンクは次の表にまとめました。

ブラウザ JavaScriptエンジン ビルド方法
Chrome V8 How to Download and Build V8
Firefox TraceMonkey John Resig - TraceMonkey
Safari SFX BuildingQtOnLinux - WebKit

注) SFX: SquirrelFish Extreme は VM の名称であり、JavaScriptエンジン全体の名称は JavaScriptCore とのことです(nanto_vi さんから教えていただきました )。

以下に、Fedora で実際にビルドしたログを掲載します。

V8

V8 のビルド環境を構築
$ sudo yum install scons  ← SCons(makeの代替品。Pythonでルールを記述)をインストール
… 省略 …
Installed: scons.noarch 0:0.98.4-2.fc9
Complete!

V8 のビルドとインストール
$ cd /usr/local/src
                                        ↓ V8 をチェックアウト
$ svn checkout http://v8.googlecode.com/svn/trunk/ v8-read-only
A    v8-read-only/test
A    v8-read-only/test/message
… 省略 …
A    v8-read-only/benchmarks/deltablue.js
A    v8-read-only/benchmarks/v8-logo.png
リビジョン 983 をチェックアウトしました。

$ cd v8-read-only

$ scons d8 console=readline             ← V8 をビルド(行編集機能:有効)
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
… 省略 …
scons: done building targets.

$ sudo install -m 755 d8 /usr/local/bin ← V8(d8) をインストール

V8 の動作確認
$ d8                                    ← V8(d8) を起動
V8 version 0.4.6 [console: readline]
d8> print                               ← printは実装されているか?
function print() { [native code] }      ←   Yes!
d8> print('hello');                     ← printを試してみる
hello                                   ←   OK!
d8> readline                            ← readlineは実装されているか?
(d8):1: ReferenceError: readline is not defined
readline                                ↑   No!
^
d8> [1,2,3,4,5].map(function(x) Math.pow(x,2));  ← 1.8の文法は使えるか?
(d8):1: SyntaxError: Unexpected identifier       ←   No!
[1,2,3,4,5].map(function(x) Math.pow(x,2));
                            ^^^^                 ↓   これなら OK!
d8> [1,2,3,4,5].map(function(x){return Math.pow(x,2)});
1,4,9,16,25
d8> quit();                             ← 終了

TraceMonkey

TraceMonkey のビルド環境を構築
$ sudo yum install hg  ← Mercurial(分散型バージョン管理システム)をインストール
… 省略 …
Installed: mercurial.i386 0:1.0.2-1.fc9
Complete!

TraceMonkey のビルドとインストール
$ cd /usr/local/src
                                        ↓ TraceMonkey のリポジトリを複製
$ hg clone http://hg.mozilla.org/tracemonkey/
destination directory: tracemonkey
requesting all changes
… 省略 …
updating working directory
36466 files updated, 0 files merged, 0 files removed, 0 files unresolved

$ cd tracemonkey/js/src

$ make -f Makefile.ref BUILD_OPT=1      ← TraceMonkey をビルド
cd editline; make -f Makefile.ref all
make[1]: ディレクトリ `/usr/local/src/tracemonkey/js/src/editline' に入ります
… 省略 …
make[1]: ディレクトリ `/usr/local/src/tracemonkey/js/src' から出ます

                                        ↓ TraceMonkey をインストール
$ sudo install -m 755 Linux_All_OPT.OBJ/js /usr/local/bin

TraceMonkey の動作確認
$ js -j  ← TraceMonkey を起動(JITを有効にして)
js> options();                          ← オプションを確認
jit                                     ←   JITが有効になっている
js> print                               ← printは実装されているか?
function print() {                      ←   Yes!
    [native code]
}
js> print('hello');                     ← printを試してみる
hello                                   ←   OK!
js> readline                            ← readlineは実装されているか?
function readline() {                   ←   Yes!
    [native code]
}
js> str = readline();                   ← readlineを試してみる
bye                                     ←   bye と入力
bye
js> str
bye                                     ←   OK!
js> [1,2,3,4,5].map(function(x) Math.pow(x,2));  ← 1.8の文法は使えるか? 
1,4,9,16,25                                      ←   Yes!
js> quit();                             ← 終了

SFX

SFX のビルド環境を構築
$ sudo yum install gperf                ← gperf をインストール
… 省略 …
Installed: gperf.i386 0:3.0.3-4.fc9
Complete!

$ PATH=/usr/lib/qt4/bin:$PATH           ← qmake にパスを通す

SFX のビルドとインストール
$ cd /usr/local/src
                                        ↓ WebKit をチェックアウト(39300の調子が良い)
$ svn checkout -r39300 http://svn.webkit.org/repository/webkit/trunk WebKit
… 省略 …
リビジョン 39300 をチェックアウトしました。

                                        ↓ WebKit をビルド(Qt port on Linux)
$ WebKit/WebKitTools/Scripts/build-webkit --qt
Calling 'qmake CONFIG+=qt-port -r OUTPUT_DIR=/usr/local/src/WebKit/
WebKitBuild/Release /usr/local/src/WebKit/WebKit.pro CONFIG+=release
 CONFIG-=debug' in /usr/local/src/WebKit/WebKitBuild/Release
… 省略 …
===========================================================
 WebKit is now built. To run QtLauncher with this newly-built
 code, use the "WebKit/WebKitTools/Scripts/run-launcher" script.
… 省略 …
===========================================================

                                        ↓ jsc(SFX) をインストール
$ sudo install -m 755 WebKit/WebKitBuild/Release/JavaScriptCore/jsc /usr/local/bin

SFX の動作確認
$ rlwrap jsc  ← 行編集機能を使用したいので、rlwrap 経由で SFX を起動
>                                       ← 【問題】プロンプトの後に改行される 
print                                   ← printは実装されているか?
function print() {                      ←   Yes!
    [native code]
}
> 
print('hello');                         ← printを試してみる
hello
undefined                               ←   NG!(スクリプトならOK)
> 
readline                                ← readlineは実装されているか?
function readline() {                   ←   Yes!
    [native code]
}
> 
str = readline();                       ← readlineを試してみる
bye                                     ←   bye と入力
bye
> 
str
bye                                     ←   OK!
> 
[1,2,3,4,5].map(function(x) Math.pow(x,2));  ← 1.8の文法は使えるか?
Exception: SyntaxError: Parse error          ←   No!
>                                            ↓   これなら OK!
[1,2,3,4,5].map(function(x){return Math.pow(x,2)});
1,4,9,16,25
> 
quit();                                 ← 終了

【おまけ】 WebKit の起動
$ WebKit/WebKitTools/Scripts/run-launcher --qt

覚え書き

  • 今回ビルドしたものが TraceMonkey であることを確認できる決定的な方法はあるだろうか。
  • 今回ビルドしたものが SFX であることを確認できる決定的な方法はあるだろうか。
  • WebKit のビルドにはとても時間がかかる。 SFX だけをビルドする方法はあるだろうか(build-jsc --qt を実行してもビルドが始まらない)。
  • WebKit をチェックアウトする時は、WebKit Nightly Builds のリビジョンを指定すると良いのではないか。

更新履歴

日付 内容
2009-02-03 情報 SFX の print 関数が undefined を出力するのは、インタラクティブシェル上に限った話で、 コマンドラインでスクリプトを実行した場合には期待通りに動作することを確認した。
2008-12-17 追加 注)として、SFX は VM の名称であり、エンジン全体の名称は JavaScriptCore である件
追加 覚え書きに、build-jsc --qt を実行してもビルドが始まらない件
2008-12-16 初版