Dựa trên câu trả lời của Charles, khó khăn chính trong lý thuyết về ngôn ngữ lập trình là khái niệm tự nhiên về sự tương đương của các chương trình thường không phải là sự bình đẳng nghiêm ngặt trong ngữ nghĩa toán học đơn giản nhất mà bạn có thể đưa ra, hoặc trong mô hình máy cơ bản. Ví dụ, hãy xem xét bit sau của mã giống như Java:
Object x = new Object();
Object y = new Object();
... some more code ...
Vì vậy, chương trình này tạo một đối tượng và đặt tên là x, sau đó tạo một đối tượng thứ hai có tên y, và sau đó tiếp tục thực thi thêm một số mã. Bây giờ, giả sử rằng một lập trình viên quyết định lật thứ tự phân bổ của hai đối tượng này:
Object y = new Object();
Object x = new Object();
... some more code ...
Bây giờ, đặt câu hỏi: việc tái cấu trúc này có thay đổi hành vi của chương trình không? Một mặt, trên máy bên dưới, x và y sẽ được phân bổ tại các vị trí khác nhau trong hai lần chạy chương trình. Vì vậy, trong ý nghĩa này, chương trình hành xử khác nhau.
Nhưng trong một ngôn ngữ giống như Java, bạn chỉ có thể kiểm tra các tham chiếu cho sự bằng nhau chứ không phải theo thứ tự, vì vậy đây là một sự khác biệt mà "một số mã nữa" không thể quan sát được . Do đó, hầu hết các lập trình viên sẽ mong đợi rằng việc đảo ngược thứ tự sẽ không có gì khác biệt với câu trả lời cuối cùng, và hầu hết các nhà văn biên dịch đều mong muốn có thể thực hiện sắp xếp lại và tối ưu hóa trên cơ sở này. (Mặt khác, trong ngôn ngữ giống như C, bạn có thể so sánh các con trỏ để đặt hàng, bằng cách chuyển chúng thành các số nguyên trước, và do đó, việc sắp xếp lại này không nhất thiết bảo tồn hành vi có thể quan sát được.)
Một trong những câu hỏi trọng tâm của ngữ nghĩa là trả lời câu hỏi khi nào hai chương trình tương đương nhau. Do khái niệm quan sát của chúng tôi phụ thuộc vào các tính năng của ngôn ngữ lập trình, chúng tôi kết thúc với một định nghĩa như "hai chương trình tương đương nhau khi không có chương trình khách hàng nào có thể tính toán các câu trả lời khác nhau dựa trên việc nhận các chương trình đó làm đầu vào". Việc định lượng trên tất cả các chương trình máy khách là điều gây khó khăn cho câu hỏi này - có vẻ như cuối cùng bạn phải nói điều gì đó về tất cả các chương trình khách hàng có thể để nói điều gì đó về hai đoạn mã cụ thể.
Thủ thuật với ngữ nghĩa học biểu thị là đưa ra một diễn giải toán học cho phép bạn tránh sự định lượng phổ quát này - bạn nói rằng ý nghĩa của một đoạn mã là một giá trị toán học nào đó, và bạn so sánh chúng bằng cách kiểm tra xem chúng có bằng nhau về mặt toán học hay không không phải. Đây là cục bộ (nghĩa là thành phần) và không liên quan đến định lượng trên tất cả các khách hàng có thể. .
Nhưng có nghĩa là bạn cần đảm bảo rằng ngữ nghĩa học biểu thị xác nhận những tương đương đó. Vì vậy, trong ví dụ này, nếu bạn muốn đưa ra một ngữ nghĩa biểu thị cho ngôn ngữ giống như Java này, bạn cần đảm bảo không chỉ việc gọi mới mất một đống và trả lại cho bạn một đống mới với đối tượng mới được tạo, mà đó là ý nghĩa của chương trình là bất biến giống nhau dưới mọi hoán vị của heap đầu vào. Điều này có thể liên quan đến các cấu trúc toán học khá phức tạp (ví dụ, trong trường hợp này làm việc trong một thể loại đảm bảo mọi thứ hoạt động theo mô đun một nhóm hoán vị phù hợp).