Pertanyaannya agak luas. Untuk menjawabnya di ruang yang masuk akal saya akan membuat banyak penyederhanaan yang berlebihan.
Mari kita sepakat tentang terminologi. Suatu program benar ketika menyiratkan spesifikasinya. Pernyataan tidak jelas ini dibuat tepat dalam banyak hal, dengan menjabarkan apa sebenarnya program dan apa sebenarnya spesifikasi. Misalnya, dalam pengecekan model program adalah struktur Kripke dan spesifikasinya sering berupa formula LTL . Atau, program ini dapat berupa daftar petunjuk PowerPC dan spesifikasinya dapat berupa serangkaian pernyataan Hoare-Floyd yang ditulis dalam, katakanlah, logika urutan pertama. Ada banyak variasi yang memungkinkan. Sangat menggoda untuk menyimpulkan bahwa dalam satu kasus (struktur Kripke) kami tidak memverifikasi program yang sebenarnya, sementara dalam kasus kedua (daftar instruksi PowerPC) kami lakukan. Namun, penting untuk menyadari bahwa kami benar-benar melihat model matematika dalam kedua kasus, dan ini sangat baik. (Situasinya sangat mirip dengan fisika di mana, misalnya, mekanika klasik adalah model realitas matematika.)
Kebanyakan formalisasi membedakan antara sintaks dan semantik program; yaitu, bagaimana itu diwakili dan apa artinya. Semantik suatu program adalah apa yang diperhitungkan dari sudut pandang verifikasi program. Tetapi, tentu saja penting untuk memiliki cara yang jelas dalam memberikan makna pada (representasi sintaksis) program. Dua cara populer adalah sebagai berikut:
- (langkah kecil) semantik operasional : Ini sangat mirip dengan mendefinisikan bahasa pemrograman dengan menulis penerjemah untuk itu. Untuk ini, Anda perlu mengatakan apa statusnya , dan itu dipengaruhi oleh setiap pernyataan dalam bahasa tersebut. (Anda mungkin bertanya-tanya dalam bahasa apa Anda menulis penerjemah, tetapi saya akan berpura-pura tidak.)
- semantik aksiomatik : Di sini setiap tipe pernyataan dilengkapi dengan skema aksioma. Jadi, kira-kira, setiap kali pernyataan tertentu dari jenis itu digunakan, itu diterjemahkan untuk dapat menggunakan aksioma tertentu. Misalnya, tugas datang dengan skema { P [ x / e ] }x : = e ; penugasan khusus x : = x + 1 dilengkapi dengan aksioma { x + 1 = 1 }{ P[ x / e ]}x : = e{ P}x : = x + 1 jika kita instantiate skema dengan P = ( x = 1 ) .{ x + 1 = 1 }x : = x + 1{ x = 1 }P= ( x = 1 )
(Ada yang lain. Saya merasa sangat buruk karena menghilangkan semantik denotasional, tetapi jawaban ini sudah lama.) Kode mesin ditambah semantik operasional cukup dekat dengan apa yang oleh kebanyakan orang disebut 'program nyata'. Berikut ini adalah makalah seminal, yang kebetulan menggunakan semantik operasional untuk subset kode mesin DEC Alpha:
Mengapa Anda pernah menggunakan semantik tingkat tinggi, seperti yang aksiomatik? Ketika Anda tidak ingin bukti kebenaran bergantung pada perangkat keras tempat Anda menjalankannya. Pendekatannya kemudian adalah untuk membuktikan kebenaran suatu algoritma sehubungan dengan beberapa semantik tingkat tinggi yang nyaman, dan kemudian membuktikan bahwa semantik terdengar sehubungan dengan semantik tingkat rendah yang lebih dekat dengan mesin yang sebenarnya.
Singkatnya, saya bisa memikirkan tiga alasan yang mengarah pada pertanyaan Anda:
- Anda hanya melihat semantik tingkat tinggi yang tidak terlihat seperti apa yang biasa Anda sebut program, dan Anda bertanya-tanya apakah ada yang tingkat rendah. Jawabannya iya.
- Anda bertanya-tanya bagaimana Anda membuktikan bahwa model sesuai dengan kenyataan. Seperti dalam fisika, Anda tidak. Anda cukup membuat model yang lebih baik dan memeriksanya dengan kenyataan.
- Anda belum melihat perbedaan antara sintaks dan semantik, dan berbagai cara untuk memberi makna pada program. Dua pertanyaan sebelumnya berisi beberapa buku.
Jawaban ini hanya mencoba mengidentifikasi tiga cara berbeda di mana saya memahami pertanyaan itu. Masuk jauh ke salah satu poin ini akan membutuhkan banyak ruang.