【问题标题】:LLVM vs. GCC for iOS development [closed]用于 iOS 开发的 LLVM 与 GCC [关闭]
【发布时间】:2011-06-03 03:00:16
【问题描述】:

在最新的 iOS SDK 中,Apple 提供了三种编译器选项:GCC、LLVM with Clang 和 LLVM-GCC。我或多或少地了解这 3 个是什么意思,LLVM 和 Clang 是什么,等等。我不知道这对 iPhone 开发人员在实践中意味着什么。截至 2011 年 1 月,此时我应该使用哪一个? LLVM 是否足够成熟,以至于我可以安全地使用它而不会经常遇到错误?切换到 LLVM 还有其他缺点吗?如果是这样,那么速度优势是否超过了它们?除了速度之外,还有什么其他原因需要切换吗?

【问题讨论】:

  • 好问题+1。

标签: iphone objective-c compiler-construction llvm clang


【解决方案1】:

更新:因为人们仍在寻找这个答案,我觉得我应该提供一个合适的更新。到目前为止,我希望 Clang 绝对是编程时要走的路,Clang 是新版本 Xcode 中的默认编译器,并支持 ARC 和新的和即将推出的语言结构(数组和字典下标、文字等) .几乎完全没有理由再使用 GCC 进行编译,对于使用 ARC 和新功能的代码库,使用普通 GCC 不再相关或不可能(LLVM-GCC 可能支持这些功能,但由于 Clang 完全是稳定)。


到目前为止(LLVM-2.0 包含在 Xcode 4.0 测试版中),LLVM 已经足够成熟,可以用于生产代码。它的编译速度比 GCC 快一点,生成的代码也更快,所以尽可能使用它(几乎,如果有更好的东西,尽量避免使用 GCC)。标准的 Xcode 3.2.5 安装包含 LLVM-1.6(不是最新版本),因此我建议您运行一些速度测试以查看 GCC 和 LLVM 之间是否存在明显差异,或者从源代码编译 Clang 并获取最新版本。

本质上,GCC 已经不需要了,LLVM + Clang 绰绰有余。

【讨论】:

  • 所以如果我运行的是 Xcode 3 并且我不想从源代码编译,LLVM + GCC 是最好的选择吗?
  • 不,只要坚持使用 LLVM-1.6 就可以了。同样,即使与 LLVM 结合使用,也完全没有理由使用 GCC。
  • 我还不会去那里,我已经看到并听说过 LLVM 生成代码中的重大问题(我们有一个应用商店提交崩溃,只有通过移动 GCC 编译器才能解决,在苹果的推荐下)。可能还会再发布一个版本,它会准备好迎接黄金时段......
  • 肯德尔,很高兴听到事情的另一面。我还没有听说过这样的事件,但当然,这可能是一个边缘案例(否则,Apple 不会如此努力地推动 LLVM)。无论如何,只要 Xcode 4 发布(无论何时发布),我们都会更新最新版本的 LLVM,一切都会好起来的......
  • Apple 的 production 版本的 Xcode 默认仍然使用 GCC 是有原因的,这可能是 Apple 认为 clang 还没有为生产应用程序做好准备。好吧,我说“可能”,实际上这是我的猜测。可能只是 C++ 支持不是 100%。
【解决方案2】:

好的,我认为下面的答案都不能说明整个故事,所以这是我对我的问题的回答:

  • LLVM 编译代码的速度比 GCC 快,可能创建的代码运行速度更快,而且 Clang 前端提供的错误消息比 GCC 更准确——因此肯定有切换的原因;

  • 也就是说,最新稳定的 Xcode (LLVM 1.6) 提供的版本还不是 100% 稳定,如果你不走运,可能会遇到一些小错误。所以如果你想要安全,你应该要么从源代码编译最新的 LLVM (2.0),要么在接下来的几个月里坚持使用 GCC;

  • 再过几个月,大概苹果发布 Xcode 4 的时候,LLVM 2.0 就会是 Xcode 默认自带的版本,到时候大家应该都可以安全切换到它了。

    李>

感谢所有回复的人,如果我有错误,请随时纠正我。

【讨论】:

  • 说 LLVM 生成的代码可能比运行速度比 GCC 快,如果没有足够的通用代码基准测试指针,这简直是一种误导。
  • 我刚刚添加了一个响应来收集来自其他响应的不同观点和支持/反对论点 - 关于 LLVM 生成更快代码的部分来自上面 Itai Ferber 的响应。维基百科也有一些信息:en.wikipedia.org/wiki/LLVM
  • LLVM 可以快速编译代码,但不能保证运行的代码运行得更快。我知道 GCC 可以运行超过 190 次编译器通道(包括前端和后端的优化通道)来生成可执行文件,这也是 GCC 花费如此多时间编译代码的原因之一。
  • 事实上,指向实际基准的指针比我们的 cmets 提供更好的数据:openbenchmarking.org/result/1204215-SU-LLVMCLANG23
【解决方案3】:

我有一个应用程序在使用 LLVM 2.0 编译时在运行 iOS 3.1.3 的原始 iPhone 上启动时似乎崩溃,但使用 LLVM-GCC 运行得很好。我支持回到 iOS 3.1,所以这是致命的。不确定 LLVM 2.0 和我拥有的某些特定代码之间是否存在交互,但如果您需要支持 iOS 3.x 似乎最好避免使用 LLVM,除非您可以在旧设备上进行彻底测试。


更新:似乎问题出在设备硬件而不是 iOS 版本上。第 1 代和第 2 代 iOS 设备似乎受到影响:原始 iPhone、iPhone 3G 以及第 1 和第 2 代 iPod Touch。我相信这意味着它仅限于 ARMv6 架构。

此外,通过 Xcode 的调试器运行调试版本可以正常工作,而通过 iTunes 安装的发布版本则不行。所以这可能是 CPU 架构和 LLVM 2.0 优化级别之间的交互。

但无论如何,暂时避免;)

【讨论】:

  • 我们在第一代 iPhone (3.1.2) 和第二代 iPod Touch (4.2.1) 上也遇到了与此类似的奇怪错误。不得不在 Xcode 4.0.1 上回到 LLVM-GCC
  • 是的 - 关联其他崩溃报告,看起来它仅限于具有第一代 CPU 的设备:原始 iPhone、iPhone 3G 以及第一代和第二代 iPod Touch。如果我没记错的话,我认为这可能是 ARMv6 与 ARMv7 的问题。另一个有趣的花絮:通过 Xcode 的调试器运行调试版本在所有情况下都可以正常工作,只有通过 iTunes 安装发布版本时才会出现问题;这似乎表明它与代码优化有关。
  • 该问题不仅出现在发布版本中,还出现在打开优化的调试中。将 GCC_THUMB_SUPPORT 添加到您的构建设置并将其设置为 NO 将有助于解决此问题
【解决方案4】:

切换到 Clang 的另一个主要原因是更准确(列和行号范围)和可读的错误消息。

【讨论】:

    【解决方案5】:

    在最新的 WWDC10 期间,他们特别鼓励开发人员使用更新的 LLVM 编译器。我忘记了他们详细介绍的确切内容——“Xcode 中的新内容”之一。基本上他们建议尽可能使用 LLVM-2.0,否则使用 LLVM-GCC 并完全避免单独使用 GCC。

    如果您是注册的 iOS 开发者,您可以在以下网址免费查看大部分课程 http://developer.apple.com/videos/wwdc/2010/

    【讨论】:

    • 然而后来发现,一些人(包括我自己)从仅 LLVM 的编译中发现了一些非常奇怪的错误。不经常,但对于所有应用商店提交,切换回 GCC 就足够了。不过,我仍然使用 LLVM 进行调试构建。我认为今年年初 LLVM 可能足够稳定,可以用于提交。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多