Selain semua jawaban bagus sejauh ini:
Anda memiliki "bias pengamat". Anda tidak mengamati bug, dan karena itu Anda menganggap tidak ada bug.
Dulu saya berpikir seperti Anda. Kemudian saya mulai menulis kompiler secara profesional, dan biarkan saya memberitahu Anda, ada banyak bug di sana!
Anda tidak melihat bug karena Anda menulis kode yang hanya seperti 99,999% dari semua kode yang ditulis orang. Anda mungkin menulis kode yang benar-benar normal, langsung, dan benar, yang memanggil metode dan menjalankan loop dan tidak melakukan sesuatu yang mewah atau aneh, karena Anda adalah pengembang normal yang menyelesaikan masalah bisnis normal.
Anda tidak melihat bug penyusun karena bug penyusun tidak ada dalam skenario kode normal yang mudah dianalisa; bug ada dalam analisis kode aneh yang tidak Anda tulis.
Saya di sisi lain memiliki bias pengamat yang berlawanan. Saya melihat kode gila sepanjang hari setiap hari, dan bagi saya para kompiler sepertinya penuh dengan bug.
Jika Anda duduk dengan spesifikasi bahasa dari bahasa apa pun, dan mengambil implementasi kompiler apa pun untuk bahasa itu, dan benar-benar berusaha keras untuk menentukan apakah kompiler benar-benar mengimplementasikan spesifikasi atau tidak, berkonsentrasi pada kasus sudut yang tidak jelas, segera Anda akan menemukan bug kompiler cukup sering. Biarkan saya memberi Anda sebuah contoh, inilah bug kompiler C # yang saya temukan secara harfiah lima menit yang lalu.
static void N(ref int x){}
...
N(ref 123);
Kompiler memberikan tiga kesalahan.
- Argumen ref atau out harus merupakan variabel yang dapat ditugaskan.
- Kecocokan terbaik untuk N (ref int x) memiliki argumen yang tidak valid.
- Tidak ada "ref" pada argumen 1.
Jelas pesan kesalahan pertama sudah benar dan yang ketiga adalah bug. Algoritma generasi kesalahan sedang mencoba mencari tahu mengapa argumen pertama tidak valid, terlihat pada argumen itu, melihat bahwa argumen tersebut adalah konstanta, dan tidak kembali ke kode sumber untuk memeriksa apakah argumen itu ditandai sebagai "ref"; melainkan mengasumsikan bahwa tidak ada orang yang cukup bodoh untuk menandai sebuah konstanta sebagai referensi, dan memutuskan bahwa referensi tersebut harus hilang.
Tidak jelas apa pesan kesalahan ketiga yang benar, tetapi ini bukan. Bahkan, tidak jelas apakah pesan kesalahan kedua juga benar. Haruskah resolusi kelebihan gagal, atau haruskah "ref 123" diperlakukan sebagai argumen ref dari jenis yang benar? Sekarang saya harus memikirkannya dan membicarakannya dengan tim triase sehingga kita dapat menentukan apa perilaku yang benar.
Anda belum pernah melihat bug ini karena Anda mungkin tidak akan pernah melakukan sesuatu yang konyol untuk mencoba melewati 123 oleh ref. Dan jika Anda melakukannya, Anda mungkin bahkan tidak akan melihat bahwa pesan kesalahan ketiga adalah tidak masuk akal, karena yang pertama sudah benar dan cukup untuk mendiagnosis masalah. Tetapi saya mencoba melakukan hal-hal seperti itu, karena saya mencoba untuk memecahkan kompiler. Jika Anda mencoba, Anda akan melihat bug juga.