Sự phức tạp ngày càng tăng của các chương trình máy tính và các máy tính có vị trí ngày càng quan trọng trong xã hội khiến tôi tự hỏi tại sao chúng ta vẫn không sử dụng chung các ngôn ngữ lập trình mà bạn phải đưa ra bằng chứng chính thức rằng mã của bạn hoạt động chính xác.
Tôi tin rằng thuật ngữ này là một 'trình biên dịch chứng nhận' (tôi đã tìm thấy nó ở đây ): một trình biên dịch biên dịch một ngôn ngữ lập trình, trong đó người ta không chỉ phải viết mã, mà còn nêu rõ đặc tả của mã và chứng minh rằng mã tuân thủ đặc điểm kỹ thuật (hoặc sử dụng một prover tự động để làm như vậy).
Trong khi tìm kiếm trên internet, tôi chỉ tìm thấy các dự án sử dụng ngôn ngữ lập trình rất đơn giản hoặc các dự án thất bại cố gắng điều chỉnh các ngôn ngữ lập trình hiện đại. Điều này dẫn tôi đến câu hỏi của tôi:
Có bất kỳ trình biên dịch chứng nhận nào thực hiện một ngôn ngữ lập trình toàn diện, hay điều này rất khó / về mặt lý thuyết là không thể?
Ngoài ra, tôi chưa thấy bất kỳ lớp phức tạp nào liên quan đến các chương trình có thể chứng minh được, chẳng hạn như 'lớp của tất cả các ngôn ngữ có thể quyết định bằng máy Turing có bằng chứng cho thấy máy Turing này tạm dừng', mà tôi sẽ gọi , tương tự như , tập hợp các ngôn ngữ đệ quy.
Tôi có thể thấy những lợi thế của việc nghiên cứu một lớp phức tạp như vậy: ví dụ, đối với , vấn đề Ngừng là có thể quyết định (tôi thậm chí còn phỏng đoán được định nghĩa theo cách rõ ràng sẽ là lớp ngôn ngữ lớn nhất mà nó có thể quyết định được). Ngoài ra, tôi nghi ngờ chúng tôi sẽ loại trừ bất kỳ chương trình thực tế hữu ích nào: ai sẽ sử dụng chương trình khi bạn không thể chứng minh chương trình đó chấm dứt?
Vì vậy, câu hỏi thứ hai của tôi là:
Chúng ta biết gì về các lớp phức tạp đòi hỏi ngôn ngữ chứa chúng phải có các thuộc tính nhất định?