在可可基礎的紀錄片中,它提到了不同的編譯器。 gcc,LLVM-GCC和Clang。有沒有人明確知道他們在做什麼以及何時使用它們?不同的編譯器之間有什麼區別
回答
他們都做同樣的事情,產生可以鏈接在一起構建程序(或共享庫)的可執行目標代碼。他們只是以不同的方式做到這一點。
- gcc是一個悠久的老編譯器,它在牙齒上變得有點長,但仍然是幾乎整個開源世界的主要力量。它也是現存最便攜的編譯器。
- LLVM-GCC是LLVM項目的一個組件,它使用gcc解析器前端和LLVM代碼生成後端。
- Clang是使用LLVM後端的特定於LLVM的前端。它本質上是一個潔淨室編譯器,它承諾編譯速度比gcc更快,編譯效率更高,全部來自更小和更乾淨的代碼庫(謝謝@dreamlax)。
關於此問題的更多信息,請登錄LLVM網站。
- gcc:GNU Compiler Collection。非常便攜的編譯器,適用於多種不同語言根據GPL授權。
- LLVM-gcc:使用GCC的前端解析程序代碼,但使用LLVM生成機器碼。
- Clang:使用LLVM生成機器碼的類似C語言(C,C++,Objective-C)的新前端。
Apple建議您始終使用Clang。 Clang的主要優點是速度更快,能夠產生更好的診斷信息(警告和錯誤)。此外,來自clang的生成代碼通常比來自GCC的代碼更快。
Xcode 3附帶的Clang版本尚不支持C++(或Objective-C++),因此Xcode將使用LLVM-GCC for C++。
這是Clang和GCC的更多detailed comparison。
Apple建議您使用clang嗎?當前生產的Xcode(3.2.x)默認爲gcc。這表明該建議仍然適用於gcc生產。毫無疑問,這將改變在不久的將來 – JeremyP 2010-11-04 09:18:19
蘋果確實建議你使用鏗鏘聲,如果可以的話。默認情況下仍然是GCC,因爲有相當數量的代碼不能在叮噹中使用(而且也可能永遠不會),並且Apple正在努力避免混淆開發人員。您可以預計,未來的某個時間點,默認設置會變爲叮噹聲。 – 2010-11-04 09:19:57
- 1. 編譯器和鏈接器之間有什麼區別?
- 2. 這些Scripts.Render語句之間的編譯器有什麼區別?
- 3. 未編譯和編譯的ASP.NET頁面之間有什麼區別
- 4. ConstraintSet中clone()的不同實現之間有什麼區別?
- 5. 可用的不同HttpClient之間有什麼區別?
- 6. 調試和編譯有什麼區別?
- 7. 「C#編輯器」和「編碼C#編輯器」之間有什麼區別?
- 8. 「編譯時間」和「運行時間」有什麼區別?
- 9. SBT編譯與compileIncremental之間的區別
- 10. 不同Sygic地圖類型之間有什麼區別?
- 11. Matlab中不同高斯函數之間有什麼區別?
- 12. 需要重新編譯的分析器和那些不需要的分析器之間有什麼區別?
- 13. 「層」和「層」之間有什麼區別?
- 14. Tableau和QlikView之間有什麼區別
- 15. Microsoft.CompilerServices.AsyncTargetingPack和Microsoft.Bcl.Async之間有什麼區別?
- 16. @Entity和@embeddable之間有什麼區別
- 17. ContentObservable和DataSetObservable之間有什麼區別?
- 18. touchmove和gesturechange之間有什麼區別?
- 19. 這兩行之間有什麼區別?
- 20. :notification.flags和notification.defaults之間有什麼區別?
- 21. proc和lambda之間有什麼區別?
- 22. :: after和after之間有什麼區別?
- 23. read()和io.read()之間有什麼區別?
- 24. Request()和Request.Form()之間有什麼區別?
- 25. DesiredCapabilities與RequiredCapabilities之間有什麼區別?
- 26. WebServiceBinding.EmitConformanceClaims和WebServiceBinding.ConformanceClaims之間有什麼區別?
- 27. getA()和this.getA()之間有什麼區別?
- 28. (int)和intval()之間有什麼區別?
- 29. set_value和= pandas之間有什麼區別
- 30. * zoom和zoom之間有什麼區別?
Clang的源代碼更清潔。我曾經看過GCC源代碼,但仍未完全恢復;我仍然偶爾做惡夢。 – dreamlax 2010-11-04 09:01:02
LLVM-gcc使用gcc前端和LLVM後端,而不是其他方式。 – JeremyP 2010-11-04 09:15:39
@JeremyP:感謝您的糾正。 – 2010-11-04 09:25:05