2011-01-03 33 views
46

Trong iOS SDK mới nhất, Apple cung cấp ba tùy chọn trình biên dịch: GCC, LLVM với Clang và LLVM-GCC. Tôi hiểu nhiều hơn hoặc ít hơn những gì có nghĩa là 3, những gì LLVM và Clang, và như vậy. Những gì tôi không biết là những gì điều này có nghĩa là trong thực tế cho các nhà phát triển iPhone. Tôi nên sử dụng cái nào trong số này vào thời điểm này, kể từ tháng 1 năm 2011? LLVM có đủ trưởng thành để tôi có thể sử dụng nó một cách an toàn mà không bị vướng vào các lỗi trong nó quá thường xuyên không? Việc chuyển sang LLVM có bất kỳ nhược điểm nào khác không? Nếu có, thì lợi thế tốc độ có vượt trội hơn chúng không? Có bất kỳ lý do nào khác để chuyển đổi ngoại trừ tốc độ không?LLVM so với GCC để phát triển iOS

+0

+1 cho Câu hỏi hay. –

Trả lời

37

Cập nhật: Bởi vì mọi người vẫn đang tìm câu trả lời này, tôi cảm thấy như tôi nên cung cấp một bản cập nhật phù hợp. Bây giờ, tôi hy vọng rõ ràng rằng Clang hoàn toàn là con đường để lập trình, với Clang là trình biên dịch mặc định trong các phiên bản mới hơn của Xcode và hỗ trợ ARC và các cấu trúc ngôn ngữ mới và sắp tới (mảng và từ điển subscripting, literals, v.v.) . Gần như hoàn toàn không có lý do gì để biên dịch với GCC nữa, và cho các codebases sử dụng ARC và các tính năng mới, sử dụng GCC đơn giản không còn phù hợp hoặc có thể nữa (LLVM-GCC có thể hỗ trợ các tính năng này). ổn định).


Hiện tại (với LLVM-2.0 được bao gồm trong Xcode 4.0 beta), LLVM đủ trưởng thành để sử dụng mã sản xuất. Nó biên dịch nhanh hơn GCC một chút và tạo mã nhanh hơn, vì vậy hãy sử dụng nó bất cứ khi nào bạn có thể (khá nhiều, cố gắng tránh GCC nếu có điều gì đó tốt hơn). Phiên bản Xcode 3.2.5 chuẩn chứa LLVM-1.6 (không phải mới nhất), vì vậy tôi khuyên bạn nên chạy thử nghiệm tốc độ để xem có sự khác biệt đáng chú ý giữa GCC và LLVM hay biên dịch Clang từ nguồn và nhận phiên bản mới nhất hay không.

Về cơ bản, không cần GCC nữa, LLVM + Clang là quá đủ.

+0

Vì vậy, nếu tôi đang chạy Xcode 3 và tôi không muốn biên dịch từ nguồn, LLVM + GCC là lựa chọn tốt nhất? –

+1

Không, chỉ cần gắn bó với LLVM-1.6 và bạn sẽ ổn thôi. Một lần nữa, không có lý do gì để sử dụng GCC, ngay cả khi kết hợp với LLVM. –

+1

Tôi sẽ không đến đó, tôi đã nhìn thấy và đã nghe nói về các vấn đề quan trọng nhưng trong LLVM tạo mã (chúng tôi đã có một vụ tai nạn nộp kho ứng dụng mà chỉ được giải quyết bằng cách di chuyển trình biên dịch GCC, theo khuyến cáo của Apple). Có thể thêm một bản phát hành nữa và nó sẽ sẵn sàng cho thời gian chính ... –

3

Trong WWDC10 mới nhất, họ đã khuyến khích các nhà phát triển sử dụng trình biên dịch LLVM hiện tại hơn. Tôi quên đường chính xác mà họ đã nói chi tiết nó - một trong những "mới trong Xcode". Về cơ bản, họ đề nghị sử dụng LLVM-2.0 khi có thể, nếu không LLVM-GCC và tránh GCC một mình hoàn toàn.

Nếu bạn là một nhà phát triển iOS đã đăng ký, bạn có thể xem hầu hết các buổi miễn phí tại http://developer.apple.com/videos/wwdc/2010/

+4

Tuy nhiên, sau đó, một số người (bao gồm cả bản thân tôi) đã tìm thấy một số lỗi thực sự lạ từ việc biên soạn LLVM. Không thường xuyên nhưng nó là đủ để chuyển trở lại GCC cho tất cả các ứng dụng lưu trữ ứng dụng. Tôi vẫn sử dụng LLVM để gỡ lỗi xây dựng mặc dù. Tôi nghĩ rằng đầu năm nay LLVM có thể sẽ đủ ổn định để sử dụng cho việc đệ trình. –

4

Một lý do chính khác để chuyển sang Clang là chính xác hơn (cột & dải số dòng) và thông báo lỗi có thể đọc được.

18

Ok, tôi nghĩ rằng không ai trong số các câu trả lời dưới đây nói toàn bộ câu chuyện, vì vậy đây là quan điểm của tôi về một phản ứng với câu hỏi của tôi:

  • LLVM biên dịch mã nhanh hơn so với GCC, có thể tạo ra mã mà chạy nhanh hơn, và giao diện Clang cung cấp các thông báo lỗi chính xác hơn GCC - vì vậy chắc chắn có lý do để chuyển đổi;

  • cho biết, phiên bản được cung cấp với Xcode ổn định mới nhất (LLVM 1.6) chưa ổn định 100%, bạn có thể gặp phải một số lỗi nhỏ nếu bạn không may mắn. Vì vậy, nếu bạn muốn được an toàn, bạn nên biên dịch LLVM (2.0) mới nhất từ ​​nguồn, hoặc gắn bó với GCC trong vài tháng tới;

  • trong vài tháng, có thể khi Apple phát hành Xcode 4, LLVM 2.0 sẽ là phiên bản đi kèm với Xcode theo mặc định và sau đó tất cả chúng ta có thể chuyển sang chế độ an toàn.

Nhờ mọi người đã trả lời, vui lòng sửa lỗi nếu tôi gặp sự cố.

+0

Nói rằng LLVM tạo ra có thể mã hơn chạy nhanh hơn GCC chỉ đơn giản là gây hiểu lầm mà không có đủ con trỏ để chuẩn mực mã chung. –

+0

Tôi vừa thêm phản hồi để thu thập các quan điểm khác nhau và chống lại các đối số từ các phản hồi khác - phần về LLVM tạo mã nhanh hơn xuất phát từ phản hồi của Itai Ferber ở trên. Wikipedia cũng có một số thông tin: http://en.wikipedia.org/wiki/LLVM –

+1

LLVM có thể biên dịch mã nhanh, nhưng mã chạy không được đảm bảo để chạy nhanh hơn. Tôi biết một thực tế rằng GCC có thể chạy trên 190 trình biên dịch (bao gồm cả các tối ưu hóa trên đầu và cuối) để tạo ra một tệp thực thi, đó là một lý do khiến GCC mất quá nhiều thời gian để biên dịch mã. –

9

Tôi có một ứng dụng dường như gặp sự cố khi khởi chạy trên iPhone gốc chạy iOS 3.1.3 khi được biên dịch với LLVM 2.0 nhưng chạy tốt với LLVM-GCC. Tôi hỗ trợ trở lại iOS 3.1 do đó, điều này gây tử vong. Bạn không chắc chắn nếu có một sự tương tác giữa LLVM 2.0 và một số mã cụ thể tôi có, nhưng có vẻ tốt nhất để tránh LLVM nếu bạn cần hỗ trợ iOS 3.x trừ khi bạn có thể kiểm tra kỹ trên các thiết bị cũ.


Cập nhật: Có vẻ như rằng vấn đề là với các thiết bị phần cứng chứ không phải là phiên bản iOS. Các thiết bị iOS thế hệ thứ nhất và thứ hai dường như bị ảnh hưởng: iPhone gốc, iPhone 3G và iPod Touch 1 và 2. Tôi tin điều này có nghĩa là nó bị giới hạn trong kiến ​​trúc ARMv6.

Ngoài ra, chạy bản dựng gỡ lỗi thông qua trình gỡ lỗi của Xcode hoạt động tốt, trong khi bản phát hành bản phát hành được cài đặt qua iTunes thì không. Vì vậy, nó có thể là một sự tương tác giữa kiến ​​trúc CPU và mức tối ưu hóa với LLVM 2.0.

Nhưng trong mọi trường hợp, hãy tránh ngay bây giờ;)

+0

Chúng tôi đã có lỗi lạ như thế này, trên iPhone thế hệ thứ nhất (3.1.2) và iPod Touch thế hệ thứ hai (4.2.1). Phải quay trở lại LLVM-GCC trên Xcode 4.0.1 – nobre

+1

Vâng - tương quan với các báo cáo sự cố khác, có vẻ như nó bị giới hạn ở các thiết bị có CPU thế hệ thứ nhất: iPhone gốc, iPhone 3G và iPod Touch 1 và 2 . Nếu tôi không nhầm, tôi nghĩ rằng đây có thể là một vấn đề với ARMv6 và ARMv7.Một mẩu tin thú vị khác: chạy một bản dựng gỡ lỗi thông qua trình gỡ lỗi Xcode hoạt động tốt trong mọi trường hợp, nó chỉ là vấn đề khi một bản phát hành được cài đặt thông qua iTunes; điều này dường như cho thấy nó có cái gì đó để làm với tối ưu hóa mã. –

+1

Sự cố xảy ra không chỉ trong bản phát hành bản phát hành, nó cũng xảy ra khi gỡ lỗi với tối ưu hóa được BẬT. Việc thêm GCC_THUMB_SUPPORT vào cài đặt bản dựng của bạn và đặt nó thành NO sẽ giúp khắc phục sự cố này – iKiR

Các vấn đề liên quan