2012-04-01 58 views
15

對於多人編程遊戲,我正在爲Scala開發一個後臺編譯服務器,該服務器支持編譯玩家提交的多個獨立源樹。我通過Scala編譯器是否可重入?

val compilerGlobal = new Global(settings, reporter) 

,然後成功運行速度快,連續編譯沒有通過實例化Global編譯對象重裝編譯器通過

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

運行單個編譯工作現在我非常喜歡並行服務器(即同時進行多個編譯運行),但仍然沒有每次從頭重新加載編譯器(主要是爲了避免重新解析lib)。這是否可能,即上面顯示的第二部分(安全地:-)是否可重入,還是它保持全局狀態?如果沒有,還有什麼我可以嘗試?我目前專注於支持Scala 2.9.1。

+0

它包含符號表的'全局狀態',作爲開始。 – EJP 2012-04-01 08:18:08

+2

使用編譯器實例池。 – retronym 2012-04-01 10:26:23

+0

@retronym感謝您的建議。但我的主要問題是「我可以回收多少?」。您的評論意味着(內存中)編譯器實例(Global類)之間沒有全局共享狀態,這是一個好的開始。但是,你是否也建議單個運行DO共享狀態(超出解析的標準庫)?我需要更多信息。 – 2012-04-01 11:38:30

回答

4

是的,編譯器運行共享狀態,所以你不應該在線程之間共享它們。這是Eclipse插件中出現的問題之一。正如@EJP所述,符號表是共享的。

這對您並不重要,但會出現在IDE中:編譯器在類型中使用懶惰,這意味着在調用Symbol上的方法時可能會發生額外的計算(和突變)。由於可見性問題,重要的是這些方法在創建它們的相同線程上被調用。

相關問題