Charles'ın cevabına dayanarak, programlama dilleri teorisindeki temel zorluk, programların doğal denklik kavramının, ya verebileceğiniz en basit matematiksel anlambilimde ya da altta yatan makine modelinde tipik olarak katı bir eşitlik olmamasıdır. Örneğin, aşağıdaki Java benzeri kod bitini göz önünde bulundurun:
Object x = new Object();
Object y = new Object();
... some more code ...
Böylece bu program bir nesne oluşturur ve x adını verir, ardından y adlı ikinci bir nesne oluşturur ve daha fazla kod yürütmeye devam eder. Şimdi, bir programcının bu iki nesnenin tahsis sırasını çevirmeye karar verdiğini varsayalım:
Object y = new Object();
Object x = new Object();
... some more code ...
Şimdi, şu soruyu sorun: bu yeniden düzenleme programın davranışını değiştiriyor mu? Bir yandan, alttaki makinede, x ve y, programın iki çalışmasında farklı konumlara tahsis edilecektir. Yani bu anlamda program farklı davranıyor.
Ancak Java benzeri bir dilde, referansları yalnızca eşitlik için test edebilirsiniz, sipariş için değil, bu nedenle "biraz daha kodun" gözlemleyemediği bir farktır . Sonuç olarak, çoğu programcı, siparişin tersine çevrilmesinin son yanıtta bir fark yaratmasını beklemez ve derleyici yazarlarının çoğu bu temelde yeniden sıralama ve optimizasyon yapmayı bekler. (Öte yandan, bir de C-benzeri dil, sen yapabilirsiniz ilk tamsayılar onları kopartarak, sipariş için işaretçileri karşılaştırmak ve bu yeniden düzenlenmesi, böylece yok değil mutlaka gözlemlenebilir davranışı korumak.)
Anlambilimin temel sorunlarından biri, iki programın ne zaman gözle görülür şekilde eşdeğer olduğu sorusunu cevaplamaktır. Gözlem anlayışımız programlama dilinin özelliklerine bağlı olduğundan, "hiçbir program bu programları girdi olarak almaya dayalı olarak farklı cevapları hesaplayamadığında iki program eşdeğerdir" gibi bir tanımla sonuçlanır. Tüm istemci programları üzerindeki miktar ölçümü, bu soruyu zorlaştıran şeydir - görünüşe göre, iki belirli kod parçası hakkında bir şeyler söylemek için olası tüm istemci programları hakkında bir şeyler söylemek zorundasınız.
Anlamsal semantik ile hile, bu evrensel nicelemeden kaçınmanıza izin veren matematiksel bir yorum vermektir - bir kod parçasının anlamının bazı matematiksel bir değer olduğunu ve bunları matematiksel olarak eşit olup olmadığını kontrol ederek karşılaştırırsınız. değil. Bu yereldir (yani, bileşimsel) ve olası tüm istemciler üzerinde nicelemeyi içermez. (Tabii ki anlamsal anlambilimin sağlam olması için bağlamsal eşdeğerliği ima ettiğini göstermeniz gerekir. Tabii ki tamamlandığında - anlamsal eşitlik bağlamsal eşdeğerlikle tamamen aynı olduğunda, anlambilimin "tamamen soyut" olduğunu söylüyoruz.)
Ancak, anlamsal anlambilimin bu denklikleri doğruladığından emin olmanız gerektiği anlamına gelir. Bu örnek için, bu Java benzeri dil için bir anlamsal semantik vermek istiyorsanız, sadece yeni çağrmanın bir yığın aldığından ve size yeni oluşturulan nesne ile yeni bir yığın verdiğinden emin olmanız gerekir. Program, giriş yığınının tüm permütasyonları altında değişmezdir. Bu oldukça karmaşık matematiksel yapıları içerebilir (örneğin, bu durumda, her şeyin modulo için uygun bir permütasyon grubu çalışmasını sağlayan bir kategoride çalışmak).