Является ли компилятор Scala реентерабельным? - PullRequest
15 голосов
/ 01 апреля 2012

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

val compilerGlobal = new Global(settings, reporter)

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

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

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

1 Ответ

4 голосов
/ 08 апреля 2012

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

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

...