2011-08-20 20 views
9

Recientemente me sorprendió ver que el código de Java se recompila automáticamente y se inyecta en un programa en ejecución. Dado que los compiladores modernos de C++ (por ejemplo, basados ​​en LLVM) comienzan a investigar la compilación de JIT, me pregunto si se ha hecho algún trabajo sobre este tema.Recompilación en caliente para C++

Actualización: Por "recompilación en caliente", me refiero a editar el código, volver a compilar una parte específica del ejecutable y ejecutarlo sin reiniciar el programa. El caso de uso común sería un motor de juego con un bucle infinito en el que se editaría algún código en el paso de representación, y vería los cambios en el siguiente fotograma.

¿Cuál es el estado de la investigación de recompilación en caliente para C++? ¿Hay alguna implementación en funcionamiento?

+0

¿Cuál es exactamente la pregunta? – Hogan

+0

@Hogan He actualizado la pregunta. –

+0

Defina "recompilación en caliente". –

Respuesta

10

Es posible que por "recompilación caliente" se refiere a algo así como "Edit and continue" en Visual C++.

Quizás ese enlace constituye una respuesta a tu pregunta.

Pero sería más fácil si definiera el término que está preguntando, "recompilación en caliente", más claramente (ya que estoy escribiendo esto no está bien definido).

añade: "Editar y continuar" para C++ fue aparentemente introduced with Visual C++ 6.0, en la década de 1990. Por lo tanto, es algo sorprendente que alguna implementación de Java pueda hacerlo ahora. <g> Sin embargo, el modificador /Zi que habilita editar y continuar también, como recuerdo, cambia el comportamiento de __LINE__ de modo que, p. la implementación original ScopeGuard no funciona (uno tiene que usar el __COUNTER__ específico de Microsoft).

Saludos & HTH.,

+1

+1 Por mencionar Editar y continuar.Lo he encontrado infinitamente útil para depurar ciertas cosas. –

+0

Wow. No tenía idea de esta característica en VS. ¿Lo implementa cualquier otro compilador/IDE? –

2

De automatically recompiled and injected into a running program. supongo que está hablando la JVM en realidad viendo la ejecución del programa y, por ejemplo, el cambio de valores de rama predichos en tiempo de ejecución para minimizar saltos y un-canalización.

Esto se puede hacer en Java porque hay una etapa intermedia separada bien definida entre el código fuente y las instrucciones reales de la máquina. Esto le permitiría sustituir el código intermedio en el tiempo de ejecución, posiblemente mejorando el rendimiento.

En C++, el programa está integrado directamente en el lenguaje de máquina de una arquitectura particular y en la mayoría de hardware, las páginas de códigos son de solo lectura por varias razones, incluyendo la prevención de cambios accidentales y maliciosos.

Ahora, lo que podría hacer en C++ es utilizar algo así como que la biblioteca Clang para reconstruir secciones de código en un objeto compartido y luego usar dlopen etc para abrir el objeto compartido recompilado para recoger la nueva versión de la máquina código. Esto, por supuesto, requiere que su programa sea mucho más inteligente que un programa Java para aprovechar la JVM. I crea que g ++/gprof tiene un modo en el que los datos de generación de perfiles se pueden usar para afectar las optimizaciones de g ++, sin embargo, ¿eso es lo que estás buscando?

+0

Lo que mencionas es la característica común que debe tener un compilador JIT. No mencioné optimizaciones. Mi pregunta estaba más relacionada con lo que @Alf sugiere. –

Cuestiones relacionadas