চার্লসের উত্তরের ভিত্তিতে, প্রোগ্রামিং ভাষার তত্ত্বের প্রধান অসুবিধাটি হ'ল প্রোগ্রামগুলির সমতুল্যতার স্বাভাবিক ধারণাটি আপনি যেভাবে দিতে পারেন তা সবচেয়ে সোজা গাণিতিক শব্দার্থতত্ত্বগুলিতে বা অন্তর্নিহিত মেশিনের মডেলটিতে সাধারণত কঠোর সমতা নয়। উদাহরণস্বরূপ, জাভা-জাতীয় কোডের নিম্নলিখিত বিটটি বিবেচনা করুন:
Object x = new Object();
Object y = new Object();
... some more code ...
সুতরাং এই প্রোগ্রামটি একটি অবজেক্ট তৈরি করে এবং এর নাম x করে, এবং তারপরে y নামের একটি দ্বিতীয় বস্তু তৈরি করে এবং তারপরে আরও কিছু কোড চালানো চালিয়ে যায়। এখন, ধরুন যে কোনও প্রোগ্রামার এই দুটি বস্তুর বরাদ্দের ক্রমটি ফ্লিপ করার সিদ্ধান্ত নিয়েছেন:
Object y = new Object();
Object x = new Object();
... some more code ...
এখন, প্রশ্ন জিজ্ঞাসা করুন: এই রিফ্যাক্টরিং প্রোগ্রামটির আচরণ পরিবর্তন করে? একদিকে, অন্তর্নিহিত মেশিনে, এক্স এবং y প্রোগ্রামের দুটি রানে বিভিন্ন স্থানে বরাদ্দ করা হবে। সুতরাং এই অর্থে, প্রোগ্রামটি ভিন্ন আচরণ করে।
তবে জাভা-জাতীয় ভাষায়, আপনি কেবলমাত্র সাম্যের জন্য রেফারেন্সগুলি পরীক্ষা করতে পারেন, না অর্ডার হিসাবে, সুতরাং এটি একটি পার্থক্য যা "আরও কিছু কোড" পালন করতে পারে না । ফলস্বরূপ, বেশিরভাগ প্রোগ্রামাররা আশা করবেন যে ক্রমটি উল্টানো চূড়ান্ত উত্তরের সাথে কোনও তাত্পর্য সৃষ্টি করবে না এবং বেশিরভাগ সংকলক লেখকরা এই ভিত্তিতে পুনঃক্রম এবং অপ্টিমাইজেশান সম্পাদন করতে সক্ষম হবেন বলে আশাবাদী। (অন্যদিকে, সি-এর মতো ভাষায়, আপনি পয়েন্টারগুলিকে প্রথমে পূর্ণসংখ্যায় কাস্ট করে অর্ডার করার জন্য তুলনা করতে পারেন , এবং সুতরাং এই পুনর্নির্মাণটি পর্যবেক্ষণযোগ্য আচরণ সংরক্ষণ করার প্রয়োজন হয় না ))
শব্দার্থবিজ্ঞানের কেন্দ্রীয় প্রশ্নের একটি হ'ল দুটি প্রোগ্রাম কখন পর্যবেক্ষণের সমতুল্য হয় এমন প্রশ্নের উত্তর দেওয়া। যেহেতু আমাদের পর্যবেক্ষণের ধারণাটি প্রোগ্রামিং ভাষার বৈশিষ্ট্যের উপর নির্ভরশীল, তাই আমরা "দুটি প্রোগ্রাম সমতুল্য যখন কোনও ক্লায়েন্ট প্রোগ্রাম সেই প্রোগ্রামগুলিকে ইনপুট হিসাবে প্রাপ্তির উপর ভিত্তি করে বিভিন্ন উত্তর গণনা করতে পারে না" এর মতো সংজ্ঞা দিয়ে শেষ করি। সমস্ত ক্লায়েন্ট প্রোগ্রামের পরিমাণ নির্ধারণই এই প্রশ্নটিকে কী কঠিন করে তোলে - মনে হয় আপনি কোডের দুটি নির্দিষ্ট টুকরো সম্পর্কে কিছু বলার জন্য সমস্ত সম্ভাব্য ক্লায়েন্ট প্রোগ্রামগুলি সম্পর্কে কিছু বলতে শেষ করেছেন।
ডেনোটেশনাল শব্দার্থবিদ্যার কৌশলটি একটি গাণিতিক ব্যাখ্যা দেয় যা আপনাকে এই সর্বজনীন পরিমাপ এড়াতে দেয় - আপনি বলে যে কোনও কোডের টুকরোটির অর্থ কিছু গাণিতিক মান, এবং আপনি পরীক্ষা করে তাদের তুলনা করে পরীক্ষা করেন যে তারা গাণিতিকভাবে সমান বা না না. এটি স্থানীয় (অর্থাত্ রচনা), এবং সমস্ত সম্ভাব্য ক্লায়েন্টের উপর পরিমাপের জড়িত না। (আপনাকে দেখানোর দরকার নেই যে ডায়নোটেশনাল শব্দার্থক শব্দটি অবশ্যই এটি যথার্থ হওয়ার জন্য প্রাসঙ্গিক সমতুল্যতা বোঝায় When এটি যখন সম্পূর্ণ হয় - যখন ডায়নোটেশনাল সাম্যতা প্রাসঙ্গিক সমতুল্যের সমান হয়, তখন আমরা বলি শব্দার্থবিজ্ঞান "সম্পূর্ণ বিমূর্ত"))
তবে এর অর্থ হ'ল আপনাকে নিশ্চিত করতে হবে যে ডিনোট্যাশনাল শব্দার্থবিজ্ঞানগুলি সেই সমতুল্যতাগুলিকে বৈধতা দেয়। সুতরাং এই উদাহরণের জন্য, আপনি যদি এই জাভা-জাতীয় ভাষার জন্য একটি ডিনোটেশনাল শব্দার্থবিদ্যা দিতে চান, আপনাকে কেবল এটি নিশ্চিত করতে হবে যে নতুন কল করা একটি গাদা লাগে এবং আপনাকে সদ্য নির্মিত বস্তুর সাথে একটি নতুন গাদা ফিরিয়ে দেয় না, তবে অর্থটি প্রোগ্রামটির ইনপুট হ্যাপের সমস্ত অনুমতি অনুসারে অদম্য। এটি বেশ জটিল গাণিতিক কাঠামোকে জড়িত করতে পারে (উদাহরণস্বরূপ, এই ক্ষেত্রে এমন একটি বিভাগে কাজ করা যা নিশ্চিত করে যে সবকিছু যথাযথ অনুক্রমের গ্রুপকে মডুলোর কাজ করে)।