Yah ... ya sebenarnya, jika setiap jalur "melalui" program ini diuji. Tetapi itu berarti, setiap jalur yang mungkin melalui seluruh ruang dari semua status yang mungkin dimiliki program, termasuk semua variabel. Bahkan untuk program yang dikompilasi secara statis sangat sederhana - katakanlah, pembuat angka Fortran lama - itu tidak layak, meskipun setidaknya dapat dibayangkan: jika Anda hanya memiliki dua variabel integer, Anda pada dasarnya berurusan dengan semua cara yang mungkin untuk menghubungkan titik-titik pada kisi dua dimensi; sebenarnya sangat mirip dengan Travelling Salesman. Untuk n variabel seperti itu, Anda berhadapan dengan ruang n- dimensi, jadi untuk setiap program nyata, tugas tersebut sama sekali tidak dapat dilakukan.
Lebih buruk: untuk hal-hal serius, Anda tidak hanya memiliki sejumlah variabel primitif, tetapi membuat variabel dengan cepat dalam panggilan fungsi, atau memiliki variabel ukuran variabel ... atau hal-hal seperti itu, mungkin dalam bahasa lengkap Turing. Itu membuat ruang ruang dimensi tak terbatas, menghancurkan semua harapan cakupan penuh, bahkan diberikan peralatan pengujian yang sangat kuat.
Yang mengatakan ... sebenarnya hal-hal tidak begitu suram. Hal ini dimungkinkan untuk proove seluruh program untuk menjadi benar, tetapi Anda harus menyerah beberapa ide.
Pertama: sangat disarankan untuk beralih ke bahasa deklaratif. Bahasa imperatif, untuk beberapa alasan, selalu menjadi yang paling populer, tetapi cara mereka menggabungkan algoritma dengan interaksi dunia nyata membuatnya sangat sulit untuk mengatakan apa yang Anda maksud dengan "benar".
Jauh lebih mudah dalam bahasa pemrograman yang benar-benar fungsional : ini memiliki perbedaan yang jelas antara sifat-sifat fungsi matematika yang sangat menarik , dan interaksi dunia nyata yang tidak dapat Anda katakan. Untuk fungsi, sangat mudah untuk menentukan "perilaku yang benar": jika untuk semua input yang mungkin (dari tipe argumen) hasil yang diinginkan keluar, maka fungsi tersebut berperilaku dengan benar.
Sekarang, Anda mengatakan itu masih sulit dilakukan ... setelah semua, ruang dari semua argumen yang mungkin pada umumnya juga tak terbatas-dimensi. Benar - meskipun untuk satu fungsi, bahkan pengujian cakupan naif membawa Anda lebih jauh dari yang Anda bisa harapkan dalam program penting! Namun, ada alat yang luar biasa kuat yang mengubah permainan: kuantifikasi universal / polimorfisme parametrik . Pada dasarnya, ini memungkinkan Anda untuk menulis fungsi pada jenis data yang sangat umum, dengan jaminan bahwa jika itu berfungsi untuk contoh data yang sederhana, ia akan bekerja untuk setiap input yang mungkin sama sekali.
Setidaknya secara teoritis. Tidak mudah menemukan jenis yang tepat yang sangat umum sehingga Anda dapat sepenuhnya membuktikan hal ini - biasanya, Anda memerlukan bahasa yang diketik secara dependen , dan ini cenderung agak sulit untuk digunakan. Tetapi menulis dengan gaya fungsional dengan polimorfisme parametrik saja sudah meningkatkan "tingkat keamanan" Anda dengan sangat baik - Anda tidak perlu menemukan semua bug, tetapi Anda harus menyembunyikannya dengan baik sehingga kompiler tidak melihatnya!