SpiderMonkey是Mozilla的javascript引擎,我的Arch里面安装了js78(版本78是来自Firefox-ESR 78的版本),是安装polkit的时候作为依赖安装的,没安装的话可以手动安装。运行js78就拿到一个REPL界面。
也可以先把js程序写好,用 ``js78 -i`` 加载,例如:
在REPL里面跑了下fibonacci_iter(10000),发现SpiderMonkey,node,deno都报了栈深度超过最大值的异常,说明这些js解释器都没实现尾递归。
把这段程序改写成 ECMAScript (变量定义加上var,所有语句最后加上分号),用 guile --language=ecmascript (GNU Guile 2.2.7) 跑 fibonacci_iter(100000) 没报错并能输出结果,fibonacci_iter(1000000) 就很慢了。guile 跑 emcascript 程序居然不支持 guile -l 加载文件。
也可以先把js程序写好,用 ``js78 -i`` 加载,例如:
代码:
$ cat fibonacci.js
fibonacci = function(x) {
if (x == 0 || x == 1) {
return 1;
}
return fibonacci(x - 1) + fibonacci(x - 2);
}
fibonacci_iter = function(x) {
fib_helper = function(x, x0, x1) {
if (x == 0) {
return x0;
}
if (x == 1) {
return x1;
}
return fib_helper(x - 1, x1, x0 + x1);
}
return fib_helper(x, 1, 1);
}
$ js78 -i fibonacci.js
js> fibonacci(20)
10946
js> fibonacci_iter(20)
10946
js> for (i = 0; i < 10; i++) { print(fibonacci(i)); }
1
1
2
3
5
8
13
21
34
55
js> for (i = 0; i < 10; i++) { print(fibonacci_iter(i)); }
1
1
2
3
5
8
13
21
34
55
在REPL里面跑了下fibonacci_iter(10000),发现SpiderMonkey,node,deno都报了栈深度超过最大值的异常,说明这些js解释器都没实现尾递归。
把这段程序改写成 ECMAScript (变量定义加上var,所有语句最后加上分号),用 guile --language=ecmascript (GNU Guile 2.2.7) 跑 fibonacci_iter(100000) 没报错并能输出结果,fibonacci_iter(1000000) 就很慢了。guile 跑 emcascript 程序居然不支持 guile -l 加载文件。