2012-04-01 14 views
15

Para un juego de programación multijugador, estoy trabajando en un servidor de compilación de fondo para Scala que admite la compilación de múltiples fuentes independientes presentadas por los jugadores. Tuve éxito en la gestión de compilaciones rápidas y secuenciales sin tener que recargar el compilador creando una instancia de objeto Global compilador través¿Está el reentrante del compilador Scala?

val compilerGlobal = new Global(settings, reporter) 

y luego ejecutar trabajos de compilación individuales a través de

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

quisiera ahora idealmente le gustaría poner en paralelo el servidor (es decir, realizar varias ejecuciones de compilación al mismo tiempo), pero sin volver a cargar el compilador (principalmente para evitar volver a analizar la lib) desde cero cada vez. ¿Es esto posible, es decir, se muestra la segunda parte arriba (de manera segura :-) reentrante, o tiene estado global? Si no, ¿hay algo más que pueda probar? Actualmente estoy enfocado en dar soporte a Scala 2.9.1.

+0

Tiene el 'estado global' de la tabla de símbolos, para empezar. – EJP

+2

Utilice un conjunto de instancias de compilador. – retronym

+0

@retronym Gracias por la sugerencia. Mi pregunta principal, sin embargo, es "¿cuánto puedo reciclar?". Su comentario sugiere que no existe un estado compartido global entre las instancias del compilador (en la memoria) (clase Global), que es un buen comienzo. ¿Pero también está sugiriendo que el individuo ejecuta DO share state (más allá de la lib estándar analizada)? Necesitaría más información. –

Respuesta

4

Sí, el compilador ejecuta el estado compartido, por lo que no debe compartirlos entre subprocesos. Es uno de los problemas que surge en el plugin de Eclipse. Como señaló @EJP, la tabla de símbolos se comparte.

Esto no es tan importante en su caso, pero aparece en un IDE: el compilador usa la pereza en los tipos, lo que significa que pueden producirse cálculos adicionales (y mutaciones) al llamar a los métodos Symbol. Debido a problemas de visibilidad, es importante llamar a estos métodos en el mismo hilo que el que los creó.

Cuestiones relacionadas