Scala编译器是否可以重入?

Sca*_*war 15 compiler-construction scala reentrancy

对于多玩家编程游戏,我正在为Scala开发一个后台编译服务器,它支持编译由玩家提交的多个独立源树.我成功地运行了快速的顺序编译,而无需通过实例化Global编译器对象来重新加载编译器

val compilerGlobal = new Global(settings, reporter)
Run Code Online (Sandbox Code Playgroud)

然后通过运行单个编译作业

val run = new compilerGlobal.Run
run.compile(sourceFilePathList)
Run Code Online (Sandbox Code Playgroud)

我现在理想地希望并行化服务器(即同时进行多个编译),但每次都不需要重新加载编译器(主要是为了避免重新解析lib).这是可能的,即上面显示的第二部分(安全地:-)重入,还是保持全局状态?如果没有,我还能尝试别的吗?我目前专注于支持Scala 2.9.1.

Iul*_*gos 4

是的,编译器运行共享状态,因此您不应在线程之间共享它们。这是 Eclipse 插件中出现的问题之一。正如 @EJP 指出的,符号表是共享的。

这在您的情况下并不那么重要,但在 IDE 中出现:编译器在类型中使用惰性,这意味着在 . 上调用方法时可能会发生额外的计算(和突变)Symbol。由于可见性问题,在创建这些方法的线程所在的线程上调用这些方法非常重要。