GCC vs dentang / LLVM - pro dan kontra dari masing-masing [ditutup]

20

Apa pro dan kontra dari GCC vs dentang / LLVM?

yodie
sumber
3
Pro / Kontra untuk siapa? LLVM jelas lebih unggul sebagai backend untuk kompiler, kecuali jika Anda memerlukan jumlah arsitektur yang didukung yang konyol. Tapi saya menganggap Anda sedang berbicara tentang pengguna akhir.

Jawaban:

19

gcc sangat matang, mudah untuk menginstal (setidaknya untuk sebagian besar sistem), dan merupakan kompiler default untuk banyak sistem sehingga dalam banyak kasus orang menginstalnya hampir tanpa menyadarinya. Sudah porting ke miliaran arsitektur, sehingga jauh lebih mungkin untuk bekerja di luar kotak jika Anda harus menargetkan perangkat keras yang tidak jelas.

dentang jauh lebih baru. Ini sering menghasilkan pesan kesalahan yang jauh lebih baik, terutama untuk template C ++. Dalam banyak kasus, ini berjalan jauh lebih cepat. Ini dibangun terutama sebagai satu set perpustakaan, jadi ada beberapa proyek lain (misalnya, penganalisa kode) yang menggunakan front-end yang sama, memahami input yang sama, dll. Menggunakan llvm sebagai ujung belakangnya memberikan fleksibilitas ekstra dalam bagaimana Anda menghasilkan kode darinya.

Jerry Coffin
sumber
17
  1. Dentang memiliki pelaporan kesalahan yang jauh lebih baik. Misalnya jika Anda membuat kesalahan ketik pada nama fungsi yang Anda panggil, Dentang akan melaporkan bahwa ini kemungkinan salah ketik (dan menyarankan nama yang benar), sementara GCC akan mengeluh tentang nama fungsi yang tidak dikenal.

  2. GCC biasanya menghasilkan kode yang lebih cepat jika Anda menargetkan x86 / x86-64. Untuk ARM situasinya ambigu, sering dentang mengoptimalkan lebih baik. Juga, AFAIK Dentang tidak mendukung pengoptimalan untuk ukuran kode.

  3. GCC menggunakan banyak heuristik. Ini bagus untuk kinerja (dalam kasus khusus), tetapi mengerikan jika Anda ingin melakukan beberapa optimasi tingkat sumber (mis. Loop membuka gulungan). Bahkan perubahan kode sumber kecil dapat membuat GCC menghasilkan output yang sama sekali berbeda. Dentang lebih mudah diprediksi, dan biasanya menghasilkan kode yang Anda harapkan.

  4. Tidak seperti Jerry Coffin, saya menemukan membangun GCC dari sumber jauh lebih sulit daripada Dentang. Prosedur dari halaman Memulai Dentang selalu bekerja untuk saya. Manual serupa untuk GCC tidak pernah berhasil pada percobaan pertama. GCC memiliki ketergantungan pada versi GMP, MPFR, MPC, Parma Polyhedra Library, dan CLooG tertentu, dan saya membutuhkan beberapa iterasi untuk menemukan versi yang akan berfungsi untuk rilis GCC tertentu (ya, menggunakan versi terbaru dari perpustakaan itu tidak berfungsi ).

  5. Saya merasa bahwa dentang lebih baik diuji daripada GCC. Meskipun saya hanya menggunakan rilis resmi GCC, kadang-kadang menghasilkan kode yang salah. Untuk Dentang saya biasanya menggunakan versi trunk (sekali lagi, karena mudah dibuat), tetapi saya tidak pernah melihatnya menghasilkan output yang salah.

  6. GCC hampir standar di dunia Linux, dan menambahkan banyak fitur non-standar yang banyak digunakan dalam perangkat lunak Linux. Dentang mencoba kompatibel dengan GCC, tetapi kadang-kadang diam-diam mengabaikan mereka. Yang paling penting, Dentang tidak mendukung OpenMP. Namun, ia juga memiliki ekstensi yang tidak didukung oleh GCC, tetapi dapat berguna (mis. Add-with-carry fungsi intrinsik __buildin_addc).

  7. Jika Anda ingin melakukan penelitian kompiler, atau hanya ingin tahu tentang cara kerjanya, Anda akan menemukan kode sumber Dentang / LLVM lebih mudah diakses. Kode dentang / LLVM dapat dibaca oleh manusia, tidak hanya dapat dibaca oleh kompiler.

  8. (Declaimer AINAL berlaku) Lisensi Dentang / LLVM memberi Anda lebih banyak kebebasan tentang apa yang dapat Anda lakukan dengan kode, misalnya penggunaan dalam produk komersial atau sumber tertutup. Lisensi untuk pustaka runtime GCC menambahkan lapisan pembatasan lainnya sementara runtuh kompiler Dentang (pustaka compiler-rt) berada di bawah lisensi MIT permisif.

Rangkuman: kompilasi dengan Dentang ketika Anda mengembangkan program, dan dengan GCC untuk versi final (tapi pastikan itu lebih cepat dan tidak rusak). Tetap dengan Dentang / LLVM jika Anda melakukan penelitian kompiler.

Marat Dukhan
sumber
Menarik, saya tidak pernah tahu bahwa Clang memiliki intrinsik add-with-carry. Tapi itu seharusnya __builtin_add, bukan __buildin_addc. Lagi pula, Clang cukup pintar untuk menghasilkan addcketika menemukan banyak menggunakan perbandingan sebagai carry
phuclv
Maksud saya __builtin_addctidak__buildin_addc
phuclv
Perbandingan kinerja di sini sudah ketinggalan zaman. Menurut tolok ukur yang lebih baru, dentang lebih cepat daripada gcc pada x86 / 64 dalam tes sedikit lebih dari setengah (misalnya openbenchmarking.org/result/1605071-HA-GCCCLANG568 )
Jules
3

Jika Anda memiliki arsitektur CPU baru atau optimisasi baru, dan ingin membukanya di bawah GPL, Anda dapat berkontribusi pada gcc. Namun, gcc kurang modular, jadi ini mungkin melibatkan lebih banyak pekerjaan untuk menambahkan modifikasi / penambahan seseorang. Jika Anda ingin berkontribusi arsitektur baru atau optimisasi ke proyek open source, tetapi di bawah lisensi non-GPL, Anda dapat berkontribusi mereka ke LLVM / dentang. Ada perusahaan yang departemen hukumnya hanya mengizinkan yang terakhir.

hotpaw2
sumber
-3

Hari ini (8/11/2011), GCC mendukung lebih banyak fitur C ++ 0x daripada Clang. Jika Anda menginginkan fitur-fitur itu, itu adalah no-brainer; GCC adalah pilihan Anda.

Sean McMillan
sumber
Jawaban ini akurat dan informatif dalam jangka waktu yang ditentukan sesuai dengan penelitian saya.
8
Tapi bukan jawaban yang sangat bagus kok, karena sampai hari ini (28/07/2012) intinya sudah tidak berlaku lagi. Dentang mendukung lebih dari GCC, jika ada.
DeadMG