Do trình tối ưu hóa đầy đủ cho các chương trình chấm dứt tồn tại?


20

Trong cuốn sách của Andrew W. Appel, Modern Compiler Thực hiện trong ML , ông nói trong chương 17 rằng lý thuyết tính toán cho thấy rằng sẽ luôn luôn có thể phát minh ra các phép biến đổi tối ưu hóa mới và tiến hành chứng minh rằng trình biên dịch tối ưu hóa hoàn toàn sẽ giải quyết vấn đề tạm dừng: Một chương trình Q không tạo ra đầu ra và không bao giờ dừng lại có thể dễ dàng được thay thế bằng đại diện tối ưu của nó, Opt (Q) , là "L: goto L". Vì vậy, một trình biên dịch tối ưu hóa hoàn toàn có thể giải quyết vấn đề tạm dừng.

Vì vậy, câu hỏi của tôi là: Trình biên dịch tối ưu hóa hoàn toàn có tồn tại để kết thúc chương trình không? Suy nghĩ duy nhất của tôi là như sau: Mặc dù một chương trình được đảm bảo chấm dứt, nó vẫn có thể phức tạp tùy ý và đối với bất kỳ trình biên dịch tối ưu hóa cụ thể nào, C, người ta có thể xây dựng một chương trình lấy C làm đầu vào và bằng cách nào đó tạo ra một chương trình tồi tệ hơn một số loại trường hợp góc.

Ngoài ra, những tác động của việc hạn chế bản thân chúng ta để chấm dứt các chương trình là gì?


2
Thậm chí khó có thể tìm thấy chuỗi lệnh tối ưu cho một khối mã duy nhất không có luồng điều khiển nào cả. Các superoptimization bài viết trên Wikipedia đưa ra một giới thiệu tốt (với trích dẫn.)
Wandering logic

Bài viết trên Wikipedia đề cập đến việc siêu tối ưu hóa xem xét các chuỗi hướng dẫn không có vòng lặp. Không có vòng lặp, tôi cho rằng, là một cách khác để nói rằng nó chấm dứt. Từ việc xem xét ngắn gọn các tài liệu tham khảo có sẵn, nó dường như có thể nhưng cực kỳ tốn kém.
Simon 'Hồi phục lại' Shine '

2
Ý nghĩa của "tối ưu hóa" ở đây là gì? Thời gian chạy nhỏ hơn? Nếu vậy, đó là: trường hợp xấu nhất, trường hợp trung bình, mọi trường hợp, một số trường hợp, ...?
Raphael

Câu trả lời:


16

Tôi giả sử bạn quan tâm đến việc tối ưu hóa thời gian chạy. Như tôi đã viết trong bình luận của mình, điều đó không đủ xác định mục tiêu: tối ưu hóa có làm giảm thời gian chạy trên mọi đầu vào, mọi đầu vào, tất cả các đầu vào trong trường hợp xấu nhất hoặc thậm chí trung bình không?

Tôi sẽ chỉ ra rằng tất cả chúng là không thể. Bằng chứng mở rộng để tối ưu hóa thời lượng của chương trình.

Hãy nhớ lại rằng vấn đề sau không thể tính toán được:

Với một bối cảnh tự do văn phạm với bảng chữ cái terminal Σ , quyết định xem L ( G ) = Σ * .GΣL(G)=Σ

Ngoài ra, xin lưu ý rằng với một ngữ pháp ngữ cảnh , chúng ta có thể mã hóa, thuật toán CYK cho một ngữ pháp đó; biểu thị thuật toán này bằng C Y K G . Chúng tôi quan sát thấy C Y K G chấm dứt cho tất cả các đầu vào (từ Σ ).GCYKGCYKGΣ

Bây giờ giả sử rằng có một tối ưu hóa, với thuật toán A luôn luôn kết thúc , sẽ đưa ra một thuật toán tương đương với kết quả, là tối ưu đối với thời gian chạy. Thông suốt,OptA

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

và do đó chúng tôi đã xây dựng một người quyết định cho một vấn đề không thể giải quyết được, mâu thuẫn với giả định.


ΣL(G)G

3
ΣMPM(i)MiOPT(PM)'return false;'M
sdcvvc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.