v8のビルド方法とTraceMonkeyとの比較など

gcc-4.3では"Explicit template specialization cannot have a storage class"エラーが出るので、

CXX=g++-4.2 scons

でビルドできる

$ svn co http://v8.googlecode.com/svn/trunk/ v8
$ cd v8
$ CXX=g++-4.2 scons sample=shell
$ cd ..
$ cp v8/shell .

おまけ: TraceMonkeyのjsのビルド

やり方は以前のSpiderMonkeyと同じ。Mercurialはサブディレクトリだけを引っ張ることはできないので、hg cloneは時間がかかるけど。

$ hg clone http://hg.mozilla.org/tracemonkey
$ cd tracemonkey/js/src
$ make -f Makefile.ref BUILD_OPT=1 ENABLE_JIT=1
$ cd ../../
$ cp tracemonkey/js/src/Linux_All_OPT.OBJ/js .

ソース内にv8ディレクトリある。。。ベンチマークスクリプトっぽい。

双方、動かしてみた。

ベンチマーク比較

$ ../Linux_All_OPT.OBJ/js run.js #tracemonkey
Richards: 152
DeltaBlue: 170
Crypto: 163
RayTrace: 202
EarleyBoyer: 370
----
Score: 199
$ ../shell run.js # v8
Richards: 2484
DeltaBlue: 2330
Crypto: 1602
RayTrace: 1419
EarleyBoyer: 2688
----
Score: 2040

うーむ。この桁の違いは。。。

参考: spidermonkey js-1.7

$ js -v
JavaScript-C 1.7.0 2007-10-03
usage: js [-PswWxCi] [-b branchlimit] [-c stackchunksize] [-v version] [-f scriptfile] [-e script] [-S maxstacksize] [scriptfile] [scriptarg...]
$ js run.js
Richards: 116
DeltaBlue: 117
Crypto: 122
RayTrace: 137
EarleyBoyer: 133
----
Score: 125

rhino 1.7

$ rhino
Rhino 1.7 release 1 2008 07 31
>
$ rhino run.js    
Richards: 7
DeltaBlue: 111
Crypto: 151
RayTrace: 304
EarleyBoyer: 314
----
Score: 101

javascript-1.8の for in

tracemonkey版jsは1.8.0らしい。テストによれば、1.8ではgeneratorでfor inループが使えるっぽい。

$ ./js -v
JavaScript-C 1.8.0 pre-release 1 2007-10-03
usage: js [-zKPswWxCi] [-b branchlimit] [-c stackchunksize] [-o option] [-v version] [-f scriptfile] [-e script] [-S maxstacksize] [scriptfile] [scriptarg...]

firefox3と一緒?最新版じゃなかったか


for-inの例

a = [1,2,3,4,5];
for (let i in a) { 
  print(i + ": " + a[i]); 
}

結果

0: 1
1: 2
2: 3
3: 4
4: 5

こうかける

a = [1,2,3,4,5];
for (let [k,v] in Iterator(a)) {
  print(k + " : " + v);
}

一般のgeneratorも使える

gf = function () {
  for (let i = 0; i < 5; i += 1) {
    yield i * 100;
  }
};

for (let i in gf()) {
  print(i);
}

結果

0
100
200
300
400