จากคำตอบของ Charles ปัญหาหลักในทฤษฎีภาษาการเขียนโปรแกรมก็คือความคิดตามธรรมชาติของความเท่าเทียมกันของโปรแกรมโดยทั่วไปจะไม่เท่าเทียมกันอย่างเข้มงวดทั้งในความหมายทางคณิตศาสตร์ที่ตรงไปตรงมาที่สุดที่คุณสามารถให้ ตัวอย่างเช่นลองพิจารณาโค้ดที่คล้ายจาวาต่อไปนี้:
Object x = new Object();
Object y = new Object();
... some more code ...
ดังนั้นโปรแกรมนี้สร้างวัตถุและตั้งชื่อเป็น x จากนั้นสร้างวัตถุที่สองที่ชื่อ y แล้วดำเนินการโค้ดเพิ่มเติมอีก ทีนี้สมมติว่าโปรแกรมเมอร์ตัดสินใจที่จะพลิกลำดับการจัดสรรของวัตถุทั้งสองนี้:
Object y = new Object();
Object x = new Object();
... some more code ...
ตอนนี้ถามคำถาม: การเปลี่ยนโครงสร้างใหม่นี้เปลี่ยนพฤติกรรมของโปรแกรมหรือไม่ ในอีกด้านหนึ่งบนเครื่องต้นแบบ x และ y จะได้รับการจัดสรรในสถานที่ต่าง ๆ ในการรันโปรแกรมสองครั้ง ดังนั้นในแง่นี้โปรแกรมทำงานต่างกัน
แต่ในภาษาที่เหมือนชวาคุณสามารถทดสอบการอ้างอิงเพื่อความเท่าเทียมกันเท่านั้นและไม่เป็นระเบียบดังนั้นนี่คือความแตกต่างที่ "บางรหัสเพิ่มเติม" ไม่สามารถสังเกตได้ เป็นผลให้โปรแกรมเมอร์ส่วนใหญ่คาดว่าการกลับคำสั่งซื้อจะไม่สร้างความแตกต่างให้กับคำตอบสุดท้ายและผู้เขียนคอมไพเลอร์ส่วนใหญ่คาดว่าจะสามารถทำการเรียงลำดับใหม่และปรับให้เหมาะสมบนพื้นฐานนี้ (ในอีกทางหนึ่งในภาษาที่คล้าย C คุณสามารถเปรียบเทียบตัวชี้สำหรับการสั่งซื้อโดยการชี้ไปที่จำนวนเต็มก่อนดังนั้นการเรียงลำดับนี้ไม่จำเป็นต้องรักษาพฤติกรรมที่สังเกตได้)
หนึ่งในคำถามสำคัญของความหมายคือการตอบคำถามเมื่อทั้งสองโปรแกรมมีความเท่าเทียมกันอย่างสังเกตได้ เนื่องจากแนวคิดในการสังเกตของเราขึ้นอยู่กับคุณสมบัติของภาษาการเขียนโปรแกรมเราจึงจบด้วยคำจำกัดความเช่น "สองโปรแกรมนั้นเทียบเท่ากันเมื่อไม่มีโปรแกรมไคลเอนต์สามารถคำนวณคำตอบที่แตกต่างกันโดยขึ้นอยู่กับการรับโปรแกรมเหล่านั้นเป็นอินพุต" ปริมาณของโปรแกรมไคลเอนต์ทั้งหมดคือสิ่งที่ทำให้คำถามนี้ยาก - ดูเหมือนว่าคุณต้องพูดอะไรบางอย่างเกี่ยวกับโปรแกรมไคลเอนต์ที่เป็นไปได้ทั้งหมดเพื่อพูดบางอย่างเกี่ยวกับโค้ดสองชิ้น
เคล็ดลับที่มีความหมายเชิง Denotational คือการตีความทางคณิตศาสตร์ที่ให้คุณหลีกเลี่ยงการหาปริมาณสากล - คุณบอกว่าความหมายของรหัสหนึ่งชิ้นเป็นค่าทางคณิตศาสตร์และคุณเปรียบเทียบมันโดยการตรวจสอบเพื่อดูว่าพวกมันเท่าเทียมกันทางคณิตศาสตร์หรือไม่ ไม่. นี่คือท้องถิ่น (เช่นเรียงความ) และไม่เกี่ยวข้องกับปริมาณมากกว่าลูกค้าที่เป็นไปได้ทั้งหมด (คุณจำเป็นต้องแสดงให้เห็นว่าความหมายเชิง Denotational หมายถึงความเท่าเทียมกันเชิงบริบทเพื่อให้เป็นเสียงแน่นอนเมื่อมันเสร็จสมบูรณ์ - เมื่อความเท่าเทียมกันในเชิงสมการเชิงตรงเหมือนกันกับบริบทที่เท่าเทียมกันเราพูดว่าความหมายคือ "นามธรรมอย่างเต็มที่")
แต่หมายความว่าคุณต้องมั่นใจว่าความหมายเชิง Denotational ตรวจสอบความถูกต้องเหล่านั้น ดังนั้นสำหรับตัวอย่างนี้หากคุณต้องการให้ความหมายเชิง Denotational สำหรับภาษาที่เหมือน Java นี้คุณต้องมั่นใจว่าการเรียกใช้ใหม่นั้นจะต้องใช้ heap และให้คุณคืนค่า heap ใหม่ด้วยวัตถุที่สร้างขึ้นใหม่ แต่หมายถึงความหมาย ของโปรแกรมจะไม่เปลี่ยนแปลงเหมือนกันภายใต้พีชคณิตทั้งหมดของอินพุตฮีป สิ่งนี้สามารถเกี่ยวข้องกับโครงสร้างทางคณิตศาสตร์ที่ค่อนข้างซับซ้อน (เช่นในกรณีนี้ทำงานในหมวดหมู่ซึ่งทำให้แน่ใจว่าทุกอย่างทำงานโมดูโลเป็นกลุ่มการเปลี่ยนแปลงที่เหมาะสม)