WeHack BBS
用spidermonkey玩javascript - 可打印的版本

+- WeHack BBS (https://bbs.wehack.space)
+-- 版块: 计算机技术 (https://bbs.wehack.space/forum-5.html)
+--- 版块: 程序设计讨论区 (https://bbs.wehack.space/forum-14.html)
+--- 主题: 用spidermonkey玩javascript (/thread-281.html)



用spidermonkey玩javascript - vimacs - 07-15-2021

SpiderMonkey是Mozilla的javascript引擎,我的Arch里面安装了js78(版本78是来自Firefox-ESR 78的版本),是安装polkit的时候作为依赖安装的,没安装的话可以手动安装。运行js78就拿到一个REPL界面。
也可以先把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 加载文件。


RE: 用spidermonkey玩javascript - vimacs - 07-15-2021

再试了一下Guile 3.0.7. 因为 Guile 3 有 JIT,跑 fibonacci_iter(1000000) 可以在可接受的时间内出结果了。


RE: 用spidermonkey玩javascript - vimacs - 07-15-2021

再测试了一下,Guile的ECMAScript环境可以支持任意精度整数,而SpiderMonkey和deno都不行,计算结果大了就返回NaN. 另外Guile的EMCAScript环境中要输出到stdout用的是display函数,应该是复用了Scheme的。