stringtranslate.com

Corrección del compilador

En informática , la corrección del compilador es la rama de la ciencia informática que trata de intentar demostrar que un compilador se comporta de acuerdo con su especificación de lenguaje . [ cita requerida ] Las técnicas incluyen el desarrollo del compilador utilizando métodos formales y el uso de pruebas rigurosas (a menudo llamadas validación del compilador) en un compilador existente.

Verificación formal

Los dos principales enfoques de verificación formal para establecer la corrección de la compilación son demostrar la corrección del compilador para todas las entradas y demostrar la corrección de una compilación de un programa particular (validación de la traducción).

Corrección del compilador para todos los programas de entrada

La validación de compiladores con métodos formales implica una larga cadena de lógica formal y deductiva . [1] Sin embargo, dado que la herramienta para encontrar la prueba ( demostrador de teoremas ) está implementada en software y es compleja, existe una alta probabilidad de que contenga errores. Un enfoque ha sido utilizar una herramienta que verifica la prueba (un verificador de pruebas ) que, debido a que es mucho más simple que un buscador de pruebas, es menos probable que contenga errores.

Un ejemplo destacado de este enfoque es CompCert , que es un compilador optimizador verificado formalmente de un gran subconjunto de C99 . [2] [3] [4]

Otro compilador verificado fue desarrollado en el proyecto CakeML, [5] que establece la corrección de un subconjunto sustancial del lenguaje de programación ML estándar utilizando HOL (asistente de prueba) .

Otro enfoque para obtener un compilador formalmente correcto es utilizar la generación de compiladores dirigida por semántica. [6]

Validación de la traducción: corrección del compilador en un programa determinado

A diferencia de intentar demostrar que un compilador es correcto para todos los programas de entrada válidos, la validación de la traducción [7] tiene como objetivo establecer automáticamente que un programa de entrada dado se compila correctamente. Probar la compilación correcta de un programa dado es potencialmente más fácil que probar que un compilador es correcto para todos los programas, pero aún requiere razonamiento simbólico, porque un programa fijo puede seguir funcionando con entradas arbitrariamente grandes y ejecutarse durante un período de tiempo arbitrario. La validación de la traducción puede reutilizar una implementación de compilador existente al generar, para una compilación dada, una prueba de que la compilación fue correcta. La validación de la traducción se puede utilizar incluso con un compilador que a veces genera código incorrecto, siempre que este error no se manifieste para un programa dado. Dependiendo del programa de entrada, la validación de la traducción puede fallar (porque el código generado es incorrecto o la técnica de validación de la traducción es demasiado débil para mostrar la corrección). Sin embargo, si la validación de la traducción tiene éxito, entonces se garantiza que el programa compilado es correcto para todas las entradas.

Pruebas

Las pruebas representan una parte importante del esfuerzo que supone lanzar un compilador, pero reciben una cobertura comparativamente escasa en la literatura estándar. La edición de 1986 de Aho, Sethi y Ullman tiene una sección de una sola página sobre pruebas de compiladores, sin ejemplos nombrados. [8] La edición de 2006 omite la sección sobre pruebas, pero sí enfatiza su importancia: “Los compiladores optimizadores son tan difíciles de hacer bien que nos atrevemos a decir que ningún compilador optimizador está completamente libre de errores. Por lo tanto, el objetivo más importante al escribir un compilador es que sea correcto”. [9] Fraser y Hanson 1995 tienen una breve sección sobre pruebas de regresión ; el código fuente está disponible. [10] Bailey y Davidson 2003 cubren las pruebas de llamadas a procedimientos . [11] Varios artículos confirman que muchos compiladores lanzados tienen errores significativos de corrección de código. [12] Sheridan 2007 es probablemente el artículo de revista más reciente sobre pruebas generales de compiladores. [13] Para la mayoría de los propósitos, la mayor cantidad de información disponible sobre pruebas de compiladores son las suites de validación Fortran [14] y Cobol [15] .

Otras técnicas comunes al probar compiladores son el fuzzing [16] (que genera programas aleatorios para intentar encontrar errores en un compilador) y la reducción de casos de prueba (que intenta minimizar un caso de prueba encontrado para que sea más fácil de entender). [17]

Véase también

Referencias

  1. ^ De Millo, RA; Lipton, RJ; Perlis, AJ (1979). "Procesos sociales y pruebas de teoremas y programas". Comunicaciones de la ACM . 22 (5): 271–280. doi : 10.1145/359104.359106 . S2CID  6794058.
  2. ^ Leroy, X. (2006). "Certificación formal de un back-end de compilador o: Programación de un compilador con un asistente de pruebas". ACM SIGPLAN Notices . 41 : 42–54. doi :10.1145/1111320.1111042.
  3. ^ Leroy, Xavier (1 de diciembre de 2009). "Un back-end de compilador verificado formalmente". Revista de razonamiento automatizado . 43 (4): 363–446. arXiv : 0902.2137 . doi :10.1007/s10817-009-9155-4. ISSN  0168-7433. S2CID  87730.
  4. ^ "CompCert - El compilador C de CompCert". compcert.inria.fr . Consultado el 21 de julio de 2017 .
  5. ^ "CakeML: una implementación verificada de ML".
  6. ^ Stephan Diehl, Generación dirigida de compiladores y máquinas abstractas mediante semántica natural , Aspectos formales de la informática, vol. 12 (2), Springer Verlag, 2000. doi :10.1007/PL00003929
  7. ^ Pnueli, Amir; Siegel, Michael; Singerman, Eli. Validación de la traducción . Herramientas y algoritmos para la construcción y análisis de sistemas, 4.ª Conferencia internacional, TACAS '98.
  8. ^ Compiladores: principios, técnicas y herramientas , infra 1986, pág. 731.
  9. ^ ibíd., 2006, pág. 16.
  10. ^ Christopher Fraser; David Hanson (1995). Un compilador de C redireccionable: diseño e implementación . Benjamin/Cummings Publishing. ISBN 978-0-8053-1670-4., págs. 531–3.
  11. ^ Mark W. Bailey; Jack W. Davidson (2003). "Detección y diagnóstico automático de fallos en el código generado para llamadas a procedimientos" (PDF) . IEEE Transactions on Software Engineering . 29 (11): 1031–1042. CiteSeerX 10.1.1.15.4829 . doi :10.1109/tse.2003.1245304. Archivado desde el original (PDF) el 28 de abril de 2003 . Consultado el 24 de marzo de 2009 . , pág. 1040.
  12. ^ Por ejemplo, Christian Lindig (2005). "Prueba aleatoria de las convenciones de llamada de C" (PDF) . Actas del Sexto Taller Internacional sobre Depuración Automatizada . ACM. ISBN. 1-59593-050-7Archivado desde el original (PDF) el 11 de julio de 2011. Consultado el 24 de marzo de 2009 ., y Eric Eide; John Regehr (2008). "Los volátiles se compilan incorrectamente y qué hacer al respecto" (PDF) . Actas de la 7.ª conferencia internacional de la ACM sobre software integrado . ACM. ISBN 978-1-60558-468-3. Consultado el 24 de marzo de 2009 .
  13. ^ Flash Sheridan (2007). "Prueba práctica de un compilador C99 mediante comparación de salida" (PDF) . Software: práctica y experiencia . 37 (14): 1475–1488. arXiv : 2202.07390 . doi :10.1002/spe.812. S2CID  9752084. Consultado el 24 de marzo de 2009 . Bibliografía en "Bibliografía de pruebas de compiladores" . Consultado el 13 de marzo de 2009 ..
  14. ^ "Fuente de la suite de validación Fortran" . Consultado el 1 de septiembre de 2011 .
  15. ^ "Fuente de la suite de validación de Cobol" . Consultado el 1 de septiembre de 2011 .
  16. ^ Chen, Yang; Groce, Alex; Zhang, Chaoqiang; Wong, Weng-Keen; Fern, Xiaoli; Eide, Eric; Regehr, John (2013). "Taming compiler fuzzers". Actas de la 34.ª Conferencia ACM SIGPLAN sobre diseño e implementación de lenguajes de programación . PLDI '13. Nueva York, NY, EE. UU.: ACM. págs. 197–208. CiteSeerX 10.1.1.308.5541 . doi :10.1145/2491956.2462173. ISBN .  9781450320146. Número de identificación del sujeto  207205614.
  17. ^ Regehr, John; Chen, Yang; Cuoq, Pascal; Eide, Eric; Ellison, Chucky; Yang, Xuejun (2012). "Reducción de casos de prueba para errores del compilador de C". Actas de la 33.ª Conferencia SIGPLAN de la ACM sobre diseño e implementación de lenguajes de programación . PLDI '12. Nueva York, NY, EE. UU.: ACM. págs. 335–346. doi :10.1145/2254064.2254104. ISBN . 9781450312059.S2CID1025409  .​