Esistono compilatori completamente ottimizzati per la chiusura dei programmi?


20

Nel libro di Andrew W. Appel, Modern Compiler Implementation in ML , afferma nel capitolo 17 che la teoria della computabilità mostra che sarà sempre possibile inventare nuove trasformazioni di ottimizzazione e procede per dimostrare che un compilatore completamente ottimizzato risolverà il problema di arresto: un programma Q che non produce output e che non si ferma mai può essere facilmente sostituito dalla sua rappresentazione ottimale, Opt (Q) , essendo "L: goto L". Quindi un compilatore completamente ottimizzato può risolvere il problema di arresto.

Quindi la mia domanda è questa: esiste un compilatore che ottimizza completamente per terminare i programmi? I miei unici pensieri sono i seguenti: anche se un programma è garantito per essere terminato, può comunque essere arbitrariamente complesso, e per qualsiasi compilatore di ottimizzazione concreta, C, si potrebbe forse costruire un programma che accetta C come input e in qualche modo produce un programma peggiore come una specie di custodia ad angolo.

Inoltre, quali sono le implicazioni di limitarci a terminare i programmi?


2
È difficile persino trovare la sequenza di istruzioni ottimale per un singolo blocco di codice senza alcun flusso di controllo. L' articolo di superottimizzazione su Wikipedia offre una buona introduzione (con citazioni.)
Wandering Logic,

L'articolo di Wikipedia menziona che la superottimizzazione esamina sequenze di istruzioni senza loop. Non avere loop, suppongo, è un altro modo di dire che termina. Osservando brevemente i riferimenti disponibili, sembra possibile ma estremamente costoso.
Simon 'Reinstate Monica' Shine,

2
Qual è il significato di "ottimizzare" qui? Runtime più piccolo? In tal caso, quale: caso peggiore, caso medio, caso per caso, caso per caso, ...?
Raffaello

Risposte:


16

Presumo che tu sia interessato all'ottimizzazione del runtime. Come ho scritto nel mio commento, ciò non specifica sufficientemente l'obiettivo: un'ottimizzazione riduce il tempo di esecuzione su qualsiasi input, ogni input, tutti gli input peggiori o anche in media ?

Mostrerò che sono tutti impossibili. La dimostrazione si estende all'ottimizzazione della durata del programma.

Ricordiamo che il seguente problema non è calcolabile:

Data una grammatica senza contesto con alfabeto terminale Σ , decidi se L ( G ) = Σ .GΣL(G)=Σ

Nota inoltre che, data una grammatica senza contesto , possiamo codificare, per esempio, l'algoritmo CYK per quella grammatica; indicare questo algoritmo C Y K G . Osserviamo che C Y K G termina per tutti gli ingressi (da Σ ).GCYKGCYKGΣ

Ora supponiamo che esista un ottimizzatore che, dato un algoritmo sempre terminante A , genera un algoritmo equivalente al risultato che è ottimale rispetto al runtime. Chiaramente,OptA

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

e così abbiamo costruito un decisore per un problema ineccepibile, contraddicendo l'assunto.


Grazie per questa discussione. Alcune domande chiarenti: che cos'è ? Presumo L ( G ) è il linguaggio generato dalla grammatica G . ΣL(G)G
Simon 'Reinstate Monica' Shine,

3
@Simon: è l'insieme di tutte le parole. Raffaello: bella prova. In effetti non hai bisogno di grammatiche senza contesto; invece, data una macchina Turing M è possibile creare un programma P M ( i ) che simula i passaggi M per i e ritorni vero se la macchina raggiunge uno stato accettante. Quindi OPT ( P M ) sarebbe ' r e t u r n f a l s e ; 'ΣMPM(i)MiOPT(PM)'return false;' iff non si ferma. M
sdcvvc,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.