LLVM vs dentang pada OS X

133

Saya punya pertanyaan tentang llvm, dentang, dan gcc pada OS X.

Apa perbedaan antara llvm-gcc 4.2, llvm 2.0 dan dentang? Saya tahu bahwa mereka semua membangun di atas llvm tetapi bagaimana mereka berbeda?

Selain kompilasi yang lebih cepat, apa kelebihan llvm dibanding gcc?

dominik
sumber
9
llvm hanya sebuah backend, tidak ada kompiler llvm yang berdiri sendiri ... hanya ada beberapa frontend yang berbeda untuk itu, seperti gcc dan dentang.
smerlin
4
@smerlin: "llvm compiler" adalah nama dagang Apple untuk dentang + llvm: developer.apple.com/technologies/tools/…
Stephen Canon
Detail lainnya di sini: stackoverflow.com/a/26724886/1938163
Marco A.

Jawaban:

201

LLVM awalnya berarti "mesin virtual tingkat rendah", meskipun sekarang hanya berdiri untuk dirinya sendiri karena telah berkembang menjadi sesuatu selain mesin virtual tradisional. Ini adalah seperangkat pustaka dan alat, serta representasi perantara standar, yang dapat digunakan untuk membantu membangun kompiler dan kompiler just-in-time. Ia tidak dapat menyusun apa pun selain dari perwakilannya sendiri; diperlukan frontend khusus bahasa untuk melakukannya. Jika orang hanya merujuk ke LLVM, mereka mungkin berarti hanya perpustakaan dan alat tingkat rendah. Beberapa orang mungkin menyebut Dentang atau llvm-gcc secara tidak benar sebagai "LLVM", yang dapat menyebabkan kebingungan.

llvm-gcc adalah versi GCC yang dimodifikasi, yang menggunakan LLVM sebagai backend-nya dan bukan milik GCC. Sekarang sudah usang, mendukung DragonEgg, yang menggunakan sistem plugin baru GCC untuk melakukan hal yang sama tanpa forking GCC.

Dentang adalah kompiler C / C ++ / Objective-C yang sepenuhnya baru, yang menggunakan frontend sendiri, dan LLVM sebagai backend. Keuntungan yang diberikannya adalah pesan kesalahan yang lebih baik, waktu kompilasi yang lebih cepat, dan cara yang lebih mudah bagi alat-alat lain untuk terhubung ke proses kompilasi (seperti debugger LLDB dan analis statis Dentang ). Ini juga cukup modular, dan dapat digunakan sebagai pustaka untuk perangkat lunak lain yang perlu menganalisis C, C ++, atau kode Objective-C.

Masing-masing pendekatan ini (GCC biasa, GCC + LLVM, dan Dentang) memiliki kelebihan dan kekurangan masing-masing. Beberapa set tolok ukur terakhir yang saya lihat menunjukkan GCC untuk menghasilkan kode yang sedikit lebih cepat pada sebagian besar kasus uji (meskipun LLVM sedikit unggul dalam beberapa kasus), sementara LLVM dan Clang memberikan waktu kompilasi yang lebih baik secara signifikan. GCC dan GCC / LLVM combo memiliki keuntungan bahwa lebih banyak kode telah diuji dan bekerja pada rasa GCC dari C; ada beberapa ekstensi khusus kompiler yang hanya dimiliki GCC, dan beberapa tempat di mana standar memungkinkan penerapannya bervariasi tetapi kode tergantung pada satu implementasi tertentu. Ini jauh lebih mungkin jika Anda mendapatkan sejumlah besar kode C warisan yang akan bekerja di GCC daripada itu akan bekerja di Dentang, meskipun ini membaik seiring waktu.

Brian Campbell
sumber
13
Untuk menambah jawaban yang luar biasa ini: dentang juga merupakan kumpulan perpustakaan (disebut libclang) yang dapat Anda gunakan untuk hal-hal seperti menganalisis kode, pelengkapan otomatis, penyorotan sintaksis, dll ... Ini sangat berguna untuk IDE.
5
Ketika membangun untuk MacOS X atau iOS, pertimbangkan bahwa Clang adalah perangkat lunak yang digunakan Apple untuk membangun semua perangkat lunak MacOS X dan iOS mereka termasuk sistem operasi, dan bahwa Dentang adalah apa yang Anda dapatkan secara otomatis, tanpa usaha, dan apa yang semua orang pernah Anda miliki minta bantuan menggunakan. Apple tidak pernah mendukung gcc melewati gcc 4.2, dan tidak lagi mengirimkan versi gcc.
gnasher729
1
@ gnasher729 Ya, jawaban ini ditulis 3 tahun yang lalu, ketika Apple masih mengirimkan llvm-gcc dan Clang, dengan llvm-gcc sebagai kompiler default. Waktu telah berubah sejak saat itu.
Brian Campbell
54

Ada 2 hal berbeda di sini.

LLVM adalah kompiler backend yang dimaksudkan untuk membangun kompiler di atasnya. Ini berkaitan dengan optimasi dan produksi kode yang disesuaikan dengan arsitektur target.

Dentang adalah ujung depan yang mem-parsing kode C, C ++ dan Objective C dan menerjemahkannya menjadi representasi yang cocok untuk LLVM.

llvm gcc adalah versi awal dari kompiler C ++ berbasis llvm berdasarkan gcc 4.2, yang sekarang tidak digunakan lagi karena CLang dapat menguraikan semua yang dapat diuraikan, dan banyak lagi.

Akhirnya, perbedaan utama antara Dentang dan gcc tidak terletak pada kode yang dihasilkan tetapi dalam pendekatan. Sementara gcc bersifat monolitik, CLang telah dibangun sebagai rangkaian perpustakaan. Desain modular ini memungkinkan peluang penggunaan kembali yang besar untuk IDE atau alat penyelesaian misalnya.

Saat ini, kode yang dihasilkan oleh gcc 4.6 umumnya sedikit lebih cepat, tetapi Dentang menutup celah.

Matthieu M.
sumber
5

llvm-gcc-4.2 menggunakan front-end GCC untuk mem-parsing kode Anda, kemudian menghasilkan output yang dikompilasi menggunakan LLVM.

"Llvm compiler 2.0" menggunakan clang front-end untuk mengurai kode Anda, dan menghasilkan output yang dikompilasi menggunakan LLVM. "Dentang" sebenarnya hanya nama untuk front-end ini, tetapi sering digunakan sebagai nama untuk kompiler secara keseluruhan.

Stephen Canon
sumber