Saya tidak berencana menulis kompiler dalam waktu dekat; tetap, saya cukup tertarik dengan teknologi kompiler, dan bagaimana hal ini dapat dibuat lebih baik.
Dimulai dengan bahasa yang dikompilasi, sebagian besar kompiler memiliki dua tingkat kesalahan: peringatan dan kesalahan, yang pertama adalah sebagian besar waktu hal-hal non-fatal yang harus Anda perbaiki, dan kesalahan yang menunjukkan sebagian besar waktu bahwa tidak mungkin untuk menghasilkan mesin- (atau byte-) kode dari input.
Padahal, ini adalah definisi yang cukup lemah. Dalam beberapa bahasa seperti Java, peringatan tertentu tidak mungkin dihilangkan tanpa menggunakan @SuppressWarning
arahan. Juga, Java memperlakukan masalah non-fatal tertentu sebagai kesalahan (misalnya, kode yang tidak terjangkau di Jawa memicu kesalahan karena alasan yang ingin saya ketahui).
C # tidak memiliki masalah yang sama, tetapi memang memiliki beberapa. Tampaknya kompilasi terjadi dalam beberapa lintasan, dan lintasan yang gagal akan membuat operan lebih lanjut tidak dieksekusi. Karena itu, jumlah kesalahan yang Anda dapatkan ketika bangunan gagal sering terlalu diremehkan. Sekali jalan mungkin mengatakan Anda memiliki dua kesalahan, tetapi begitu Anda memperbaikinya mungkin Anda akan mendapatkan 26 kesalahan baru.
Menggali ke C dan C ++ hanya menunjukkan kombinasi yang buruk pada kelemahan diagnostik kompilasi Java dan C # (meskipun mungkin lebih akurat untuk mengatakan bahwa Java dan C # berjalan sesuai dengan masing-masing masalah). Beberapa peringatan seharusnya merupakan kesalahan (misalnya ketika tidak semua jalur kode mengembalikan nilai) dan masih merupakan peringatan karena, saya kira, pada saat mereka menulis standar, teknologi kompiler tidak cukup baik untuk membuat semacam ini. memeriksa wajib. Dalam nada yang sama, kompiler sering memeriksa lebih dari standar mengatakan, tetapi masih menggunakan tingkat kesalahan peringatan "standar" untuk temuan tambahan. Dan seringkali, kompiler tidak akan melaporkan semua kesalahan yang dapat mereka temukan segera; mungkin butuh beberapa kompilasi untuk menyingkirkan semuanya. Belum lagi kesalahan cryptic compiler C ++ suka meludah,
Sekarang menambahkan bahwa banyak sistem build dapat dikonfigurasi untuk melaporkan kegagalan ketika kompiler mengeluarkan peringatan, kami hanya mendapatkan campuran aneh: tidak semua kesalahan fatal tetapi beberapa peringatan harus; tidak semua peringatan layak tetapi ada yang secara eksplisit ditekan tanpa menyebutkan keberadaannya lebih lanjut; dan terkadang semua peringatan menjadi kesalahan.
Bahasa yang tidak dikompilasi masih memiliki bagian pelaporan kesalahan buruk. Kesalahan ketik di Python tidak akan dilaporkan sampai kode benar-benar dijalankan, dan Anda tidak pernah dapat benar-benar melakukan lebih dari satu kesalahan pada satu waktu karena skrip akan berhenti dijalankan setelah bertemu satu.
PHP, di sisi lain, memiliki banyak tingkat kesalahan yang signifikan, dan pengecualian. Kesalahan parse dilaporkan satu per satu, peringatan sering kali sangat buruk sehingga harus membatalkan skrip Anda (tetapi jangan secara default), pemberitahuan benar-benar sering menunjukkan masalah logika yang serius, beberapa kesalahan sebenarnya tidak cukup buruk untuk menghentikan skrip Anda tetapi masih lakukan, dan seperti biasa dengan PHP, ada beberapa hal yang sangat aneh di sana (kenapa kita perlu tingkat kesalahan untuk kesalahan fatal yang tidak benar-benar fatal?, E_RECOVERABLE_E_ERROR
saya berbicara dengan Anda).
Tampak bagi saya bahwa setiap implementasi tunggal pelaporan kesalahan kompiler yang dapat saya pikirkan rusak. Ini benar-benar memalukan, karena bagaimana semua programmer yang baik menekankan betapa pentingnya menangani kesalahan dengan benar dan belum bisa mendapatkan alat mereka sendiri untuk melakukannya.
Menurut Anda apa cara yang tepat untuk melaporkan kesalahan kompiler?