Compilador certificado y optimizaciones en Coq / Agda

9

Estoy interesado en compiladores verificados formalizados en la teoría de tipo Martin-Löf, es decir, Coq / Agda. Por el momento he escrito un pequeño ejemplo de juguete. Con eso puedo demostrar que mis optimizaciones son correctas. Por ejemplo, las adiciones con cero pueden eliminarse, es decir, expresiones como "x + 0".

¿Existen optimizaciones que son difíciles de realizar con un compilador normal, que servirían como un buen ejemplo? ¿Es posible probar ciertas propiedades de un programa que permiten optimizaciones que no son posibles de realizar con un compilador normal? (es decir, sin la inferencia que es posible con un probador de teoremas)

Me interesarían ideas o ejemplos y también referencias sobre el tema.

Una pregunta relacionada: pruebas de corrección del compilador

editar: Como Tsuyoshi lo puso muy bien en los comentarios: estoy buscando técnicas de optimización que son difíciles de implementar si un compilador está escrito en (digamos) C pero más fácil de implementar si un compilador está escrito en (digamos) Coq. A medida que Agda compila en C (a través de Haskell), es posible hacer todo lo posible en Agda también en C. Probablemente el único beneficio de los probadores de teoremas como Coq / Agda es que el compilador y las optimizaciones pueden verificarse.

edit2: Según lo sugerido por Vijay DI, escriba lo que he leído hasta ahora. Me centré principalmente en Xavier Leroy y el proyecto CompCert en INRIA (creo que hay un documento de 80 páginas que es una buena lectura). Un segundo interés estaba en el trabajo de Anton Setzer en programas interactivos. Pensé que tal vez su trabajo podría usarse para probar propiedades sobre los programas IO y la bisimulación de los programas IO. Gracias por mencionar a Sewell. Escuché su charla "Cuentos de la jungla" en ICFP y leí quizás 2-3 de sus documentos. Pero no he visto específicamente su trabajo y el de sus coautores.
Todavía no descubrí por dónde empezar ni busqué documentos sobre la optimización de compiladores; por ejemplo, qué optimizaciones sería interesante observar en la configuración de un compilador verificado.

mrsteve
fuente
1
"¿Hay optimizaciones que son difíciles de realizar con un compilador normal": ¿No es eso imposible? Si elimino una prueba de corrección de un compilador verificado, obtendría un compilador regular. Por lo tanto, cualquier cosa que pueda hacer un compilador verificado también puede hacerlo un compilador regular. El punto de un compilador verificado es que no puede realizar una optimización que es incorrecta. (Mi conocimiento sobre compiladores y verificación de programas es mínimo. Disculpe si me estoy perdiendo el punto.)
Tsuyoshi Ito
@ Tsuyoshi gracias por tu comentario. Quise decir: ¿Puedo probar ciertas propiedades (que se garantiza que se mantienen) para un programa (por ejemplo, una subrutina no es entrante y nunca puede llamarse a sí misma) que permiten realizar optimizaciones que generalmente no son posibles. Algunos invariantes pueden ser difíciles de verificar para un programa y quizás estas optimizaciones no sean realizadas por compiladores de uso común. Pero tal vez estoy completamente equivocado.
mrsteve
1
¿Estás hablando de un compilador escrito en Coq / Agda o un compilador para Coq / Agda? Pensé que su pregunta era sobre un compilador escrito en Coq / Agda, pero no creo que un compilador escrito en Coq / Agda pueda probar más propiedades sobre los programas de destino que un compilador escrito en C.
Tsuyoshi Ito
2
Sería bueno agregar lo que has leído a la pregunta. ¿Está familiarizado con el trabajo de compilación verificada, la de Xavier Leroy, por ejemplo? ¿O el de Peter Sewell y sus colaboradores?
Vijay D
1
No existen tales optimizaciones, a menos que restrinja aún más su pregunta. En el caso extremo, el compilador de C puede implementar secretamente un probador de teoremas en sus entrañas (y la mayoría lo hace de manera limitada). Creo que no está claro qué quiere decir con "compilador regular".
Andrej Bauer

Respuestas:

5

Este artículo de Yves Bertot, Benjamin Gr´egoire y Xavier Leroy crea un compilador optimizador para un lenguaje tipo C basado exclusivamente en la especificación Coq. algunos de esta tecnología es aparentemente utilizados en el compilador de C CompCert .

Un enfoque estructurado para probar las optimizaciones del compilador basadas en el análisis del flujo de datos

considera la corrección de dos optimizaciones, propagación constante (CP) y eliminación de subexpresión común (CSE), sección 4. estas optimizaciones son más avanzadas que las que están asociadas con los compiladores no basados ​​en Coq para el mismo lenguaje. ver, por ejemplo, este gráfico de referencia en comparación con gcc. (¡el compilador basado en Coq es presumiblemente más lento de compilar aunque esto rara vez se menciona!)

Un aspecto original de ConCert es que la mayoría del compilador está escrito directamente en el lenguaje de especificación Coq, en un estilo puramente funcional. El compilador ejecutable se obtiene mediante la extracción automática del código Caml de esta especificación.

sin embargo, al final del documento, notan que hay algunas optimizaciones de compiladores en compiladores reales que no se pueden modelar en su marco.

La optimización mejorada no es el único elemento de consideración aquí, otro aspecto es que la lógica de optimización del compilador puede estar sujeta a defectos sutiles, especialmente debido a su naturaleza compleja. Con los años, se ha descubierto que gcc tiene errores en sus numerosas rutinas de lógica de optimización. por ejemplo, error de gcc?

vzn
fuente
3

¿Puedo probar ciertas propiedades (que están garantizadas para mantener) para un programa (por ejemplo, una subrutina no es entrante y nunca puede llamarse a sí misma) que permiten realizar optimizaciones que generalmente no son posibles.

Es equivalente a extender el typechecker para proporcionar algunas propiedades de un programa al optimizador. Creo que Tsuyoshi Ito tiene razón y puede que estés un poco equivocado sobre Coq. Es una gran herramienta para proporcionar un compilador sin errores, pero en el caso que describa, no proporciona más potencia a los análisis estáticos.

Lo único que puedo pensar en fortalecer los análisis estáticos con Coq es equipar su lenguaje con afirmaciones que contengan algunas pruebas escritas por el usuario. - Si el compilador mismo se tradujera a un lenguaje que incluye una pluma para la verificación dinámica de tipos, y si las pruebas escritas por el usuario fueran convertibles a funciones, entonces sería posible aplicar esas funciones como propiedades requeridas previamente para algunos subtipos u optimizaciones. - De hecho, esto proporcionaría más potencia al compilador.

Sin embargo, hasta donde puedo ver, sería bastante útil para fortalecer el subtipo. - Es difícil hacer que un programador sepa qué propiedad en qué lugar sería útil para el optimizador.

Numero47
fuente