W książce Andrew W. Appela, Modern Compiler Implementation in ML , mówi w rozdziale 17, że teoria obliczalności pokazuje, że zawsze będzie możliwe wynalezienie nowych transformacji optymalizacyjnych i udowadnia, że w pełni optymalizujący kompilator rozwiąże problem zatrzymania: Program Q, który nie wytwarza mocy wyjściowej i nigdy nie zatrzymuje się, można łatwo zastąpić jego optymalną reprezentacją, Opt (Q) , oznaczającą „L: goto L”. Zatem w pełni optymalizujący kompilator może rozwiązać problem zatrzymania.
Moje pytanie brzmi zatem: czy istnieje w pełni optymalizujący kompilator do zamykania programów? Moje jedyne przemyślenia są następujące: Mimo że program ma zagwarantowane zakończenie, wciąż może być arbitralnie złożony, a dla każdego konkretnego kompilatora optymalizującego C można by skonstruować program, który przyjmuje C jako dane wejściowe i w jakiś sposób wytwarza gorszy program jako jakaś skrzynka narożna.
Również Jakie są implikacje ograniczając się do zakończenia programów?
źródło
Odpowiedzi:
Zakładam, że jesteś zainteresowany optymalizacją środowiska uruchomieniowego. Jak napisałem w moim komentarzu, nie określa to w wystarczającym stopniu celu: czy optymalizacja skraca czas działania dla dowolnego wejścia, każdego wejścia, wszystkich danych najgorszych, a nawet średnio ?
Pokażę, że wszystkie są niemożliwe. Dowód obejmuje optymalizację długości programu.
Pamiętaj, że następującego problemu nie można obliczyć:
Zauważ też, że biorąc pod uwagę bezkontekstową gramatykę , możemy na przykład zakodować algorytm CYK dla tej jednej gramatyki; ten algorytm przez . Zauważamy, że kończy się dla wszystkich danych wejściowych (od ).G CYKG CYKG Σ∗
Załóżmy teraz, że nie jest optymalizator , który podawany jest zawsze zakończenia algorytm , wysyła wynik algorytmu równoważne który jest optymalny w odniesieniu do wykonywania. Wyraźnie,Opt A
i w ten sposób skonstruowaliśmy czynnik rozstrzygający dla problemu nieobliczalnego, co jest sprzeczne z założeniem.
źródło