Чи існують повністю оптимізуючі компілятори для завершення програм?


20

У книзі Ендрю У. Аппеля " Сучасне впровадження компілятора в ML" він говорить, що в розділі 17 теорія обчислюваності показує, що завжди можна буде винайти нові оптимізуючі перетворення і перейти до доказу, що повністю оптимізуючий компілятор вирішить проблему зупинки: Програма Q, який не дає виходу і ніколи не зупиняється, може бути легко замінений його оптимальним поданням, Opt (Q) , який є "L: goto L". Таким чином, повністю оптимізуючий компілятор може вирішити проблему зупинки.

Отже, моє запитання таке: чи існує повністю оптимізуючий компілятор для завершення програм? Мої єдині думки наступні: Хоча програма гарантовано припиняється, вона все ще може бути довільно складною, і для будь-якого конкретного оптимізуючого компілятора C, можливо, можна побудувати програму, яка сприймає C як вхідний сигнал і якось видає гіршу програму як якась кутова справа.

Крім того, які наслідки обмеження себе в припиненні програм?


2
Важко навіть знайти оптимальну послідовність інструкцій для одного блоку коду без потоку управління. Superoptimization стаття у Вікіпедії дає гарне введення (з цитатами.)
блукаючих Logic

У статті Вікіпедії згадується, що супероптимізація розглядає послідовність інструкцій, що не мають циклу. Я не маю петель, я думаю, це ще один спосіб сказати, що він закінчується. Якщо коротко ознайомитися з наявними посиланнями, це здається можливим, але надзвичайно дорогим.
Саймон 'Відновити Моніку' блиск

2
Яке значення тут "оптимізувати"? Менший час виконання? Якщо так, то: найгірший, середній, кожен, окремий, ...?
Рафаель

Відповіді:


16

Я припускаю, що ви зацікавлені в оптимізації часу виконання. Як я вже писав у своєму коментарі, це не вказує достатньо мети: чи оптимізація зменшує час виконання на будь-якому вході, на кожному вході, на всі гірші випадки або навіть у середньому ?

Я покажу, що всі вони неможливі. Доказ поширюється на оптимізацію тривалості програми.

Нагадаємо, що наступна проблема не обчислюється:

Давши без контексту граматику з термінальним алфавітом Σ , вирішіть, чи L ( G ) = Σ .GΣL(G)=Σ

Крім того, зауважимо, що з урахуванням без контексту граматики ми можемо жорстко кодувати, скажімо, алгоритм CYK для цієї однієї граматики; Позначимо цей алгоритм на C У K G . Ми спостерігаємо, що C Y K G закінчується для всіх входів (від Σ ).GCYKGCYKGΣ

Тепер припустимо, що існує оптимізатор який з урахуванням алгоритму A , який завжди закінчується , виводить алгоритм, еквівалентний результатам, який є оптимальним щодо часу виконання. Зрозуміло,ОптA

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

і таким чином ми побудували рішення для непереборної проблеми, що суперечить припущенню.


Дякую за цей аргумент. Кілька уточнюючих питань: Що таке ? Я вважаю , L ( G ) є мова , що породжується граматикою G . ΣL(G)G
Simon 'Reinstate Monica' Shine

3
@Simon: - це сукупність усіх слів. Рафаель: Гарний доказ. Насправді вам не потрібні контекстні граматики; натомість, задавши машину Тюрінга M, ви можете створити програму P M ( i ), яка імітує M для i кроків і повертає true, якщо машина досягає прийнятого стану. Тоді OPT ( P M ) було б ' r e t u r n f a l s e ; ' iff M не зупиняється. ΣMPM(i)MiOPT(PM)'return false;'M
sdcvvc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.