Semua kecuali program yang paling sepele diisi dengan bug dan segala sesuatu yang berjanji untuk menghapusnya sangat memikat. Saat ini, bukti kebenaran adalah kode yang sangat esoteris, terutama karena sulitnya mempelajari hal ini dan upaya ekstra yang diperlukan untuk membuktikan suatu program benar. Apakah Anda berpikir bahwa pembuktian kode akan lepas landas?
programming-practices
Casebash
sumber
sumber
tidak dapat sepenuhnya dibuktikan benar dengan usaha yang wajar. Untuk bukti formal kebenaran, Anda memerlukan setidaknya spesifikasi formal, dan spesifikasi tersebut harus lengkap dan benar. Ini biasanya bukan apa-apa yang dapat Anda buat dengan mudah untuk sebagian besar program dunia nyata. Sebagai contoh, cobalah untuk menulis spesifikasi seperti itu untuk sesuatu seperti antarmuka pengguna situs diskusi ini, dan Anda tahu apa yang saya maksud.
Di sini saya menemukan artikel yang bagus tentang topik ini:
http://www.encyclopedia.com/doc/1O11-programcorrectnessproof.html
sumber
printf("1")
benar atau tidak (misalnya, karena persyaratannya adalah "mencetak angka acak yang terdistribusi secara merata dari 1 hingga 6") tidak dapat diputuskan oleh penganalisa statis semacam itu.Masalah dengan bukti formal adalah bahwa itu hanya memindahkan masalah mundur selangkah.
Mengatakan bahwa suatu program benar sama dengan mengatakan bahwa suatu program melakukan apa yang seharusnya dilakukan. Bagaimana Anda mendefinisikan apa yang harus dilakukan oleh program? Anda menentukannya. Dan bagaimana Anda mendefinisikan apa yang harus dilakukan program dalam kasus tepi yang tidak dicakup oleh spesifikasi? Nah, maka Anda harus membuat spek lebih rinci.
Jadi misalkan spec Anda akhirnya menjadi cukup rinci untuk menggambarkan perilaku yang benar dari setiap aspek dari seluruh program. Sekarang Anda perlu cara untuk membuat alat bukti Anda memahaminya. Jadi, Anda harus menerjemahkan spec ke dalam semacam bahasa formal yang dapat dipahami oleh alat bukti ... hei, tunggu sebentar!
sumber
Verifikasi formal telah jauh, tetapi biasanya industri / alat yang banyak digunakan tertinggal dari penelitian terbaru. Berikut beberapa upaya terbaru ke arah ini:
Spec # http://research.microsoft.com/en-us/projects/specsharp/ Ini adalah perpanjangan dari C # yang mendukung kontrak kode (kondisi sebelum / sesudah dan invarian) dan dapat menggunakan kontrak ini untuk melakukan berbagai jenis analisis statis .
Proyek serupa dengan ini ada untuk bahasa lain, seperti JML untuk java, dan Eiffel memiliki built-in yang cukup banyak.
Lebih jauh lagi, proyek-proyek seperti slam dan blast dapat digunakan untuk memverifikasi properti perilaku tertentu dengan anotasi / intervensi programmer minimal, tetapi masih tidak dapat berurusan dengan generalisasi penuh bahasa modern (hal-hal seperti integer overflow / pointer aritmatika tidak dimodelkan).
Saya percaya bahwa kita akan melihat lebih banyak teknik ini digunakan dalam praktek di masa depan. Kendala utama adalah bahwa invarian program sulit untuk disimpulkan tanpa anotasi manual, dan programmer biasanya tidak mau memberikan anotasi ini karena melakukannya terlalu membosankan / memakan waktu.
sumber
Tidak kecuali jika metode pembuktian kode secara otomatis tanpa kerja pengembang yang luas muncul.
sumber
Beberapa alat metode formal (seperti misalnya Frama-C untuk perangkat lunak kritis yang disematkan C) dapat dipandang sebagai (semacam) yang menyediakan, atau setidaknya memeriksa, bukti (kebenaran) dari perangkat lunak yang diberikan. (Frama-C memeriksa bahwa suatu program mematuhi spesifikasi yang diformalkan, dalam beberapa hal, dan menghormati invarian beranotasi yang secara eksplisit dijelaskan dalam program).
Di beberapa sektor, metode formal semacam itu dimungkinkan, misalnya DO-178C untuk perangkat lunak penting dalam pesawat sipil. Jadi dalam beberapa kasus, pendekatan seperti itu mungkin dan bermanfaat.
Tentu saja, mengembangkan perangkat lunak kurang kereta sangat mahal. Tetapi pendekatan metode formal masuk akal untuk beberapa jenis perangkat lunak. Jika Anda pesimistis, Anda mungkin berpikir bahwa bug dipindahkan dari kode ke spesifikasi formal (yang mungkin memiliki beberapa "bug", karena memformalkan perilaku yang dimaksud dari perangkat lunak itu sulit dan rawan kesalahan).
sumber
Saya menemukan pertanyaan ini, dan saya pikir tautan ini mungkin menarik:
Aplikasi Industri Astrée
Membuktikan tidak adanya RTE dalam sistem yang digunakan oleh Airbus dengan lebih dari 130 ribu baris kode pada tahun 2003 tampaknya tidak buruk, dan saya ingin tahu apakah akan ada yang mengatakan bahwa ini bukan dunia nyata.
sumber
Tidak. Pepatah umum untuk ini adalah, "Dalam teori, teori dan praktik adalah sama. Dalam praktik, tidak."
Satu contoh yang sangat sederhana: Kesalahan ketik.
Sebenarnya menjalankan kode melalui pengujian unit menemukan hal-hal seperti itu dengan segera, dan serangkaian tes yang kohesif akan meniadakan kebutuhan akan bukti formal. Semua kasus penggunaan - kasus baik, buruk, kesalahan, dan tepi - harus disebutkan dalam tes unit, yang berakhir sebagai bukti kode yang lebih baik benar daripada bukti yang terpisah dari kode.
Terutama jika persyaratan berubah, atau algoritme diperbarui untuk memperbaiki bug - bukti formal lebih cenderung berakhir, sama dengan komentar kode yang sering didapat.
sumber
Saya berpikir bahwa batasan yang dikenakan pada bukti kebenaran karena masalah penghentian mungkin menjadi penghalang terbesar untuk bukti kebenaran menjadi arus utama.
sumber
Ini sudah digunakan oleh semua orang. Setiap kali Anda menggunakan pemeriksaan jenis bahasa pemrograman Anda, pada dasarnya Anda melakukan pembuktian matematika tentang kebenaran program Anda. Ini sudah bekerja dengan sangat baik - itu hanya mengharuskan Anda memilih jenis yang benar untuk setiap fungsi dan struktur data yang Anda gunakan. Semakin akurat jenisnya, semakin baik pula pengecekan yang Anda dapatkan. Jenis yang ada tersedia dalam bahasa pemrograman sudah memiliki alat yang cukup kuat untuk menggambarkan hampir semua perilaku yang mungkin. Ini berfungsi dalam setiap bahasa yang tersedia. C ++ dan bahasa statis hanya melakukan pemeriksaan dalam waktu kompilasi, sementara bahasa yang lebih dinamis seperti python melakukannya ketika program dijalankan. Pemeriksaan masih ada dalam semua bahasa ini. (misalnya, c ++ sudah mendukung pengecekan efek samping seperti halnya haskell,
sumber
mutable
atauconst_cast
. Saya tentu melihat koneksi yang Anda gambar di sana, tetapi rasa dua pendekatan tampaknya agak berbeda bagi saya.