Existem otimizadores completos para a finalização de programas?

20

No livro de Andrew W. Appel, Modern Compiler Implementation in ML , ele diz no capítulo 17 que a teoria da Computabilidade mostra que sempre será possível inventar novas transformações de otimização e prossegue para provar que um compilador totalmente otimizado resolverá o problema de parada: Um programa Q que não produz saída e nunca pára pode ser facilmente substituído por sua representação ideal, Opt (Q) , sendo "L: goto L". Portanto, um compilador totalmente otimizado pode resolver o problema de parada.

Portanto, minha pergunta é a seguinte: Existe um compilador totalmente otimizado para finalizar programas? Meus únicos pensamentos são os seguintes: Mesmo que um programa seja garantido para terminar, ele ainda pode ser arbitrariamente complexo e, para qualquer compilador de otimização concreto, C, talvez seja possível construir um programa que tome C como entrada e, de alguma forma, produza um programa pior. algum tipo de caixa de canto.

Além disso, quais são as implicações de nos restringir ao encerramento de programas?

Simon 'Reinstate Monica' Shine
fonte
2
É difícil até encontrar a sequência de instruções ideal para um único bloco de código sem fluxo de controle. O superoptimization artigo sobre Wikipedia dá uma boa introdução (com citações.)
Wandering Logic
O artigo da Wikipedia menciona que a super otimização analisa seqüências de instruções sem loop. Não ter laços, suponho, é outra maneira de dizer que termina. Ao olhar brevemente para as referências disponíveis, parece ser possível, mas extremamente caro.
Simon 'Reinstate Monica' Shine
2
Qual é o significado de "otimizar" aqui? Menor tempo de execução? Em caso afirmativo, qual: pior caso, caso médio, todo caso, algum caso, ...?
Raphael

Respostas:

16

Presumo que você esteja interessado em otimização do tempo de execução. Como escrevi em meu comentário, isso não especifica suficientemente o objetivo: uma otimização reduz o tempo de execução de qualquer entrada, cada entrada, todas as entradas de pior caso ou até em média ?

Vou mostrar que todos eles são impossíveis. A prova se estende para otimizar a duração do programa.

Lembre-se de que o seguinte problema não é computável:

Dada uma gramática livre de contexto com alfabeto terminal , decida se .GΣeu(G)=Σ

Observe ainda que, dada uma gramática livre de contexto , podemos codificar, digamos, o algoritmo CYK dessa gramática; denote esse algoritmo por . Observamos que termina para todas as entradas (de ).GCYKGCYKGΣ

Agora suponha que exista um otimizador que, dado um algoritmo sempre terminador , produza um algoritmo equivalente a resultado que seja ideal em relação ao tempo de execução. Claramente,OptarUMA

Optar(CYKG)="retvocêrn trvocêe;"eu(G)=Σ

e assim construímos uma decisão para um problema incontestável, contradizendo a suposição.

Rafael
fonte
Obrigado por este argumento. Algumas perguntas esclarecedoras: O que é ? Presumo é a linguagem gerada pela gramática . Σeu(G)G
Simon 'Reinstate Monica' Shine
3
@ Simon: é o conjunto de todas as palavras. Rafael: Boa prova. Na verdade, você não precisa de gramáticas livres de contexto; em vez disso, dada uma máquina de Turing você pode criar um programa que simula etapas para e retorna verdadeiro se a máquina atingir um estado de aceitação. Então seria se não parar. ΣMPM(Eu)MEuOPTAR(PM)"retvocêrn fumaeuse;"M
Sdcvvc