Mengapa representasi intermediate (LLVM IR) LLVM lebih mirip perakitan daripada pohon?
Atau, mengapa implementasi bahasa menargetkan LLVM IR daripada AST clang?
Saya tidak mencoba mengajukan dua pertanyaan berbeda sekaligus jika tampaknya demikian. Bagi saya, sepertinya klien dan pemrogram perpustakaan telah mencapai kesepakatan bahwa API LLVM, tidak lebih dan tidak kurang, jelas merupakan desain perangkat lunak yang baik dan pertanyaan saya adalah "mengapa?".
Alasan saya bertanya adalah sepertinya LLVM dapat memberikan lebih banyak fungsi ke frontend jika IR-nya seperti AST karena alat berbasis AST yang berdering dapat digunakan untuk frontend apa pun. Atau, bahasa yang menargetkan LLVM IR bisa mendapatkan lebih banyak fungsi jika mereka menargetkan AST dentang.
Clang memiliki kelas dan fungsi untuk membuat dan bekerja dengan AST dan itu satu - satunya proyek frontend yang sangat terkait dengan proyek LLVM jadi mengapa AST-fungsionalitas clang eksternal ke LLVM?
Dari atas kepala saya, saya tahu bahwa Rust (rustc), D (ldc), dan Haskell (GHC) semua dapat menggunakan LLVM sebagai backend tetapi mereka tidak menggunakan Dentang Dentang (sejauh yang saya tahu, saya bisa salah). Saya tidak tahu semua detail internal dari kompiler ini, tetapi setidaknya Rust dan D sepertinya bisa dikompilasi ke AST clang. Mungkin Haskell juga bisa, tetapi saya kurang yakin tentang itu.
Apakah ini karena alasan historis (LLVM awalnya menjadi "mesin virtual tingkat rendah" dan berbunyi nanti)? Apakah ini karena frontend lain ingin memiliki kontrol sebanyak mungkin atas apa yang mereka berikan ke LLVM? Apakah ada alasan mendasar bahwa AST dentang tidak sesuai untuk bahasa "non-C-like"?
Saya tidak bermaksud pertanyaan ini menjadi latihan dalam mindreading. Saya hanya ingin itu bermanfaat bagi kita yang ingin tahu, tetapi belum lancar dalam, desain kompiler. Karena proyek LLVM dan dentang dikembangkan di depan umum, saya berharap seseorang yang akrab dengan pengembangan proyek-proyek ini dapat menjawab atau bahwa jawabannya cukup jelas bagi beberapa kutu buku yang dikompilasi sehingga mereka merasa cukup percaya diri untuk menjawab.
Untuk mencegah beberapa jawaban yang jelas tetapi tidak memuaskan:
Ya, memiliki IR seperti perakitan memberikan lebih banyak kontrol kepada siapa pun yang membuat IR (mungkin X lang memiliki basis kode dan format AST yang lebih baik daripada dentang) tetapi jika itu satu-satunya jawaban, maka pertanyaannya adalah "mengapa hanya LLVM memiliki perakitan - seperti IR daripada IR seperti pohon tingkat tinggi dan IR seperti perakitan tingkat rendah? "
Ya, tidak sulit untuk mem-parsing bahasa pemrograman menjadi AST (setidaknya dibandingkan dengan langkah-langkah kompilasi lainnya). Meski begitu, mengapa menggunakan AST terpisah? Jika tidak ada yang lain, menggunakan AST yang sama memungkinkan Anda untuk menggunakan alat yang beroperasi pada AST (bahkan hanya hal-hal sederhana seperti printer AST).
Ya saya sangat setuju bahwa menjadi lebih modular adalah hal yang baik, tetapi jika itu satu-satunya alasan, lalu mengapa implementasi bahasa lain cenderung menargetkan LLVM IR daripada AST dentang?
Pre-emptions ini mungkin keliru atau mengabaikan detail, jadi jangan ragu untuk memberikan jawaban ini jika Anda memiliki lebih banyak detail atau asumsi saya salah.
Bagi siapa pun yang ingin menjawab pertanyaan yang lebih dapat dijawab secara pasti: apa keuntungan dan kerugian dari IR seperti perakitan vs IR seperti pohon?