使用Node运行GHCJS程序的变量太多

jmi*_*ite 6 javascript haskell ghc node.js ghcjs

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)
  1. 是否可以增加节点中允许的变量数量?
  2. 是否有更好的实用程序来运行JS文件,这将允许更多的变量
  3. 是否有可以自动减少变量数量的优化工具?

请注意,这是机器生成的JS,因此我不希望手动完成并减少变量的数量.

欢迎任何想法.

小智 5

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

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

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

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

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

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

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