GCC vs clang / LLVM - ưu và nhược điểm của từng [đã đóng]


20

Những ưu và nhược điểm của GCC so với clang / LLVM là gì?


3
Ưu / nhược điểm cho ai? LLVM rõ ràng là vượt trội như là phụ trợ cho trình biên dịch, trừ khi bạn yêu cầu một số lượng lớn các kiến ​​trúc được hỗ trợ. Nhưng tôi cho rằng bạn đang nói về người dùng cuối.

Câu trả lời:


19

gcc rất trưởng thành, dễ cài đặt (ít nhất là đối với hầu hết các hệ thống) và là trình biên dịch mặc định cho rất nhiều hệ thống, vì vậy trong nhiều trường hợp, mọi người đã cài đặt nó gần như không nhận ra. Nó đã được chuyển đến hàng trăm kiến ​​trúc, do đó, nhiều khả năng nó sẽ hoạt động tốt nếu bạn phải nhắm mục tiêu vào phần cứng tối nghĩa.

clang mới hơn nhiều. Nó thường tạo ra các thông báo lỗi tốt hơn nhiều, đặc biệt là cho các mẫu C ++. Trong nhiều trường hợp, nó chạy nhanh hơn rất nhiều. Nó được xây dựng chủ yếu dưới dạng một tập hợp các thư viện, do đó, có khá nhiều dự án khác (ví dụ: máy phân tích mã) sử dụng cùng một giao diện người dùng, hiểu cùng một đầu vào, v.v ... Sử dụng llvm vì mặt sau của nó giúp nó linh hoạt hơn cách bạn tạo mã từ nó.


17
  1. Clang có báo cáo lỗi tốt hơn nhiều. Ví dụ: nếu bạn tạo một lỗi đánh máy trong tên hàm bạn gọi, Clang sẽ báo cáo rằng đây có thể là một lỗi đánh máy (và đề xuất tên chính xác), trong khi GCC sẽ khiếu nại về tên hàm không xác định.

  2. GCC thường tạo mã nhanh hơn nếu bạn nhắm mục tiêu x86 / x86-64. Đối với ARM tình hình là mơ hồ, thường Clang tối ưu hóa tốt hơn. Ngoài ra, AFAIK Clang không hỗ trợ tối ưu hóa cho kích thước mã.

  3. GCC sử dụng rất nhiều heuristic. Điều này tốt cho hiệu năng (trong trường hợp điển hình), nhưng thật tệ nếu bạn muốn thực hiện một số tối ưu hóa ở mức nguồn (ví dụ: không kiểm soát vòng lặp). Ngay cả những thay đổi mã nguồn nhỏ cũng có thể khiến GCC tạo ra một đầu ra hoàn toàn khác. Clang dễ dự đoán hơn và thường nó tạo ra mã mà bạn mong đợi.

  4. Không giống như Jerry Coffin, tôi thấy việc xây dựng GCC từ nguồn khó hơn Clang rất nhiều. Quy trình từ trang Bắt đầu của Clang luôn hiệu quả với tôi. Hướng dẫn tương tự cho GCC không bao giờ làm việc trong lần thử đầu tiên. GCC có sự phụ thuộc vào các phiên bản cụ thể của GMP, MPFR, MPC, Parma Polyhedra Library và CLooG, và tôi cần một số lần lặp để tìm các phiên bản hoạt động cho một bản phát hành GCC cụ thể (vâng, sử dụng các phiên bản mới nhất của các thư viện đó không hoạt động ).

  5. Tôi có cảm giác rằng Clang được thử nghiệm tốt hơn GCC. Mặc dù tôi chỉ sử dụng các bản phát hành chính thức của GCC, đôi khi nó tạo ra mã bị lỗi. Đối với Clang tôi thường sử dụng phiên bản trung kế (một lần nữa, vì nó dễ xây dựng), nhưng tôi chưa bao giờ thấy nó tạo ra đầu ra sai.

  6. GCC gần như là tiêu chuẩn trong thế giới Linux và nó bổ sung rất nhiều tính năng phi tiêu chuẩn được sử dụng rộng rãi trong phần mềm Linux. Clang cố gắng tương thích với GCC, nhưng đôi khi nó chỉ lặng lẽ bỏ qua chúng. Quan trọng nhất, Clang không hỗ trợ OpenMP. Tuy nhiên, nó cũng có các tiện ích mở rộng không được GCC hỗ trợ, nhưng có thể hữu ích (ví dụ: các hàm nội tại add-with-carry __buildin_addc).

  7. Nếu bạn muốn thực hiện nghiên cứu trình biên dịch, hoặc chỉ tò mò về cách thức hoạt động của nó, bạn sẽ thấy mã nguồn Clang / LLVM dễ truy cập hơn. Mã Clang / LLVM có thể đọc được bằng con người, không chỉ trình biên dịch có thể đọc được.

  8. (Áp dụng từ chối AINAL) Giấy phép Clang / LLVM cho phép bạn tự do hơn về những gì bạn có thể làm với mã, ví dụ: sử dụng trong sản phẩm thương mại hoặc nguồn đóng. Giấy phép cho các thư viện thời gian chạy GCC thêm một lớp hạn chế khác trong khi thời gian chạy trình biên dịch Clang (thư viện trình biên dịch-rt) theo giấy phép MIT cho phép.

Tóm tắt: biên dịch với Clang khi bạn phát triển chương trình và với GCC cho bản dựng cuối cùng (nhưng đảm bảo rằng nó nhanh hơn và không bị hỏng). Gắn bó với Clang / LLVM nếu bạn thực hiện nghiên cứu trình biên dịch.


Thật thú vị, tôi chưa bao giờ biết rằng Clang có bản chất bổ trợ mang theo. Nhưng nó nên __builtin_add, không phải __buildin_addc. Dù sao, Clang đủ thông minh để tạo ra addckhi nó gặp phải một phép cộng rộng bằng cách sử dụng so sánh như mang
phuclv

Ý tôi là __builtin_addckhông__buildin_addc
phuclv 19/03/2015

So sánh hiệu suất ở đây đã hết hạn. Theo các điểm chuẩn gần đây hơn, tiếng kêu nhanh hơn gcc trên x86 / 64 trong hơn một nửa thử nghiệm (ví dụ: openbenchmarking.org/result/1605071-HA-GCCCLANG568 )
Jules

3

Nếu bạn có kiến ​​trúc CPU mới hoặc tối ưu hóa mới và muốn mở chúng theo GPL, bạn có thể đóng góp chúng cho gcc. Tuy nhiên, gcc ít mô-đun hơn, vì vậy điều này có thể liên quan đến nhiều công việc hơn để thêm sửa đổi / bổ sung của một người. Nếu bạn muốn đóng góp kiến ​​trúc mới hoặc tối ưu hóa cho dự án nguồn mở, nhưng theo giấy phép không phải GPL, bạn có thể đóng góp chúng cho LLVM / clang. Có tồn tại các tập đoàn mà bộ phận pháp lý chỉ cho phép sau này.


-3

Hôm nay (8/11/2011), GCC hỗ trợ rất nhiều tính năng C ++ 0x so với Clang. Nếu bạn muốn những tính năng đó, nó không có trí tuệ; GCC là lựa chọn của bạn.


Câu trả lời này là chính xác và nhiều thông tin trong khung thời gian được chỉ định theo nghiên cứu của tôi.

8
Nhưng thực sự không phải là một câu trả lời hay, bởi vì cho đến ngày hôm nay (28/07/2012), điểm này không còn hiệu lực. Clang hỗ trợ nhiều hơn GCC, nếu có bất cứ điều gì.
DeadMG
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.