¿Existen compiladores totalmente optimizadores para la finalización de programas?

20

En el libro de Andrew W. Appel, Modern Compiler Implementation in ML , dice en el capítulo 17 que la teoría de la computabilidad muestra que siempre será posible inventar nuevas transformaciones optimizadoras y procede a demostrar que un compilador completamente optimizador resolverá el problema de detención: un programa Q que no produce salida y nunca se detiene se puede reemplazar fácilmente por su representación óptima, Opt (Q) , que es "L: goto L". Por lo tanto, un compilador completamente optimizado puede resolver el problema de detención.

Entonces mi pregunta es esta: ¿Existe un compilador completamente optimizado para terminar programas? Mis únicos pensamientos son los siguientes: aunque se garantiza que un programa finalizará, aún puede ser arbitrariamente complejo, y para cualquier compilador de optimización concreto, C, uno podría construir un programa que tome C como entrada y de alguna manera produzca un programa peor. algún tipo de caja de esquina.

Además, ¿cuáles son las implicaciones de restringirnos a la terminación de programas?

Simon 'restablece el brillo de Monica'
fuente
2
Incluso es difícil encontrar la secuencia de instrucciones óptima para un solo bloque de código sin ningún flujo de control. El artículo de superoptimización en Wikipedia ofrece una buena introducción (con citas.)
Wandering Logic
El artículo de Wikipedia menciona que la superoptimización analiza secuencias de instrucciones sin bucles. No tener bucles, supongo, es otra forma de decir que termina. Al observar brevemente las referencias disponibles, parece posible pero extremadamente costoso.
Simon 'Reinstate Monica' Shine
2
¿Cuál es el significado de "optimizar" aquí? ¿Tiempo de ejecución más pequeño? Si es así, ¿cuál: el peor de los casos, el caso promedio, todos los casos, algún caso, ...?
Raphael

Respuestas:

16

Supongo que está interesado en la optimización del tiempo de ejecución. Como he escrito en mi comentario, eso no especifica suficientemente el objetivo: ¿una optimización reduce el tiempo de ejecución en cualquier entrada, cada entrada, todas las entradas del peor de los casos o incluso en promedio ?

Mostraré que todos ellos son imposibles. La prueba se extiende a la optimización de la duración del programa.

Recuerde que el siguiente problema no es computable:

Dada una gramática sin contexto con el alfabeto terminal Σ , decida si L ( G ) = Σ .GΣL(G)=Σ

Tenga en cuenta además que, dada una gramática sin contexto , podemos codificar, por ejemplo, el algoritmo CYK para esa gramática; denotar este algoritmo por C Y K G . Observamos que C Y K G termina para todas las entradas (desde Σ ).GCYKGCYKGΣ

Ahora suponga que hay un optimizador que, dado un algoritmo A que siempre termina , genera un algoritmo equivalente al resultado que es óptimo con respecto al tiempo de ejecución. Claramente,OptA

Opt(CYKG)='return true;'L(G)=Σ

y así hemos construido un decisor para un problema incontestable, contradiciendo la suposición.

Rafael
fuente
Gracias por este argumento. Algunas preguntas aclaratorias: ¿Qué es ? Asumo L ( G ) es el lenguaje generado por la gramática G . ΣL(G)G
Simon 'Reinstate Monica' Shine
3
@Simon: es el conjunto de todas las palabras. Raphael: Buena prueba. De hecho, no necesita gramáticas sin contexto; en cambio, dada una máquina Turing M , puede crear un programa P M ( i ) que simule M para los pasos i y devuelva verdadero si la máquina alcanza un estado de aceptación. Entonces OPT ( P M ) sería ' r e t u r n f a l s e ; ' si M no se detiene. ΣMPM(i)MiOPT(PM)'return false;'M
sdcvvc