Berdasarkan jawaban Charles, kesulitan utama dalam teori bahasa pemrograman adalah bahwa gagasan alami tentang kesetaraan program biasanya bukan kesetaraan yang ketat baik dalam semantik matematika paling sederhana yang dapat Anda berikan, atau dalam model mesin yang mendasarinya. Sebagai contoh, pertimbangkan bit kode mirip Java berikut ini:
Object x = new Object();
Object y = new Object();
... some more code ...
Jadi program ini membuat objek dan menamakannya x, dan kemudian membuat objek kedua bernama y, dan kemudian melanjutkan mengeksekusi beberapa kode lagi. Sekarang, anggaplah seorang programmer memutuskan untuk membalik urutan alokasi dari dua objek ini:
Object y = new Object();
Object x = new Object();
... some more code ...
Sekarang, ajukan pertanyaan: apakah refactoring ini mengubah perilaku program? Di satu sisi, pada mesin yang mendasarinya, x dan y akan dialokasikan di lokasi yang berbeda dalam dua kali menjalankan program. Jadi dalam hal ini, program berperilaku berbeda.
Tetapi dalam bahasa seperti Java, Anda hanya dapat menguji referensi untuk kesetaraan, dan bukan untuk pesanan, jadi ini adalah perbedaan yang " tidak bisa diamati " oleh beberapa kode lainnya . Akibatnya, sebagian besar programmer akan berharap bahwa membalik urutan tidak akan membuat perbedaan pada jawaban akhir, dan sebagian besar penulis kompiler berharap dapat melakukan pemesanan ulang dan optimisasi berdasarkan ini. (Di sisi lain, dalam bahasa seperti C, Anda dapat membandingkan pointer untuk pemesanan, dengan melemparkannya ke integer terlebih dahulu, dan penataan ulang ini tidak serta merta menjaga perilaku yang dapat diamati.)
Salah satu pertanyaan sentral semantik adalah untuk menjawab pertanyaan tentang kapan dua program setara secara nyata. Karena gagasan pengamatan kami bergantung pada fitur-fitur bahasa pemrograman, kami berakhir dengan definisi seperti "dua program setara ketika tidak ada program klien yang dapat menghitung jawaban yang berbeda berdasarkan menerima program-program tersebut sebagai input." Kuantifikasi atas semua program klien adalah yang membuat pertanyaan ini sulit - sepertinya Anda akhirnya harus mengatakan sesuatu tentang semua program klien yang mungkin untuk mengatakan sesuatu tentang dua bagian kode tertentu.
Trik dengan semantik denotasional adalah untuk memberikan interpretasi matematis yang memungkinkan Anda menghindari kuantifikasi universal ini - Anda mengatakan bahwa arti dari sepotong kode adalah nilai matematika, dan Anda membandingkannya dengan memeriksa untuk melihat apakah mereka secara matematis sama atau tidak. Ini adalah lokal (yaitu, komposisi), dan tidak melibatkan kuantifikasi atas semua klien yang mungkin. (Anda perlu menunjukkan bahwa semantik denotasional menyiratkan kesetaraan kontekstual agar itu menjadi sehat, tentu saja. Ketika selesai - ketika kesetaraan denotasional persis sama dengan kesetaraan kontekstual, kita katakan semantik "sepenuhnya abstrak".)
Tetapi berarti Anda perlu memastikan bahwa semantik denotasional memvalidasi kesetaraan tersebut. Jadi untuk contoh ini, jika Anda ingin memberikan semantik denotasi untuk bahasa seperti Java ini, Anda perlu memastikan tidak hanya bahwa memanggil baru mengambil tumpukan dan memberi Anda kembali tumpukan baru dengan objek yang baru dibuat, tetapi itu artinya dari program ini invarian sama di bawah semua permutasi dari tumpukan input. Ini dapat melibatkan struktur matematika yang cukup kompleks (misalnya, dalam hal ini bekerja dalam kategori yang memastikan semuanya berfungsi modulo kelompok permutasi yang sesuai).