Sto scrivendo un linguaggio compilato per divertimento, e recentemente ho ottenuto un calcio per rendere il mio compilatore di ottimizzazione molto robusto. Ho trovato diversi modi per ottimizzare alcune cose, per esempio, 2 + 2 è sempre 4, quindi possiamo fare quella matematica in fase di compilazione, se (false) {...} può essere rimosso completamente, ecc., Ma ora Ho ottenuto loop. Dopo alcune ricerche, penso che quello che sto cercando di fare non è esattamente lo srotolamento del loop, ma è ancora una tecnica di ottimizzazione. Lasciatemi spiegare.Ottimizzazione dei loop "statici"
Prendere il seguente codice.
String s = "";
for(int i = 0; i < 5; i++){
s += "x";
}
output(s);
Come essere umano, posso sedermi qui e dirvi che questo è il 100% del tempo sarà equivalente a
output("xxxxx");
Quindi, in altre parole, questo ciclo può essere "compilato fuori "interamente. Non è lo srotolamento del ciclo, ma quello che sto definendo "completamente statico", ovvero non ci sono input che potrebbero modificare il comportamento del segmento. La mia idea è che tutto ciò che è completamente statico può essere risolto con un singolo valore, tutto ciò che si basa sull'input o rende ovviamente non ottimizzabile l'output condizionale. Quindi, dal punto di vista della macchina, cosa devo considerare? Cosa rende un loop "completamente statico?"
Ho creato tre tipi di cicli che ho bisogno di capire come classificare. Cicli che finiranno sempre con lo stesso stato macchina dopo ogni corsa, indipendentemente da input, loop che NON si completeranno MAI e loop che non riesco a capire in un modo o nell'altro. Nel caso in cui non riesco a capirlo (cambia condizionatamente quante volte verrà eseguito in base agli input dinamici), non sono preoccupato dell'ottimizzazione. I loop che sono infiniti saranno un errore/avviso di compilazione a meno che non siano specificamente soppressi dal programmatore, e cicli che sono sempre gli stessi dovrebbero saltare direttamente alla messa nello stato corretto, senza loop.
Il caso principale naturalmente di ottimizzare è l'iterazione del ciclo statico, quando anche tutte le chiamate di funzione all'interno sono statiche. Determinare se un loop ha componenti dinamici è abbastanza facile, e se non è dinamico, immagino che debba essere statico. La cosa che non riesco a capire è come scoprire se sarà infinito o no. Qualcuno ha qualche idea su questo? So che questo è un sottoinsieme del problema dell'arresto, ma ritengo che sia risolvibile; il problema dell'arresto è un problema dovuto al fatto che per alcuni sottoinsiemi di programmi, non si può dire che potrebbe durare all'infinito, potrebbe non esserlo, ma non voglio prendere in considerazione quei casi, voglio solo considerare i casi dove si fermerà, o non si fermerà, ma prima devo distinguere tra i tre stati.
Per avere un'idea di ciò che è effettivamente supportato su questa linea al momento attuale, si potrebbe voler leggere le limitazioni su 'constexpr' nel nuovo standard C++. –
Se è possibile determinare staticamente che la condizione del ciclo è sempre true e non c'è altro modo per uscire dal ciclo, si sa che il ciclo non si interromperà. –
Nel tuo esempio, non devi necessariamente sapere che anche String s non viene modificato da un altro file che fa riferimento a extern e lo modifica in un thread parallelo. – TJD