Seperti judulnya,
Jawaban khas yang akan didapat adalah:
Aturan yang memungkinkan setiap dan semua transformasi kode yang tidak mengubah perilaku program yang dapat diamati
Dari waktu ke waktu kami terus mendapatkan perilaku dari implementasi tertentu yang dikaitkan dengan aturan ini. Berkali-kali salah. Jadi, apa sebenarnya aturan ini. Standar tidak secara jelas menyebutkan aturan ini sebagai bagian atau paragraf, jadi apa sebenarnya yang termasuk dalam lingkup aturan ini? Bagi saya ini tampak seperti area abu-abu yang tidak didefinisikan secara rinci oleh standar. Bisakah seseorang menguraikan detail yang mengutip referensi dari standar?
Catatan: Memberi tag ini sebagai C dan C ++ keduanya, karena relevan dengan kedua bahasa.
Jawaban:
Apa yang dimaksud dengan aturan " seolah-olah "?
Aturan " seolah-olah " pada dasarnya menentukan transformasi apa yang diizinkan untuk dilakukan implementasi pada program C ++ legal. Singkatnya, semua transformasi yang tidak mempengaruhi " perilaku yang dapat diamati " program (lihat di bawah untuk definisi yang tepat) diperbolehkan.
Tujuannya adalah memberikan kebebasan implementasi untuk melakukan pengoptimalan selama perilaku program tetap sesuai dengan semantik yang ditentukan oleh C ++ Standard dalam hal mesin abstrak.
Di mana Standar memperkenalkan aturan ini?
Standar C ++ 11 memperkenalkan aturan " seolah-olah " di Paragraf 1.9 / 1:
Juga, catatan kaki penjelasan menambahkan:
Apa yang diamanatkan oleh aturan itu?
Paragraf 1.9 / 5 lebih lanjut menentukan:
Perlu ditekankan bahwa batasan ini hanya berlaku ketika "menjalankan program yang dibentuk dengan baik" , dan bahwa kemungkinan hasil dari menjalankan program yang berisi perilaku yang tidak ditentukan tidak dibatasi. Ini dijelaskan dalam Paragraf 1.9 / 4 juga:
Akhirnya, mengenai definisi " perilaku yang dapat diamati ", Paragraf 1.9 / 8 berbunyi sebagai berikut:
Apakah ada situasi di mana aturan ini tidak berlaku?
Sepengetahuan saya, satu-satunya pengecualian untuk aturan " seolah-olah " adalah menyalin / memindahkan elision, yang diizinkan meskipun salinan konstruktor, pemindah konstruktor, atau penghancur kelas memiliki efek samping. Kondisi yang tepat untuk ini ditentukan dalam Paragraf 12.8 / 31:
sumber
Di C11 aturan tidak pernah disebut dengan nama itu. Namun C, seperti C ++, mendefinisikan perilaku dalam istilah mesin abstrak. Aturan as-if ada di C11 5.1.2.3p4 dan p6 :
sumber
Di C, C ++, Ada, Java, SML ... dalam bahasa pemrograman apa pun yang ditentukan dengan baik dengan mendeskripsikan (biasanya banyak kemungkinan, perilaku non-deterministik) dari suatu program (terkena serangkaian interaksi pada port I / O) , tidak ada aturan seolah-olah yang berbeda .
Contoh aturan berbeda adalah salah satu yang mengatakan bahwa pembagian dengan nol menimbulkan pengecualian (Ada, Caml) atau dereferensi nol menimbulkan pengecualian (Java). Anda dapat mengubah aturan untuk menentukan sesuatu yang lain dan Anda akan berakhir dengan bahasa yang berbeda (bahwa beberapa orang lebih suka menyebutnya "dialek" (*). Ada aturan yang berbeda untuk menentukan beberapa penggunaan yang berbeda dari bahasa pemrograman seperti yang berbeda Aturan tata bahasa mencakup beberapa konstruksi sintaksis.
(*) Dialek menurut beberapa ahli bahasa adalah bahasa dengan "tentara". dalam konteks itu, itu bisa berarti bahasa pemrograman tanpa komite dan industri editor kompiler tertentu.
Aturan seolah-olah bukanlah aturan yang berbeda ; itu tidak mencakup program apa pun secara khusus dan bahkan bukan aturan yang dapat didiskusikan, dihapus, atau diubah dengan cara apa pun : yang disebut "aturan" hanya menegaskan kembali bahwa semantik program ditentukan, dan hanya dapat dibawa-bawa (secara universal) didefinisikan, dalam hal interaksi yang terlihat dari pelaksanaan program dengan dunia "eksternal".
Dunia luar dapat berupa antarmuka I / O (stdio), GUI, bahkan penerjemah interaktif yang menghasilkan nilai yang dihasilkan dari bahasa aplikatif murni. Dalam C dan C ++ termasuk akses (yang ditentukan secara samar) ke objek volatile, yang merupakan cara lain untuk mengatakan bahwa beberapa objek pada titik tertentu harus direpresentasikan dalam memori secara ketat sesuai dengan ABI (Application Binary Interface) tanpa pernah menyebutkan ABI secara eksplisit.
Definisi dari apa yang disebut jejak eksekusi , juga disebut perilaku yang terlihat atau dapat diamati, mendefinisikan apa yang dimaksud dengan "aturan seolah-olah". Aturan seolah-olah mencoba menjelaskannya, tetapi dengan melakukannya, itu membingungkan orang lebih dari pada menjelaskan hal-hal karena memberikan ekspresi sebagai aturan semantik tambahan yang memberikan lebih banyak kelonggaran untuk implementasi.
Ringkasan:
sumber