चार्ल्स के जवाब पर निर्माण, प्रोग्रामिंग भाषाओं के सिद्धांत में मुख्य कठिनाई यह है कि कार्यक्रमों की समानता की प्राकृतिक धारणा आमतौर पर सख्त समानता नहीं है जो आप दे सकते हैं या अंतर्निहित मशीन मॉडल में सबसे सीधा गणितीय शब्दार्थ है। उदाहरण के लिए, जावा जैसे कोड के निम्नलिखित बिट पर विचार करें:
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 को विभिन्न स्थानों पर आवंटित किया जाएगा। तो इस अर्थ में, कार्यक्रम अलग तरह से व्यवहार करता है।
लेकिन जावा जैसी भाषा में, आप केवल समानता के लिए संदर्भ का परीक्षण कर सकते हैं, और आदेश के लिए नहीं, इसलिए यह एक अंतर है कि "कुछ और कोड" निरीक्षण नहीं कर सकते हैं । नतीजतन, अधिकांश प्रोग्रामर उम्मीद करेंगे कि आदेश को उलटने से अंतिम उत्तर पर कोई फर्क नहीं पड़ेगा, और अधिकांश कंपाइलर लेखकों को इस आधार पर पुनरावर्तन और अनुकूलन करने में सक्षम होने की उम्मीद है। (दूसरी तरफ, सी-लाइक भाषा में, आप ऑर्डर करने के लिए पॉइंटर्स की तुलना कर सकते हैं, उन्हें पहले पूर्णांक में कास्टिंग करके, और इसलिए यह रीऑर्डिंग आवश्यक रूप से अवलोकनीय व्यवहार को संरक्षित नहीं करता है।)
शब्दार्थ के केंद्रीय प्रश्नों में से एक प्रश्न का उत्तर देना है जब दो कार्यक्रम अवलोकन के बराबर होते हैं। चूंकि हमारी अवलोकन की धारणा प्रोग्रामिंग भाषा की सुविधाओं पर निर्भर करती है, इसलिए हम एक परिभाषा के साथ समाप्त होते हैं जैसे "दो प्रोग्राम बराबर होते हैं जब कोई क्लाइंट प्रोग्राम इनपुट के रूप में उन कार्यक्रमों को प्राप्त करने के आधार पर विभिन्न उत्तरों की गणना नहीं कर सकता है।" सभी ग्राहक कार्यक्रमों पर मात्रा का ठहराव इस सवाल को कठिन बनाता है - ऐसा लगता है जैसे आप अंत में कोड के दो विशेष टुकड़ों के बारे में कुछ कहने के लिए सभी संभावित ग्राहक कार्यक्रमों के बारे में कुछ कहना चाहते हैं।
डिमोनेटिक शब्दार्थ के साथ चाल गणितीय व्याख्या देने की है जो आपको इस सार्वभौमिक परिमाण से बचने की अनुमति देती है - आप कहते हैं कि कोड का एक टुकड़ा का अर्थ कुछ गणितीय मूल्य है, और आप उनकी तुलना करके यह देखने के लिए जाँच करें कि क्या वे गणितीय रूप से समान हैं या नहीं नहीं। यह स्थानीय (यानी, कंपोजिशनल) है, और सभी संभावित ग्राहकों पर मात्रा का समावेश नहीं है। (आपको यह दर्शाने की आवश्यकता है कि ध्वनि-संबंधी शब्दार्थ इसके अर्थ के लिए प्रासंगिक साम्य है, निश्चित रूप से, जब यह पूर्ण होता है - जब समता-मूलक समानता प्रासंगिक समानता के समान होती है, तो हम कहते हैं कि शब्दार्थ "पूर्णतः सार" है।)
लेकिन इसका मतलब है कि आपको यह सुनिश्चित करने की आवश्यकता है कि संप्रदाय शब्दार्थ उन समकक्षों को मान्य करता है। इस उदाहरण के लिए, यदि आप इस जावा जैसी भाषा के लिए एक शब्दार्थ शब्द देना चाहते हैं, तो आपको न केवल यह सुनिश्चित करने की आवश्यकता है कि कॉलिंग नया एक ढेर लेता है और आपको नए बनाए गए ऑब्जेक्ट के साथ एक नया ढेर वापस देता है, लेकिन इसका अर्थ है कार्यक्रम के इनपुट हीप के सभी क्रमपरिवर्तन के तहत अपरिवर्तनीय है। इसमें काफी जटिल गणितीय संरचनाएं शामिल हो सकती हैं (उदाहरण के लिए, इस मामले में एक श्रेणी में काम करना जो सुनिश्चित करता है कि सब कुछ काम करता है modulo एक उपयुक्त क्रमचय समूह)।