Apakah kompiler optimalisasi penuh untuk mengakhiri program ada?

20

Dalam buku Andrew W. Appel, Implementasi Kompiler Modern dalam ML , ia mengatakan di bawah bab 17 bahwa teori Komputasi menunjukkan bahwa akan selalu mungkin untuk menciptakan transformasi optimisasi baru dan hasil untuk membuktikan bahwa kompiler yang mengoptimalkan sepenuhnya akan menyelesaikan masalah yang terhenti: Sebuah program Q yang tidak menghasilkan output dan tidak pernah berhenti dapat dengan mudah digantikan oleh representasi optimalnya, Opt (Q) , menjadi "L: goto L". Jadi kompiler yang sepenuhnya mengoptimalkan dapat memecahkan masalah penghentian.

Jadi pertanyaan saya adalah ini: Apakah ada kompiler yang mengoptimalkan sepenuhnya ada untuk mengakhiri program? Pikiran saya satu-satunya adalah sebagai berikut: Meskipun sebuah program dijamin akan berakhir, ia masih bisa rumit, dan untuk setiap kompiler pengoptimal yang konkret, C, orang mungkin dapat membangun sebuah program yang mengambil C sebagai input dan entah bagaimana menghasilkan program yang lebih buruk seperti semacam kasus sudut.

Juga, Apa implikasi dari membatasi diri kita sendiri untuk menghentikan program?

Simon 'Reinstate Monica' Shine
sumber
2
Sulit bahkan untuk menemukan urutan instruksi optimal untuk satu blok kode tanpa aliran kontrol sama sekali. The superoptimization artikel di Wikipedia memberikan intro yang baik (dengan kutipan.)
Berkelana Logika
Artikel Wikipedia menyebutkan bahwa superoptimisasi melihat urutan instruksi tanpa loop. Tidak memiliki loop, saya kira, adalah cara lain untuk mengatakan bahwa itu berakhir. Dari melihat sekilas referensi yang tersedia, tampaknya mungkin tetapi sangat mahal.
Simon 'Reinstate Monica' Shine
2
Apa arti dari "mengoptimalkan" di sini? Runtime yang lebih kecil? Jika demikian, yang: kasus terburuk, kasus rata-rata, setiap kasus, beberapa kasus, ...?
Raphael

Jawaban:

16

Saya menganggap Anda tertarik pada optimasi runtime. Seperti yang saya sudah menulis dalam komentar saya, yang tidak cukup menentukan tujuan: apakah optimasi mengurangi runtime pada setiap masukan, setiap masukan, semua kasus terburuk input atau bahkan rata-rata ?

Saya akan menunjukkan bahwa mereka semua tidak mungkin. Buktinya meluas hingga mengoptimalkan panjang program.

Ingatlah bahwa masalah berikut ini tidak dapat dihitung:

Dengan tata bahasa bebas konteks dengan alfabet terminal Σ , putuskan apakah L ( G ) = Σ .GΣL(G)=Σ

Perhatikan lebih lanjut bahwa dengan diberikan tata bahasa bebas konteks , kita dapat melakukan hardcode, katakanlah, algoritma CYK untuk tata bahasa yang satu itu; menunjukkan algoritma ini dengan C Y K G . Kita mengamati bahwa C Y K G berakhir untuk semua masukan (dari Σ * ).GCYKGCYKGΣ

Sekarang asumsikan bahwa ada optimiser yang, mengingat algoritma selalu terminating A , menghasilkan algoritma yang setara dengan hasil yang optimal sehubungan dengan runtime. Jelas,OptA

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

dan dengan demikian kami telah membangun penentu untuk masalah yang tidak dapat dihitung, bertentangan dengan asumsi.

Raphael
sumber
Terima kasih atas argumen ini. Beberapa pertanyaan klarifikasi: Apa itu ? Saya menganggap L ( G ) adalah bahasa yang dihasilkan oleh tata bahasa G . ΣL(G)G
Simon 'Reinstate Monica' Shine
3
ΣM.PM.(saya)M.sayaMEMILIH(PM.)M'retkamurn fSebuahlse;'M.