2009-07-09 16 views
35

Los compiladores como todo software, también serían propensos a errores, errores lógicos.Casos de prueba del compilador o cómo probar un compilador

¿Cómo se valida la salida generada por el compilador? Normalmente, mi pregunta es (son)

  • ¿Cómo validar que el código máquina generado es correcto?

  • cómo asegurarse de que el código de máquina generado es de acuerdo a la especificación del lenguaje.

  • ¿Tiene sentido elegir un proyecto de código abierto (en C si también está escribiendo un compilador en C) para compilarlo a través del "compilador". En ese caso también, cómo juzgar que el compilador se comporta como se esperaba.

  • ¿Hay casos de prueba formales (literatura) proporcionados por el comité de estándares del lenguaje que un "lenguaje cumplir" compilador tiene que satisfacer?

  • ¿Cuáles son el seguro "dé aways" que el problema en un programa compilado por un compiladores un error del compilador y no un error del programa.

    - Cualquier ejemplos en los compiladores de la corriente principal se confunden y compilar el código erróneo?

Los enlaces a cualquier literatura serán apreciados.

+0

Votación para cerrar como demasiado amplia. –

+0

Una gran suite de pruebas patentada: http://www.solidsands.nl/supertest-general –

Respuesta

8

Existen varias suites de prueba de compilador. Hemos tenido un poco de suerte con el paquete de prueba Plum Hall para un compilador de C. Consiste en un gran conjunto de código C escrito específicamente para evaluar el estándar de idioma. Verifica que el compilador puede manejar la sintaxis y la semántica del lenguaje.

+0

No contesta todo pero el enlace es excelente. Gracias. –

5

La práctica general es crear un gran conjunto de pequeños programas que demuestran cada uno de los aspectos del compilador. Estos incluirán tanto el programa que compila como los que no deberían. En general, el ASM que sale del back end no está marcado, sino que se ejecuta el programa y se comprueba su salida. En cuanto a cómo asegurarse de que no haya errores en los casos de prueba: hágalos pequeños, como en 5-10 líneas cada uno.

Estos conjuntos de pruebas pueden ser muy grandes, como cientos o miles de pruebas (por ejemplo: an out of date test suite for the D programming language) y generalmente incluyen uno o más casos de prueba por cada error que se haya informado.

+0

pero si hago pequeños archivos fuente y los pruebo individualmente, ¿cómo se asegura de que todos funcionen cuando sean parte del mismo programa? Como por ejemplo, recojo un proyecto de código abierto y dejo que * mi * compilador lo suelte. –

+1

No es así. Pero es mucho más probable que su compilador falle en uno de los programas pequeños. No hay forma posible de probar que un compilador puede compilar correctamente cualquier fuente dada, esto sería equivalente a resolver el problema de detención. –

+0

En general, se obtiene una mezcla de casos de prueba que se generan a partir de las especificaciones de idioma (en su mayoría muy pequeñas) y casos de errores (tan pequeños como el caso de reproducción se puede reducir). En cuanto a saber que las cosas funcionarán en todos los casos, no estoy seguro de que pueda (para la mayoría de los idiomas) probar que la especificación es consistente y menos aún que se implemente correctamente. – BCS

2

El compilador de Eiffel es de código abierto y tiene una extensa biblioteca de casos de prueba y contratos de diseño interno.

http://dev.eiffel.com

9

suites buena prueba para las lenguas reales son caros para crear y mantener. Hay una razón por la cual the Plum Hall test suite, que es el estándar de la industria para ANSI   C, es tan caro.

George Necula's translation validation es una idea brillante pero también bastante costosa de implementar.

Lo único que es barato y fácil es esto: mantener un conjunto de pruebas de regresión, y cada vez que corrige un error en su compilador, ponga una prueba adecuada en sus suites de regresión. Con los compiladores, es increíble lo fácil que es seguir reintroduciendo el mismo error una y otra vez. Las adiciones disciplinadas a su suite de regresión evitarán eso, y no cuestan mucho.

4

Para la idea de compilar un gran proyecto de código abierto:

usted podría tomar un proyecto que sí tiene una serie de pruebas. Luego compila el proyecto y su conjunto de pruebas y ve si las pruebas pasan. Para validar estos resultados, compile el proyecto y el conjunto de pruebas con otro compilador y vuelva a ejecutar las pruebas.