Câu hỏi khá rộng. Để trả lời nó trong một không gian hợp lý tôi sẽ thực hiện nhiều đơn giản hóa.
Hãy để chúng tôi đồng ý về thuật ngữ. Một chương trình là chính xác khi nó ngụ ý đặc điểm kỹ thuật của nó. Tuyên bố mơ hồ này được thực hiện chính xác theo nhiều cách, bằng cách xác định chính xác chương trình là gì và chính xác là gì. Ví dụ, trong mô hình kiểm tra chương trình là cấu trúc Kripke và đặc tả thường là công thức LTL . Hoặc, chương trình có thể là một danh sách các hướng dẫn PowerPC và thông số kỹ thuật có thể là một tập hợp các xác nhận Hoare-Floyd được viết bằng, giả sử, logic thứ nhất. Có rất nhiều biến thể có thể. Thật hấp dẫn khi kết luận rằng trong một trường hợp (cấu trúc Kripke), chúng tôi không xác minh một chương trình thực tế, trong trường hợp thứ hai (danh sách các hướng dẫn PowerPC) chúng tôi làm. Tuy nhiên, điều quan trọng là nhận ra chúng ta thực sự đang xem xét các mô hình toán học trong cả hai trường hợp, và điều này là hoàn toàn tốt. (Tình huống khá giống với vật lý, ví dụ, cơ học cổ điển là một mô hình toán học của thực tế.)
Hầu hết các chính thức phân biệt giữa cú pháp và ngữ nghĩa của một chương trình; đó là, nó được thể hiện như thế nào và nó có nghĩa gì. Các ngữ nghĩa của một chương trình là những gì được tính từ quan điểm xác minh chương trình. Nhưng, tất nhiên điều quan trọng là phải có một cách rõ ràng để gán ý nghĩa cho (các biểu diễn cú pháp của) các chương trình. Hai cách phổ biến như sau:
- (bước nhỏ) ngữ nghĩa hoạt động : Điều này rất giống với việc xác định ngôn ngữ lập trình bằng cách viết một trình thông dịch cho nó. Đối với điều này, bạn cần nói trạng thái là gì và nó bị ảnh hưởng bởi mỗi câu trong ngôn ngữ. (Bạn có thể tự hỏi ngôn ngữ nào bạn viết trình thông dịch, nhưng tôi sẽ giả vờ như bạn không biết.)
- ngữ nghĩa tiên đề : Ở đây mỗi loại câu lệnh đi kèm với một lược đồ tiên đề. Vì vậy, đại khái, bất cứ khi nào một tuyên bố cụ thể của loại đó được sử dụng, nó có nghĩa là có thể sử dụng các tiên đề nhất định. Ví dụ: phép gán đi kèm với lược đồ { P [ x / e ] }x : = e ; phép gán cụ thể x : = x + 1 đi kèm với tiên đề { x + 1 = 1 }{ P[ x / e ] }x : = e{ P}x : = x + 1 nếu chúng ta khởi tạo lược đồ với P = ( x = 1 ) .{ x + 1 = 1 }x : = x + 1{ x = 1 }P= ( x = 1 )
(Có những thứ khác. Tôi cảm thấy đặc biệt tệ khi bỏ qua ngữ nghĩa học biểu thị, nhưng câu trả lời này đã dài.) Mã máy cộng với ngữ nghĩa hoạt động khá gần với cái mà hầu hết mọi người gọi là 'chương trình thực'. Dưới đây là một bài báo chuyên đề, sử dụng ngữ nghĩa hoạt động cho một tập hợp con của mã máy DEC Alpha:
Tại sao bạn sẽ sử dụng một số ngữ nghĩa cấp cao hơn, như các tiên đề? Khi bạn không muốn bằng chứng chính xác của mình phụ thuộc vào phần cứng mà bạn chạy. Cách tiếp cận sau đó là chứng minh tính đúng đắn của thuật toán đối với một số ngữ nghĩa cấp cao thuận tiện, và sau đó chứng minh rằng ngữ nghĩa đối với ngữ nghĩa cấp thấp gần với máy móc thực tế hơn.
Tóm lại, tôi có thể nghĩ ra ba lý do dẫn đến câu hỏi của bạn:
- Bạn chỉ thấy các ngữ nghĩa cấp cao trông không giống với những gì bạn được sử dụng để gọi một chương trình, và bạn tự hỏi liệu có những ngữ nghĩa cấp thấp không. Câu trả lời là có.
- Bạn tự hỏi làm thế nào bạn chứng minh rằng một mô hình tương ứng với thực tế. Giống như trong vật lý, bạn không. Bạn chỉ cần đưa ra các mô hình tốt hơn và kiểm tra chúng chống lại thực tế.
- Bạn chưa thấy sự khác biệt giữa cú pháp và ngữ nghĩa và nhiều cách khác nhau để gán nghĩa cho các chương trình. Hai câu hỏi trước liệt kê một số cuốn sách.
Câu trả lời này chỉ đơn thuần là cố gắng xác định ba cách khác nhau để tôi hiểu câu hỏi. Đi sâu vào bất kỳ điểm nào trong số này sẽ cần rất nhiều không gian.