Apa sebenarnya efek samping yang “dapat diamati secara semantik”?

11

Saya punya pertanyaan tentang fungsi murni. Menurut halaman Wikipedia salah satu syarat untuk fungsi murni adalah:

Evaluasi hasil tidak menyebabkan efek samping atau keluaran yang dapat diamati secara semantik, seperti mutasi objek yang dapat berubah atau keluaran ke perangkat I / O.

Sekarang apa artinya ini. Atau lebih tepatnya bagaimana saya bisa membuat efek samping yang tidak dapat diamati secara semantik?

Henrik Sommerland
sumber
2
Anda tidak boleh terlalu banyak menaruh beban pada hal-hal bergelombang tangan yang pernah ditemukan di Wikipedia.
Andrej Bauer
1
@AndrejBauer Huh? Apa yang bergelombang tentang ini? Bukan tingkat penelitian, mungkin (saya tidak keberatan jika ini bermigrasi ke Ilmu Komputer ) - meskipun diberikan reaksi Anda, mungkin tidak.
Gilles 'SO- stop being evil'
Saya pikir saya tidak suka frasa "semantik diamati".
Andrej Bauer
1
Biar saya jelaskan secara berbeda: apa perbedaan antara "diamati secara semantik" dan "dapat diamati"? "Semantik" hanyalah kata kunci yang tidak masuk akal di sini.
Andrej Bauer
"semantik" tampaknya memiliki makna khusus di berbagai bidang teori pemrograman, mungkin diimpor dari linguistik / filsafat di mana ia kembali beberapa dekade alias "sintaks vs semantik" .... mungkin itu adalah pertanyaan lain di sana ....
vzn

Jawaban:

11

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.

Gilles 'SANGAT berhenti menjadi jahat'
sumber