Semantik suatu program adalah model perilakunya yang, seperti model ilmiah lainnya, mengabaikan aspek-aspek yang tidak ingin Anda pelajari.
Model pelaksanaan program yang sangat terperinci akan memodelkan perilaku fisik komputer yang menjalankannya, termasuk waktu eksekusi, konsumsi daya, radiasi elektromagnetik, dll. Aspek-aspek seperti itu sangat jarang diperhitungkan karena sangat jarang relevan. Namun kadang-kadang mereka memang penting: model yang berguna dari pesawat autopilot perlu menyertakan informasi runtime, model yang berguna dari keamanan kartu kredit perlu mencakup radiasi elektromagnetik, ...
Dalam semantik khas, efek samping seperti waktu dan konsumsi daya diabaikan. Bahkan jika dalam pengaturan duniawi di mana Anda mengetik ekspresi pada prompt juru bahasa Haskell, pencetakan hasilnya adalah efek samping (jika Anda mencoba untuk mencetak objek yang tak terbatas, itu penting). Jika juru bahasa Haskell kehabisan memori, ini juga merupakan efek samping yang dapat diamati dalam model "dunia nyata", tetapi tidak dalam model ideal Haskell yang secara efektif memungkinkan perhitungan tanpa batas.
Sebuah diamati efek samping adalah salah satu yang dimodelkan dalam semantik. Dalam model bahasa pemrograman yang umum, konsumsi memori tidak dimodelkan, sehingga perhitungan yang membutuhkan penyimpanan 1TB bisa murni, meskipun jika Anda mencoba menjalankannya di PC Anda, itu akan gagal.
Jenis lain dari efek samping yang tidak dapat diamati adalah efek samping yang internal. Inilah, saya pikir, apa yang akan dipikirkan sebagian besar semantikis ketika berbicara tentang efek samping yang tidak dapat diamati. Pertimbangkan perhitungan yang menggunakan data yang bisa berubah secara internal, tetapi tidak membagikan data yang bisa berubah ini dengan bagian lain dari program ini. Misalnya, fungsi pengurutan daftar yang membangun array dengan elemen yang sama dengan daftar, mengurutkan array di tempat, dan mengembalikan daftar yang mengandung elemen sebagai array dalam urutan terakhirnya: model semantik subekspresi fungsi ini menunjukkan sisi efek (modifikasi array), tetapi fungsinya sendiri tidak memiliki efek samping eksternal, sehingga murni.
Untuk contoh yang lebih halus, pertimbangkan fungsi yang menulis beberapa data ke file sementara dan membersihkannya sendiri. Dalam semantik di mana selalu ada ruang yang cukup untuk file sementara dan program tidak berbagi file sementara, fungsi tidak memiliki efek samping; file sementara bertindak sebagai memori tambahan yang digunakan oleh fungsi. Dalam semantik yang memperhitungkan kondisi penuh sistem berkas, fungsi tersebut memiliki efek samping - mungkin gagal karena keadaan eksternal. Dalam semantik yang memungkinkan mesin mengalami kerusakan, fungsi tersebut memiliki efek samping: jika ada kerusakan selama eksekusi fungsi, file sementara mungkin tertinggal. Dalam semantik yang memungkinkan program yang dijalankan secara bersamaan untuk melihat dan mungkin memodifikasi file sementara, fungsi tersebut memiliki efek samping.