Apa yang akhirnya kita bicarakan di sini adalah waktu kompilasi vs runtime.
Kompilasi kesalahan waktu, jika dipikir-pikir, akhirnya berarti kompilator dapat menentukan masalah apa yang Anda miliki dalam program Anda bahkan sebelum dijalankan. Ini jelas bukan kompiler "bahasa arbitrer", tapi saya akan segera kembali ke itu. Kompiler, dengan segala kebijaksanaannya yang tak terbatas, tidak mencantumkan setiap masalah yang dapat ditentukan oleh kompiler. Ini sebagian tergantung pada seberapa baik kompiler ditulis, tetapi alasan utama untuk ini adalah bahwa banyak hal yang baik ditentukan pada saat runtime .
Kesalahan runtime, seperti yang Anda ketahui dengan baik, saya yakin sama seperti saya, adalah segala jenis kesalahan yang terjadi selama pelaksanaan program itu sendiri. Ini termasuk pembagian dengan nol, pengecualian penunjuk nol, masalah perangkat keras, dan banyak faktor lainnya.
Sifat kesalahan runtime berarti Anda tidak dapat mengantisipasi kesalahan tersebut pada waktu kompilasi. Jika Anda bisa, mereka hampir pasti akan diperiksa pada waktu kompilasi. Jika Anda bisa menjamin angka nol pada waktu kompilasi, maka Anda bisa melakukan kesimpulan logis tertentu, seperti membagi angka dengan angka itu akan menghasilkan kesalahan aritmatika yang disebabkan oleh membagi dengan nol.
Dengan demikian, dengan cara yang sangat nyata, musuh pemrograman yang secara terprogram menjamin berfungsinya suatu program sedang melakukan pemeriksaan runtime sebagai lawan dari kompilasi pemeriksaan waktu. Contoh dari ini mungkin melakukan gips dinamis ke tipe lain. Jika ini diizinkan, Anda, programmer, pada dasarnya mengesampingkan kemampuan kompiler untuk mengetahui apakah itu hal yang aman untuk dilakukan. Beberapa bahasa pemrograman telah memutuskan bahwa ini dapat diterima sementara yang lain setidaknya akan memperingatkan Anda pada waktu kompilasi.
Contoh lain yang baik mungkin memungkinkan nulls menjadi bagian dari bahasa, karena pengecualian pointer nol dapat terjadi jika Anda mengizinkan nulls. Beberapa bahasa telah menghilangkan masalah ini sepenuhnya dengan mencegah variabel-variabel yang tidak secara eksplisit dinyatakan mampu menahan nilai-nilai nol untuk dinyatakan tanpa segera diberi nilai (ambil contohnya Kotlin). Meskipun Anda tidak dapat menghilangkan kesalahan runtime pengecualian pointer kosong, Anda dapat mencegahnya terjadi dengan menghapus sifat dinamis bahasa. Di Kotlin, Anda dapat memaksakan kemungkinan memegang nilai nol tentu saja, tetapi tidak perlu dikatakan bahwa ini adalah "pembeli berhati-hatilah" metaforis karena Anda harus secara eksplisit menyatakannya.
Bisakah Anda secara konseptual memiliki kompiler yang dapat memeriksa kesalahan dalam setiap bahasa? Ya, tapi itu mungkin kompiler yang kikuk dan sangat tidak stabil di mana Anda harus menyediakan bahasa yang dikompilasi sebelumnya. Itu juga tidak bisa mengetahui banyak hal tentang program Anda, lebih dari kompiler untuk bahasa tertentu tahu hal-hal tertentu tentang itu, seperti masalah terputusnya seperti yang Anda sebutkan. Ternyata, banyak sekali informasi yang mungkin menarik untuk dipelajari tentang suatu program tidak mungkin diperoleh. Ini sudah terbukti, jadi kemungkinan tidak akan berubah dalam waktu dekat.
Kembali ke poin utama Anda. Metode tidak aman secara otomatis. Ada alasan praktis untuk ini, yaitu metode aman thread juga lebih lambat bahkan ketika thread tidak digunakan. Rust memutuskan bahwa mereka dapat menghilangkan masalah runtime dengan membuat metode thread aman secara default, dan itu adalah pilihan mereka. Itu datang dengan biaya sekalipun.
Dimungkinkan secara matematis untuk membuktikan kebenaran suatu program, tetapi akan dengan peringatan bahwa Anda akan benar-benar memiliki nol fitur runtime dalam bahasa tersebut. Anda akan dapat membaca bahasa ini dan tahu apa fungsinya tanpa ada kejutan. Bahasanya mungkin akan terlihat sangat matematis, dan kemungkinan tidak ada kebetulan di sana. Peringatan kedua adalah bahwa kesalahan runtime masih terjadi, yang mungkin tidak ada hubungannya dengan program itu sendiri. Oleh karena itu, program ini dapat terbukti benar, dengan asumsi serangkaian asumsi tentang komputer itu sedang berjalan di akurat dan tidak berubah, yang tentu saja selalu tidak terjadi pula dan sering.