LLVM vs clang trên OS X


133

Tôi có một câu hỏi liên quan đến llvm, clang và gcc trên OS X.

Sự khác biệt giữa llvm-gcc 4.2, llvm 2.0 và clang là gì? Tôi biết rằng tất cả họ đều xây dựng trên llvm nhưng chúng khác nhau như thế nào?

Bên cạnh việc biên dịch nhanh hơn, lợi thế của llvm so với gcc là gì?


9
llvm chỉ là phần phụ trợ, không thể có trình biên dịch llvm độc lập ... chỉ có các tiền đề khác nhau cho nó, như gcc và clang.
smerlin

4
@smerlin: "trình biên dịch llvm" là tên thương mại của Apple cho clang + llvm: developer.apple.com/technology/tools/
Stephen Canon

Các chi tiết khác tại đây: stackoverflow.com/a/26724886/1938163
Marco A.

Câu trả lời:


201

LLVM ban đầu là viết tắt của "máy ảo cấp thấp", mặc dù bây giờ nó chỉ là viết tắt của chính nó vì nó đã phát triển thành một cái gì đó khác với một máy ảo truyền thống. Nó là một tập hợp các thư viện và công cụ, cũng như một biểu diễn trung gian được tiêu chuẩn hóa, có thể được sử dụng để giúp xây dựng trình biên dịch và trình biên dịch đúng lúc. Nó không thể tự biên dịch bất cứ thứ gì ngoài đại diện trung gian của chính nó; nó cần một lối vào ngôn ngữ cụ thể để làm như vậy. Nếu mọi người chỉ tham khảo LLVM, có lẽ họ chỉ có nghĩa là thư viện và công cụ cấp thấp. Một số người có thể gọi Clang hoặc llvm-gcc không chính xác là "LLVM", điều này có thể gây ra một số nhầm lẫn.

llvm-gcc là phiên bản sửa đổi của GCC, sử dụng LLVM làm phụ trợ thay vì của GCC. Hiện tại, nó không được chấp nhận, có lợi cho DragonEgg, sử dụng hệ thống plugin mới của GCC để làm điều tương tự mà không từ bỏ GCC.

Clang là một trình biên dịch C / C ++ / Objective-C hoàn toàn mới, sử dụng lối vào riêng của nó và LLVM làm phụ trợ. Ưu điểm mà nó cung cấp là thông báo lỗi tốt hơn, thời gian biên dịch nhanh hơn và cách dễ dàng hơn để các công cụ khác có thể tham gia vào quá trình biên dịch (như trình gỡ lỗi LLDBtrình phân tích tĩnh Clang ). Nó cũng có tính mô đun hợp lý và do đó có thể được sử dụng làm thư viện cho các phần mềm khác cần phân tích mã C, C ++ hoặc Objective-C.

Mỗi cách tiếp cận này (GCC, GCC + LLVM và Clang) đều có những ưu điểm và nhược điểm. Một vài bộ điểm chuẩn cuối cùng tôi thấy cho thấy GCC tạo ra mã nhanh hơn một chút trong hầu hết các trường hợp thử nghiệm (mặc dù LLVM có một chút cạnh trong một vài), trong khi LLVM và Clang cho thời gian biên dịch tốt hơn đáng kể. Các combo GCC và GCC / LLVM có lợi thế là rất nhiều mã đã được thử nghiệm và hoạt động trên hương vị GCC của C; có một số phần mở rộng cụ thể của trình biên dịch mà chỉ GCC mới có và một số nơi tiêu chuẩn cho phép thực hiện thay đổi nhưng mã phụ thuộc vào một triển khai cụ thể. Sẽ có nhiều khả năng hơn nếu bạn nhận được một lượng lớn mã C kế thừa mà nó sẽ hoạt động trong GCC so với nó sẽ hoạt động trong Clang, mặc dù điều này đang được cải thiện theo thời gian.


13
Để thêm vào câu trả lời tuyệt vời này: clang cũng là một tập hợp các thư viện (được gọi là libclang), bạn có thể sử dụng cho những việc như phân tích mã, tự động hoàn thành, tô sáng cú pháp, v.v. Điều này rất tiện cho IDE.

5
Khi xây dựng cho MacOS X hoặc iOS, hãy xem Clang là phần mềm mà Apple sử dụng để xây dựng tất cả phần mềm MacOS X và iOS của họ bao gồm cả hệ điều hành và Clang là thứ bạn tự động nhận được, không cần nỗ lực và là thứ mà mọi người bạn từng có yêu cầu giúp đỡ đang sử dụng. Apple chưa bao giờ hỗ trợ gcc qua gcc 4.2 và không gửi bất kỳ phiên bản gcc nào nữa.
gnasher729

1
@ gnasher729 Vâng, câu trả lời này đã được viết cách đây 3 năm, khi Apple vẫn đang vận chuyển cả llvm-gcc và Clang, với llvm-gcc là trình biên dịch mặc định. Thời thế đã thay đổi kể từ đó.
Brian Campbell

54

Có 2 điều khác nhau ở đây.

LLVM là một trình biên dịch phụ trợ có nghĩa là để xây dựng các trình biên dịch trên nó. Nó liên quan đến tối ưu hóa và sản xuất mã phù hợp với kiến ​​trúc đích.

CLang là một giao diện người dùng phân tích mã C, C ++ và Objective C và chuyển nó thành một đại diện phù hợp với LLVM.

llvm gcc là phiên bản ban đầu của trình biên dịch C ++ dựa trên llvm dựa trên gcc 4.2, hiện không dùng nữa vì CLang có thể phân tích mọi thứ mà nó có thể phân tích, và hơn thế nữa.

Cuối cùng, sự khác biệt chính giữa CLang và gcc không nằm ở mã được sản xuất mà nằm ở cách tiếp cận. Trong khi gcc là nguyên khối, CLang đã được xây dựng như một bộ thư viện. Thiết kế mô-đun này cho phép các cơ hội tái sử dụng tuyệt vời cho IDE hoặc các công cụ hoàn thành chẳng hạn.

Hiện tại, mã được tạo bởi gcc 4.6 thường nhanh hơn một chút, nhưng CLang đang thu hẹp khoảng cách.


5

llvm-gcc-4.2 sử dụng giao diện người dùng GCC để phân tích mã của bạn, sau đó tạo đầu ra được biên dịch bằng LLVM.

"Trình biên dịch llvm 2.0" sử dụng clang front-end để phân tích mã của bạn và tạo đầu ra được biên dịch bằng LLVM. "Clang" thực sự chỉ là tên của front-end này, nhưng nó thường được sử dụng ngẫu nhiên như một tên cho toàn bộ trình biên dịch.

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.