2010-06-16 12 views
7

Considera la posibilidad de una situación. Tenemos algunos compiladores de C++ específicos, un conjunto específico de configuraciones de compiladores y un programa C++ específico.¿Se permite a un compilador de C++ emitir código de máquina diferente compilando el mismo programa?

Compilamos esos programas específicos con ese compilador y esas configuraciones dos veces, haciendo una "compilación limpia" cada vez.

En caso de que el código de máquina emitido sea el mismo (no me refiero a marcas de tiempo y otras cosas, me refiero solo al código real que se ejecutará) o se permite variar de una compilación a otra?

+0

Hubo una respuesta por @Neil Butterworth sobre el mismo problema. IIRC, explica por qué un compilador puede producir resultados diferentes incluso si todo * parece * igual. Estoy tratando de encontrarlo :) – AraK

+0

Esto casi suena como una pregunta capciosa;) –

+2

si el compilador usa algoritmos estadísticos en algunos casos, entonces sí podría producir un código ligeramente diferente, es decir, usar registros alternativos o el diseño del código. –

Respuesta

5

El estándar C++ ciertamente no dice nada para evitar que esto suceda. En realidad, sin embargo, un compilador es normalmente determinista, por lo que con entradas idénticas producirá resultados idénticos.

La verdadera pregunta es sobre qué partes del entorno considera como sus entradas - hay pocos que parecen suponer que las características de la máquina de compilación reflejan las características del objetivo, y varían sus resultados en función de "entradas" "que están implícitos en el entorno de compilación en lugar de explícitamente establecidos, como a través de indicadores del compilador. Dicho esto, incluso eso es relativamente inusual. La norma es que la salida dependa de las entradas explícitas (archivos de entrada, indicadores de línea de comando, etc.)

+3

Lo que daría por un compilador no determinista que inventó optimizaciones sobre la marcha. –

+3

Visual Studio ofrece optimización guiada de perfil. – Puppy

1

Apostaría que variaría cada vez debido a algunas escrituras del compilador de metadatos (por ejemplo, los dlls compilados de C# siempre varían en algunos bytes incluso si hago "compilación" dos veces seguidas sin cambiar nada). Pero de todos modos, nunca confiaría en que no variaría.

4

No hay garantía de que sean iguales. También de acuerdo con http://www.mingw.org/wiki/My_executable_is_sometimes_different

Mi ejecutable a veces es diferente, cuando compilo y recompilar la misma fuente. ¿Esto es normal?

Sí, de forma predeterminada, y por diseño, ~ MinGW's GCC no produce ConsistentOutput, a menos que lo aplique como parche.

EDIT: encontrado this post que parece explicar cómo hacer que sean iguales.

+1

Seguí el enlace, ¡pero no había ninguna explicación de por qué! –

+0

@martin York actualizó mi publicación con otro enlace para que sean iguales. –

4

De acuerdo con as-if norma, siempre que un programa conforme (por ejemplo, un comportamiento no definido) no distinga la diferencia, el compilador puede hacer lo que quiera. En otras palabras, siempre que el programa produzca el mismo resultado, no hay restricciones en el estándar que prohíbe esto.

Desde un punto de vista práctico, no usaría un compilador que haga esto para crear software de producción. Quiero poder recompilar un lanzamiento hecho hace dos años (con el mismo compilador, etc.) y producir el mismo código de máquina. No quiero preocuparme porque la razón por la que no puedo reproducir un error es porque el compilador decidió hacer algo ligeramente diferente hoy.

+0

Para una serie de propósitos, es útil contar con compiladores cuyo resultado sea completamente determinista, incluso si no es óptimo. Por ejemplo, si uno está compilando código para una máquina de votación de fuente abierta, debería usar un compilador cruzado de código abierto que siempre producirá resultados idénticos a los bits, independientemente del entorno en el que se ejecute el compilador. Si las versiones de ese compilador que se arrancan de la fuente a través de varios medios independientes producen todos un código idéntico, eso implicaría bastante que el compilador no ocultara los "errores" que no están en la fuente. – supercat

Cuestiones relacionadas