Spidermonkey build and test
1.how to build.
去哪下?如果你不是高手,还是去下载发行版吧:
http://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz
tar xzf js- 1.7.0 .tar.gz
如果你是个高手,可以去下载cvs版本,这里不讨论。
生成:
cd mozilla/js/src
make -f Makefile.ref
默认是debug版本,如果要优化版本,添加BUILD_OPT=1到make命令行。
在linux下,编译后,在Linux_All_DBG.OBJ文件夹下生成了js可执行程序,进入,./js就可以看到js shell的提示符了。
2.use the shell.
内容不少,shell能方便我们测试javascript的功能,敲入help();可以得到一个命令简介列表。细节就不介绍了,参见:
http://developer.mozilla.org/en/docs/Introduction_to_the_JavaScript_shell
不过得强调一下,如果你想研究脚本解释引擎的内部工作的话,在阅读代码前,不妨先使用shell看看。尤其是dis([function])和dissrc([function])这些函数(这些函数只能在调试版本中使用)。这可以得到反汇编字节码内容哦,可以一窥内部的执行原理。
比如:
function test() {
var i = 3;
print(i+2);
}
在shell中运行dis(test);得到:
main:
00000: uint16 3
00003: setvar 0
00006: pop
00007: name "print"
00010: pushobj
00011: getvar 0
00014: uint16 2
00017: add
00018: call 1
00021: pop
00022: stop
Source notes:
0: 0 [0] newline
1: 3 [3] decl offset 0
2: 7 [ 4] newline
3: 18 [11] xdelta
4: 18 [ 0] pcbase offset 11
多试一下!
又比如:
function doStuff(input) {
print("Enter a number: ");
var n1 = readline();
print("Enter another one: ");
var n2 = readline();
print("You entered " + n1 + " and " + n2 + "/n");
}
调用dissrc(doStuff);得到:
;------------------------- 10: print("Enter a number: ");
00000: 10 name "print"
00003: 10 pushobj
00004: 10 string "Enter a number: "
00007: 10 call 1
00010: 10 pop
;------------------------- 11: var n1 = readline();
00011: 11 name "readline"
00014: 11 pushobj
00015: 11 call 0
00018: 11 setvar 0
00021: 11 pop
;------------------------- 12: print("Enter another one: ");
00022: 12 name "print"
00025: 12 pushobj
00026: 12 string "Enter another one: "
00029: 12 call 1
00032: 12 pop
;------------------------- 13: var n2 = readline();
00033: 13 name "readline"
00036: 13 pushobj
00037: 13 call 0
00040: 13 setvar 1
00043: 13 pop
;------------------------- 14:
;------------------------- 15: print("You entered " + n1 + " and " + n2 + "/n");
00044: 15 name "print"
00047: 15 pushobj
00048: 15 string "You entered "
00051: 15 getvar 0
00054: 15 add
00055: 15 string " and "
00058: 15 add
00059: 15 getvar 1
00062: 15 add
00063: 15 string "//n"
00066: 15 add
00067: 15 call 1
00070: 15 pop
00071: 15 stop
此外,还有一些函数也很有用。参见help();
3. JSAPI User Guide.
有点累,留作下一次吧。