poohRui
Estoy tratando de entender el como si regla. De acuerdo a preferencia cp:
La regla del como si
Permite todas y cada una de las transformaciones de código que no cambian el comportamiento observable del programa.
Explicación
El compilador de C++ puede realizar cualquier cambio en el programa siempre que se cumpla lo siguiente: […]
Me cuesta entender el segundo consejo de la sección Explicación:
2) Al finalizar el programa, los datos escritos en los archivos son exactamente como si el programa se hubiera ejecutado tal como se escribió.
Simplemente no entiendo qué significa “el programa se ejecutó tal como está escrito”.
El lunes, su jefe entra en su oficina y dice: “Necesito el archivo A en mi escritorio para el jueves y el archivo B en mi escritorio el viernes”. Primero describe las cosas que quiere en el archivo A y cómo cree que deberías hacerlas y luego describe las cosas que quiere en el archivo B.
En la mente de su jefe, primero hará las cosas para el archivo A, colocará ese archivo en su escritorio el jueves, luego se pondrá a trabajar en el archivo B y lo terminará el viernes. Pero se da cuenta de que tendría más sentido comenzar a trabajar en el archivo B antes, incluso antes del archivo A. No hay ninguna razón por la que su jefe tenga que saberlo: lo único que le importa es recibir A el jueves y B el viernes. También se da cuenta de que la forma en que sugirió se puede mejorar, por lo que adopta un enfoque ligeramente diferente para producir la información requerida.
En esta analogía, el jefe es un código C++ y tú eres el compilador. Es legal que el compilador reorganice las operaciones (trabajar en los archivos en otro orden) siempre que el comportamiento observable (poner archivos en el escritorio del jefe) es lo mismo. De manera similar, el compilador es libre de realizar cualquier transformación (usando un enfoque diferente al descrito por el jefe) en el código que preserva el comportamiento observable.
En particular, “como si el programa se ejecutara tal como está escrito” significa “como si hicieras el trabajo exactamente como te lo indicó tu jefe” (incluso si hiciste algo diferente).
Una característica importante de la regla citada es que especifica un conjunto mínimo de requisitos para que una implementación sea conforme, pero de ninguna manera implica que esos requisitos serán suficientes para una aplicación en particular, ni que algunas aplicaciones no necesitarán implementaciones para ofrecer garantías más fuertes. Suponga que el procedimiento para realizar y registrar los resultados de una sola prueba sería:
- Haz el experimento.
- Anote el resultado medido.
- desbloquear la caja fuerte
- Ponga el papel con las medidas en la caja fuerte.
- Cierra la caja fuerte.
Si a uno se le dan tres pruebas para realizar, uno podría realizar los cinco pasos anteriores en orden para cada prueba, pero cualquiera de las siguientes secuencias de pasos puede que también ser aceptable:
- Haz el experimento #1
- Anote el resultado medido en el papel #1
- Haz el experimento #2
- Anote el resultado medido en el papel #2
- Haz el experimento #3
- Anote el resultado medido en el papel #3
- desbloquear la caja fuerte
- Pon el papel #1 en la caja fuerte
- Pon el papel #2 en la caja fuerte
- Pon el papel #3 en la caja fuerte
- bloquear la caja fuerte
o–para evitar tener que hacer un seguimiento de tres documentos a la vez:
- Haz el experimento #1
- Anote el resultado medido en el papel #1
- desbloquear la caja fuerte
- Pon el papel #1 en la caja fuerte
- Haz el experimento #2
- Anote el resultado medido en el papel #2
- Pon el papel #2 en la caja fuerte
- Haz el experimento #3
- Anote el resultado medido en el papel #3
- Pon el papel #3 en la caja fuerte
- bloquear la caja fuerte
Si todo sale como se espera, los tres enfoques serían equivalentes. Sin embargo, si el segundo experimento pudiera salir mal y tirar a la basura cualquier papel que esté sobre el escritorio, usar el segundo enfoque correría el riesgo de perder los resultados del primer experimento, un resultado que no habría ocurrido si se hubiera seguido el procedimiento completamente detallado. seguido. Peor aún, si el tercer experimento sale realmente mal y destruye todo lo que no es bloqueado en la caja fuerte, el tercer enfoque correría el riesgo de perder todo lo que estaba en la caja fuerte, incluso el contenido no relacionado con los experimentos.
En algunos casos, el segundo o tercer enfoque puede ser apropiado. En algunos, no sería así. Juzgar si esos enfoques son apropiados requeriría conocer los riesgos que plantean los experimentos, el contenido de la caja fuerte y muchos otros factores.
Los autores de la Norma no pueden saber todo lo necesario para juzgar qué garantías necesitarán qué aplicaciones. En su lugar, confían en los productores y usuarios de diversas implementaciones para reconocer qué garantías se necesitarán para lograr de manera segura y efectiva lo que sea necesario hacer.
Significa que los compiladores no pueden realizar optimizaciones que cambiarían cualquier salida (con la excepción de RVO).
– Betsabé
28 de junio de 2019 a las 7:27
Sugeriría stackoverflow.com/questions/15718262/… como duplicado. Pero tal vez no responde lo suficientemente bien a la pregunta en particular.
–Max Langhof
28 de junio de 2019 a las 7:51
@Aconcagua ¿Cuál cree que es el “comportamiento tal como está escrito” en ese caso? Si el orden de las salidas no está definido en su programa “tal como está escrito” (que es por el sonido de su descripción), entonces no hay ningún requisito sobre el orden de las salidas de ninguna compilación concreta de ese programa.
–Max Langhof
28 de junio de 2019 a las 7:53
Aquí hay una buena demostración lo que la regla “Como si” puede hacer. En mi opinión, esta es la mejor manera de entender eso.
– Marek R.
28 de junio de 2019 a las 8:04
@Aconcagua Estoy muy de acuerdo, pero vale la pena tener en cuenta que hay algunas personas a las que les resulta imposible aprender de unas pocas líneas de texto y encontrar un video. mucho más fácil.
– Martin Bonner apoya a Mónica
28 de junio de 2019 a las 9:45