7

我正在尝试使用 node.js 运行使用 GHCJS 构建的程序。但是,我收到以下错误:

SyntaxError: Too many variables declared (only 131071 allowed)
    at Module._compile (module.js:439:25)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:906:3
  1. 是否可以增加节点中允许的变量数量?
  2. 是否有更好的实用程序来运行 JS 文件,这将允许更多变量
  3. 是否有可以自动减少变量数量的优化工具?

请注意,这是机器生成的 JS,所以我不想通过手工来减少变量的数量。

欢迎任何想法。

4

1 回答 1

5

一定是一个相当大的程序:)

我遇到了非常旧的节点版本(32k)的变量限制,但还没有进入新的提高限制。该问题类似于导致动态链接问题的 Windows DLL 符号限制,并且可能同样令人讨厌。

为了效率和简单性,GHCJS 将所​​有生成的代码作为顶级函数和变量发出(闭包由 STG 实现处理,因此这里不需要嵌套函数)。

该限制仅适用于本地(函数)范围。不幸的是,node.js 使用模块系统,并将所有代码隐式加载到本地范围内。

幸运的是,JavaScript 为我们提供了一种仍然从本地范围声明全局名称的方法,您只需要删除var关键字!我认为如果将var h$行首的所有内容替换为h$.

或者,您可以尝试使用 SpiderMonkey JS shell 或在浏览器中运行脚本,但这些会给您提供更有限的环境(无法访问文件系统,无法启动或与其他进程交互)。

如果变量限制对你来说仍然是个问题,请在https://github.com/ghcjs/ghcjs/issues开票,这样我们可以尝试找到更永久的解决方案(可能通过调整链接时间转换步骤来划分生成的代码到多个模块中)。

于 2014-08-20T20:19:50.347 回答