Saya bertanya-tanya mengapa C ++ adalah pilihan yang baik untuk menulis kompiler. Tentu saja C juga baik untuk tujuan ini, karena banyak kompiler ditulis dalam C atau C ++ tetapi saya lebih tertarik pada C ++ kali ini. Ada alasan bagus? Saya mencari itu di Internet, tetapi saya tidak dapat menemukan alasan yang bagus.
15
Jawaban:
C ++ memiliki dua sisi untuk itu. Ini memiliki sisi pengembangan tingkat rendah yang membuatnya tampak seperti bahasa alami untuk melakukan hal tingkat rendah seperti pembuatan kode. Ia juga memiliki sisi tingkat tinggi (yang C tidak) yang memungkinkan Anda menyusun aplikasi yang kompleks (seperti kompiler) dengan cara yang logis, berorientasi objek, sambil tetap mempertahankan kinerja. Karena memiliki aspek level rendah dan tinggi, itu adalah pilihan yang baik untuk aplikasi besar yang membutuhkan fitur atau kinerja level rendah.
sumber
Pengalaman saya tidak setuju dengan premis Anda di sini. Bahkan, untuk bahasa tujuan umum tingkat tinggi, itu adalah praktik yang sangat umum untuk menulis kompiler dalam bahasa yang sama dengan bahasa sumber (bahasa yang dikompilasi). Sebagai contoh:
Pengecualian adalah compiler front-ujung yang ditulis untuk kerangka kerja kompiler yang ada, seperti GCC, LLVM atau Polyglot, yang kemudian ditulis dalam bahasa kerangka kerja, atau kompiler yang mengandalkan generator parser yang ada seperti Yacc. Karena GCC, LLVM dan Yacc adalah alat yang umum dan mapan yang ditulis dalam C dan C ++, itu memberikan insentif kepada penulis kompiler untuk menggunakannya, yang mungkin menyebabkan C dan C ++ mendapatkan bagian besar dalam distribusi bahasa implementasi kompiler.
sumber
javac
command-line), yang mengkompilasi Java ke Java Bytecode. Ini ditulis dalam Java - Saya telah memodifikasinya sendiri berkali-kali dan Anda dapat menelusuri sumber Java secara online . Yang lainnya adalah kompiler just-in-time yang tertanam dalam Hotspot JVM, yang mengkompilasi Java Bytecode ke kode mesin asli. Seperti kebanyakan JVM yang ditulis dalam C ++, tetapi ini bukan kompiler Java - pada kenyataannya, ia tidak tahu apa-apa tentang bahasa Java.Untuk mengkompilasi apa untuk apa? Kompiler mengubah kode sumber dari satu bahasa ( bahasa sumber) ke bahasa lain (bahasa tujuan), yang tidak menunjukkan apa pun tentang tingkat rendah bahasa tujuan.
Bahasa yang Anda pilih untuk menulis kompiler tergantung pada konteksnya. Sebagai contoh, bekerja pada proyek yang mengkompilasi bahasa yang berasal dari PHP ke kode PHP asli, saya menggunakan campuran PHP dan C # untuk menulis kompiler, karena itu paling masuk akal bagi saya mengingat keterampilan saya. Orang lain akan memilih Python, atau Java dan PHP, atau C ++ dengan sedikit JavaScript, atau apa pun.
C atau C ++ adalah pilihan populer karena dukungan alat terkait kompiler (lihat jawaban oleh Telastyn), dan karena kedua bahasa tersebut memungkinkan Anda untuk benar-benar asli. Namun tidak ada salahnya memilih bahasa lain.
Perhatikan bahwa agar lebih culun , Anda dapat memilih bahasa sumber untuk menulis kompiler itu sendiri. Itulah yang terjadi pada kompiler CoffeeScript dan banyak kompiler lainnya. Ini juga populer dengan IDE: salah satu Visual Studio pertama dibangun menggunakan Visual Studio yang sama.
sumber
Saya cenderung mempertanyakan premis dasar di sini. Sementara C dan C ++ berfungsi dengan baik untuk menulis kompiler, beberapa bahasa lain tampaknya bekerja dengan baik untuk tugas tersebut.
Sedikit tergantung pada bahasa yang Anda kompilasi. Untuk bahasa yang kecil dan sederhana, C dan Pascal bekerja dengan cukup baik. Jika Anda akan mengkompilasi sesuatu yang besar dan kompleks, kompiler Anda akan menjadi besar dan kompleks juga - dalam hal ini, fitur tambahan C ++ untuk mengatur dan bekerja dengan program yang lebih besar jelas berguna. Itu tidak benar-benar sangat spesifik untuk kompilasi, hanya fitur yang berguna untuk program yang lebih besar secara umum.
Saya pikir itu juga layak disebutkan satu poin lainnya. Pemula (tampaknya) menganggap kompiler kebanyakan melakukan manipulasi teks, sehingga mereka berpikir sesuatu seperti Perl akan sangat membantu dalam menulis kompiler. Pada kenyataannya, sebagian besar bagian kompilasi yang menarik tidak benar-benar dimulai sampai setelah Anda membangun AST Anda. Sementara saya yakin Perl dapat melakukan pekerjaan dengan sangat baik, kemampuan manipulasi teksnya tidak benar-benar memberikan keuntungan besar juga (manipulasi teks sebagian besar di lexer, dan generator lexer untuk hal-hal seperti C semua dukungan RE tetap).
sumber
Kompiler dapat diimplementasikan dalam bahasa modern apa pun. Namun, salah satu persyaratan paling penting dari sebuah kompiler adalah harus cepat.
C ++ memiliki keunggulan yang jelas di sini. Optimasi dalam C ++ tidak murah. Namun, karena sifat tingkat rendah dari bahasa ini, dimungkinkan untuk mengoptimalkan kode C ++ secara manual lebih dari bahasa lain (kecuali Majelis yang tidak portabel).
sumber
Saya menduga bahwa motivator utama untuk penggunaannya adalah keluaran Lex / Yacc / Bison (terutama) dalam C. Karena itu sudah menjadi standar sejak lama, ia memiliki momentum.
Bukannya itu alasan yang sangat bagus ...
sumber