Chạy chương trình ngược


7

Tôi không bao giờ sử dụng một trình gỡ lỗi có thể chạy một chương trình ngược nhưng tôi muốn. Bây giờ tôi tự hỏi nếu có nhiều bằng chứng và lý thuyết về lập trình chạy ngược, khi nào và tại sao một chương trình có thể được chạy ngược lại hoặc khi nào và tại sao không?

Theo trực giác tôi thấy rằng máy tính sẽ có thể chạy chương trình ngược, nếu nó đã chạy chương trình về phía trước biết rằng chương trình sẽ chạy ngược lại do đó lưu các trạng thái của chương trình mà có thể bị mất và bị hủy.

Gỡ lỗi chỉ là một ví dụ thực tế. Tôi cũng quan tâm đến nó vì lý thuyết về tính thuận nghịch, nếu chương trình có thể chạy ngược lại, thì những gì chương trình làm là có thể đảo ngược, phải không?


1
Tôi đã suy nghĩ về gỡ lỗi ngược trước đây từ một quan điểm thực tế. Tôi nghĩ nó sẽ là một plugin giết người cho bất kỳ IDE nào. Có một số quan sát ban đầu rõ ràng: 1. Khi ghi vào một biến trong chế độ chuyển tiếp, bạn cần lưu trữ trạng thái trước đó (ví dụ: chi phí này ~ 2,4 GB bộ nhớ / s). 2. Nếu bạn muốn tránh bộ nhớ thêm, bạn có thể chạy lại chương trình theo dòng bạn muốn gỡ lỗi trở lại. 3. Bạn có thể thực hiện một sự đánh đổi giữa hai điểm trước đó. 4. Nó không hoạt động nếu chương trình có tác dụng phụ, chẳng hạn như thực hiện cuộc gọi REST.
Albert Hendriks

Câu trả lời:


3

Về lý thuyết, để thực sự chạy chương trình ngược sẽ yêu cầu bạn hoàn tác mọi tác động của việc thực hiện chương trình. Làm điều đó sẽ tương đối đơn giản, nếu không hiệu quả, để thay đổi bộ nhớ, khó hơn cho những thay đổi trên đĩa và không thể kết nối mạng. Và nếu mã phụ thuộc vào bất kỳ trạng thái bên ngoài nào (thời gian trong ngày, tệp trên đĩa có thể được sửa đổi bởi một quy trình khác), tua lại và chạy lại nó sẽ không tạo ra kết quả tương tự.

Trong thực tế, điều có thể là cho phép bạn xem trạng thái của chương trình tại một số điểm trong quá trình thực thi, nhưng không cho phép bạn khởi động lại từ thời điểm đó. Theo cách này, không có vấn đề gì với trạng thái bên ngoài, bởi vì hình thức tua lại này không cần hoàn tác bất kỳ thay đổi trạng thái nào (ngoại trừ bộ nhớ) và bước chuyển tiếp sẽ luôn tạo ra kết quả tương tự (vì mã không thực sự được thực thi lại). Hình thức tua lại này được triển khai trong Visual Studio, dưới tên Gỡ lỗi lịch sử , mặc dù nó không ghi lại trạng thái chương trình ở mọi hướng dẫn hoặc dòng mã, chỉ trong mỗi lệnh gọi phương thức.


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.