15

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

val compilerGlobal = new Global(settings, reporter)

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

val run = new compilerGlobal.Run
run.compile(sourceFilePathList)

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

4

1 回答 1

4

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

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

于 2012-04-07T21:21:43.030 回答