2012-04-01 13 views
15

Dla wieloosobowej gry programistycznej, pracuję nad serwerem kompilacji w tle dla Scala, który obsługuje kompilację wielu niezależnych drzew źródłowych przesłanych przez graczy. Udało mi się działa szybko, kolejne kompilacje bez przeładowywania kompilator przez instancję obiektu Global kompilatora poprzezCzy scala kompilator Scala jest ponownie?

val compilerGlobal = new Global(settings, reporter) 

a następnie uruchomić poszczególne zadania kompilacji poprzez

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

Chciałbym teraz idealnie lubią parallelize serwer (tj. jednocześnie wykonywać wiele uruchomień kompilacji), ale wciąż bez ponownego ładowania kompilatora (głównie w celu uniknięcia ponownego analizowania biblioteki) od początku za każdym razem. Czy jest to możliwe, tj. Czy druga część jest pokazana powyżej (bezpiecznie :-) ponownie-uczestnik, czy też posiada stan globalny? Jeśli nie, czy jest coś, co mogę spróbować? Obecnie koncentruję się na wspieraniu Scala 2.9.1.

+0

Zawiera "stan globalny" tablicy symboli, na początek. – EJP

+2

Użyj puli instancji kompilatora. – retronym

+0

@retronym Dzięki za sugestię. Moje główne pytanie brzmi: "Ile mogę oddać do recyklingu?". Twój komentarz sugeruje, że nie ma globalnego współużytkowanego stanu między instancjami kompilatora (w pamięci) (klasa Global), co jest dobrym początkiem. Ale czy sugerujesz także, że poszczególne przebiegi DO dzielą się stanem (poza sparsowaną standardową biblioteką)? Potrzebuję więcej informacji. –

Odpowiedz

4

Tak, kompilator Uruchamia stan udziału, więc nie należy udostępniać ich między wątkami. To jeden z problemów pojawiających się w pluginach Eclipse. Jak zauważyło @EJP, tablica symboli jest udostępniana.

To nie jest tak ważne w twoim przypadku, ale pojawia się w IDE: kompilator używa lenistwa w typach, co oznacza, że ​​może wystąpić dodatkowe obliczenie (i mutacja) podczas wywoływania metod na Symbol. Ze względu na problemy z widocznością ważne jest, aby te metody były wywoływane w tym samym wątku jako tym, który je utworzył.