Является ли репозитант компилятора Scala?

Для многопользовательской игры для программирования я работаю на сервере компиляции фона для Scala, который поддерживает компиляцию нескольких независимых исходных деревьев, представленных игроками. Мне удалось выполнить быстрые последовательные компиляции без перезагрузки компилятора путем создания экземпляра объекта Global компилятора с помощью

val compilerGlobal = new Global(settings, reporter)

а затем выполнить отдельные задания компиляции с помощью

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

Теперь я бы идеально хотел распараллеливать сервер (т.е. выполнять несколько компиляций одновременно), но все равно без перезагрузки компилятора (прежде всего, чтобы избежать повторного разбора lib) с нуля каждый раз. Возможно ли это, т.е. Вторая часть, показанная выше (безопасно:-) повторный участник или глобальное состояние? Если нет, есть ли что-то еще, что я могу попробовать? В настоящее время я сосредоточен на поддержке Scala 2.9.1.

Ответы

Ответ 1

Да, компилятор Запускает состояние общего доступа, поэтому вы не должны делиться ими между потоками. Это одна из проблем, возникающих в плагине Eclipse. Как отметил @EJP, таблица символов является общей.

Это не так важно в вашем случае, но появляется в среде IDE: компилятор использует лень в типах, что означает, что при вызове методов на Symbol может произойти дополнительное вычисление (и мутация). Из-за проблем видимости важно, чтобы эти методы вызывались в том же потоке, что и созданные.