Jika pekerjaan kompiler pada dasarnya menerjemahkan kode sumber ke dalam kode level mesin, dapatkah ada kesalahan dalam kompiler, yaitu "terjemahan yang salah?"
Hal yang sama berlaku untuk penerjemah: bisakah ia gagal menghasilkan konten yang dibutuhkan kadang-kadang?
Saya belum pernah mendengar ada bug di kompiler / juru bahasa, tetapi apakah mereka ada?
compiler
bug
interpreters
Raja Penyihir
sumber
sumber
Jawaban:
iya nih
Anda cenderung menemukan mereka lebih banyak dalam bahasa yang secara aktif dikembangkan daripada dalam bahasa yang relatif matang (dan karenanya tidak sering melihat banyak perubahan). Ini mungkin mengapa sebagian besar bahasa dirilis pada berbagai 'tahap' stabilitas. Bangunan malam jauh lebih stabil daripada kandidat rilis , yang dengan sendirinya cenderung lebih stabil daripada versi yang dirilis dan digunakan secara aktif.
Untungnya sebagian besar bahasa ini (terutama yang bersifat open source) akan memiliki sistem pelacakan bug publik yang dapat Anda kirimi laporan.
Dalam pengalaman saya sendiri, saya menemukan bug yang cukup tidak jelas tapi parah di Scala pada Windows . Saya mengirimkan temuan saya ke pelacak bug dan masalah ini diperbaiki dengan cukup cepat. Dalam hal itu, pengembang bahasa cukup pintar untuk memasukkan catatan bermanfaat dalam output log kesalahan, menunjukkan bahwa apa yang saya temui sebenarnya adalah kesalahan kompiler, dan mengatakan ke mana harus menyerahkan laporan.
sumber
Dalam kata-kata awam:
Semua program dapat memiliki bug.
Kompiler adalah program.
Ergo, kompiler dapat memiliki bug.
sumber
Ada bug bahkan di perangkat keras; contoh yang terkenal adalah bug Pentium FDIV . Tanpa ragu ada kemungkinan bahwa kompiler mengandung bug.
sumber
Kompiler dan interpreter adalah perangkat lunak juga, dan dengan demikian mereka tidak bebas dari masalah perangkat lunak lain.
Ini adalah contoh dari kompiler yang terbaru seperti MSVC 11 (2012) , dan inilah artikel tentang bagaimana mereka menguji backend .
sumber
Tentu saja, karena kompiler adalah perangkat lunak.
Pada tahun 2005, saya mengalami kegagalan kode pada perangkat lunak yang sangat penting yang saya tulis untuk perusahaan besar. Karena biaya perusahaan jutaan dolar untuk memperbaiki, mereka tentu saja meluncurkan penyelidikan besar-besaran.
Untungnya (dari sudut pandang saya), masalah ini ternyata menjadi masalah penyusun di Delphi. Pada blok coba akhirnya, nilai kembali fungsi dihancurkan, dan menghasilkan hasil yang benar-benar acak kembali ke pemanggil. Ini didokumentasikan, dan diakui oleh Borland.
.NET dikenal memiliki ratusan kebocoran memori yang berbeda, terutama dalam implementasi awalnya.
Saya berpendapat bahwa tidak ada perangkat lunak tanpa bug. Kompiler tidak terkecuali. Mereka, bagaimanapun, diuji lebih teliti daripada kebanyakan perangkat lunak bisnis, dan dikonsumsi oleh orang-orang yang cerdas, kritis, dan suka bertengkar, sehingga rekam jejak mereka sebenarnya, secara keseluruhan, cukup bagus.
sumber
Tidak hanya bug, tetapi juga malware yang disengaja.
Trojan "login" yang diterapkan oleh Brian Kernighan ke kompiler Unix C asli adalah yang paling terkenal; artikel http://cm.bell-labs.com/who/ken/trust.html memiliki latar belakang tentang hal ini.
sumber
Ya tentu saja seperti kompiler perangkat lunak yang memiliki bug, misalnya daftar bug gcc ada di sini
sumber
Iya nih.
Juga, tidak hanya dengan kompiler, tetapi juga dengan Penerjemah / debugger, dan alat perangkat lunak pihak ke-3.
Kami saat ini menggunakan beberapa perangkat lunak pihak ke-3, dan telah mengalami beberapa masalah. Terkadang mereka berterima kasih kepada kami, karena menemukan dan melaporkan bug. :)
Beberapa dari mereka juga memiliki kebocoran memori, yang menyebabkan crash. Pertanyaan penting di sini adalah, bagaimana menentukan apakah alat pihak ke-3, atau kompiler memiliki bug agar aplikasi Anda berfungsi dengan benar?
sumber
Compiler adalah program yang membaca program yang ditulis dalam satu bahasa (bahasa sumber) dan menerjemahkannya ke dalam program lain yang setara dalam bahasa lain (bahasa target), sebagian besar bahasa mesin.
Ada beberapa fase kompiler yang digunakan untuk memindai kode sumber Anda. Ada tabel simbol yang melacak semua kata kunci yang dipindai dalam kode bahasa sumber.
Fase 1: Lexical Analyzer - membaca semua karakter dalam program sumber dan membentuk pemisahan token yang logis (int, char, float, if-else, for, while dll)
Fase 2: Sintaksis Analyzer - menganalisis struktur aliran token. Penguraian hierarkis ekspresi yang mencakup postfix / awalan dll. (A = b + c * d)
Fase 3: Semantic Analyzer - Jenis pengecekan token (bilangan bulat ke nyata, float dll.) Dan banyak hal seperti operator diutamakan dll.
Fase 4: Penghasil Kode Menengah - a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)
Fase 5: Optimasi Kode - Berbagai Analisis (aliran kontrol, aliran data, transformasi)
yang mengeliminasi: kode Redundansi, propagasi Konstanta, kode mati sebagian, subekspresi umum, kode invarian lingkaran
Fase 6: Pembuatan Kode - Pembuatan kode target (Sebagian Besar Bahasa Perakitan) menempatkan nilai dalam Register
Semua fase ini hanyalah program yang ditulis dengan baik dan mungkin ada sejumlah N kekurangan dalam hal itu ..
sumber
Tentu saja, kompiler hanyalah program dan penulisnya juga idiot :). Bahkan spesifikasi bahasa dapat memiliki bug. Contoh: c # + foreach + lambda .
Atau dengan Python, bug dalam interpreter: Kompilasi iblis dan crash interpreter .
Nah, jika Anda ingin melihat bug di compiler / interpeter -> lihat di php. Ada bug yang terkenal dengan integer overflow. Perbaikan pertama dimulai dari
if (size > INT_MAX) return NULL;
. Kelanjutan cerita .sumber