Como dice el título,
Una respuesta típica que se obtendría es:
La regla que permite todas y cada una de las transformaciones de código que no cambian el comportamiento observable del programa.
De vez en cuando seguimos obteniendo comportamientos de ciertas implementaciones que se atribuyen a esta regla. Muchas veces equivocadamente. Entonces, ¿qué es exactamente esta regla? El estándar no menciona claramente esta regla como una sección o párrafo, entonces, ¿qué cae exactamente bajo el alcance de esta regla? A mí me parece un área gris que no está definida en detalle por el estándar. ¿Alguien puede ampliar los detalles citando las referencias del estándar?
Nota: Etiquetar esto como C y C ++ ambos, porque es relevante para ambos lenguajes.
Respuestas:
¿Qué es la regla " como si "?
La regla " como si " básicamente define qué transformaciones puede realizar una implementación en un programa C ++ legal. En resumen, se permiten todas las transformaciones que no afecten el " comportamiento observable " de un programa (ver más abajo para una definición precisa).
El objetivo es dar a las implementaciones libertad para realizar optimizaciones siempre que el comportamiento del programa siga siendo compatible con la semántica especificada por el estándar C ++ en términos de una máquina abstracta.
¿Dónde introduce la Norma esta regla?
El estándar C ++ 11 introduce la regla " como si " en el párrafo 1.9 / 1:
Además, una nota explicativa a pie de página agrega:
¿Qué exige la regla exactamente?
El párrafo 1.9 / 5 especifica además:
Vale la pena enfatizar que esta restricción se aplica cuando se "ejecuta un programa bien formado" solamente, y que los posibles resultados de ejecutar un programa que contiene un comportamiento indefinido no están restringidos. Esto también se hace explícito en el párrafo 1.9 / 4:
Por último, con respecto a la definición de " comportamiento observable ", el párrafo 1.9 / 8 dice lo siguiente:
¿Hay situaciones en las que esta regla no se aplica?
Hasta donde yo sé, la única excepción a la regla " como si " es la elisión de copiar / mover, que está permitida aunque el constructor de copia, el constructor de movimiento o el destructor de una clase tengan efectos secundarios. Las condiciones exactas para esto se especifican en el Párrafo 12.8 / 31:
fuente
En C11, la regla nunca recibe ese nombre. Sin embargo, C, al igual que C ++, define el comportamiento en términos de máquina abstracta. La regla como si está en C11 5.1.2.3p4 y p6 :
fuente
En C, C ++, Ada, Java, SML ... en cualquier lenguaje de programación bien especificado mediante la descripción de los comportamientos (generalmente muchos posibles, no deterministas) de un programa (expuesto a una serie de interacciones en los puertos de E / S) , no hay una regla como si fuera distinta .
Un ejemplo de regla distinta es la que dice que una división por cero genera una excepción (Ada, Caml) o una desreferencia nula genera una excepción (Java). Podrías cambiar la regla para especificar otra cosa y terminarías con un lenguaje diferente (que algunas personas prefieren llamar un "dialecto" (*). Existe una regla distinta para especificar algunos usos distintos de un lenguaje de programación como un La regla gramatical cubre algunas construcciones de sintaxis.
(*) Un dialecto según algunos lingüistas es una lengua con un "ejército". en ese contexto, eso podría significar un lenguaje de programación sin un comité y una industria específica de editores de compiladores.
La regla como si no es una regla distinta ; no cubre ningún programa en particular y ni siquiera es una regla que pueda discutirse, eliminarse o alterarse de ninguna manera : la llamada "regla" simplemente reitera que la semántica del programa está definida y solo puede ser portable (universalmente) definido, en términos de las interacciones visibles de una ejecución del programa con el mundo "externo".
El mundo externo puede ser interfaces de E / S (stdio), una GUI, incluso un intérprete interactivo que genera el valor resultante de un lenguaje aplicativo puro. En C y C ++ se incluyen los accesos (vagamente especificados) a objetos volátiles, que es otra forma de decir que algunos objetos en un punto dado deben representarse en la memoria estrictamente de acuerdo con la ABI (Application Binary Interface) sin mencionar la ABI explícitamente.
La definición de lo que es un rastro de ejecución , también llamado comportamiento visible u observable, define lo que se entiende por "regla como si". La regla como si intenta explicarlo, pero al hacerlo, confunde a las personas más que aclara las cosas, ya que da la expresión de ser una regla semántica adicional que da más libertad de acción a la implementación.
Resumen:
fuente