对于多人编程游戏,我正在为 Scala 开发一个后台编译服务器,它支持编译玩家提交的多个独立源代码树。我通过
实例化
Global
编译器对象,成功运行了快速、顺序编译,而无需重新加载编译器
val compilerGlobal = new Global(settings, reporter)
然后通过
运行单独的编译作业val run = new compilerGlobal.Run
run.compile(sourceFilePathList)
我现在理想地希望并行化服务器(即使多个编译同时运行),但仍然不需要每次从头开始重新加载编译器(主要是为了避免重新解析库)。这是否可能,即上面显示的第二部分(安全地:-)是可重入的,还是它保存全局状态?如果没有,我还可以尝试其他方法吗?我目前专注于支持 Scala 2.9.1。
是的,编译器运行共享状态,因此您不应该在线程之间共享它们。这是 Eclipse 插件中出现的问题之一。正如 @EJP 指出的,符号表是共享的。
这在您的情况下并不那么重要,但在 IDE 中出现:编译器使用类型的惰性,这意味着在
Symbol
上调用方法时可能会发生额外的计算(和突变)。由于可见性问题,重要的是在与创建它们的线程相同的线程上调用这些方法。