ObjC/Swift WWDC 上讲到的 Objective C / LLVM 改进

luikore · 2013年06月13日 · 最后由 PrideChung 回复于 2013年06月14日 · 11584 次阅读
本帖已被管理员设置为精华贴

wwdc 的干货部分, 比卖广告部分有意义多了...

https://developer.apple.com/wwdc/videos/

Advances in Objective-C What's New in the LLVM Compiler

下面是一些凌乱的笔记...


objc 流行度已超过 c++

#import 会自动翻译成 @import, 对编译的提速效果相当于整很多 pch. (enable modules )

64 位机器上会像 ruby 一样用 tagged pointer 实现一些值对象 (如 NSDate), 减少动态内存分配.

属性方法返回类型声明为 instancetype , 然后 xcode 就能提示类型不匹配.

加强了 block 内循环引用的警告 (block 会产生一个隐藏的对 self 的引用...)


API attributes for implicit bridging :

  • CF_RETURNS_RETAINED
  • CF_RETURNS_NOT_RETAINED
  • CF_RELEASES_ARGUMENT

已经应用到大部分的 CF API 上, 现在基本不用手动加 __bridge 了.

下面两个 macro 可以帮助静态分析 __bridge

  • CF_IMPLICIT_BRADGING_ENABLED
  • CF_IMPLICIT_BRADGING_DISABLED

xcode 5 加强了 ARC migrator, 实现已经移除了 GC.

rvm 编译的 ruby 是 -O3 的, 其实打开 链接期优化 -O4 (例如内联一些标准库函数) 可以更快, 另外还有一个 -Ofast, 混合了除 -O4 外的一些编译参数, 可以尝试看看效果...

llvm 针对 armv7s (iphone5 处理器) 和 intel avx (浮点数据并行化) /avx2 (整数数据并行化) 指令集的性能改进 (编译参数 -mavx2). 另外打开 vetorize loops 参数可以把一些平白的循环数据并行化. 总的来说编译结果有 1x% - 50% 的性能提升, 就算目标程序不是 iOS7 或者 Mavericks 都真的要换 xcode 5 了.

命令行检测 avx2 : sysctl hw.optional.avx2_0 C 检测 avx2 : sysctlbyname("hw.optional.avx2_0", &answer, sizeof(answer), NULL, 0) 程序中可以通过检测来决定是载入 avx2 还是 avx1 还是 sse 的函数版本, 既保证速度也保证兼容. 我的 rMBP 只支持到 avx1_0 -__- 难道该出手了?

编译参数 enable strict aliasing 会进行深入的指针类型分析, 也能提升性能. 但是有些互不兼容类型之间的强制 cast, 例如把 uint64 转换成 struct {uint16,uint16} 就不能用了 (可以改成 union, ruby 源代码里都是用 union cast 的).


xcode 5 不用单独另外安装 command line tools 了. 打开命令行, 敲 clang, 就弹出安装窗口了 XD. Mavericks 自带了命令行工具管理: /Library/Developer/CommandLineTools

一些在新的 XCode 编译不过去的命令行工具, 找到硬编码的路径: /usr/include, /usr/lib, /System/Library/Frameworks 替换成新的位置就可以.

xcrun --show-sdk-path --sdk macosx
xcrun --sdk iphoneos clang -c MyApp.c

xcrun 会辨认 $SDKROOT, 可以设置这个环境变来切换各种版本的 sdk

llvm-gcc 终于删除了, 不过演讲者把 "gnu" 念错了... "g" 应该不发音的 是我念错了, GNU 真的是 [gənu:], 牛羚 Gnu 才是 [nju:], 另外 Gnome 发音也没有 [g] 的


c++11 成为默认选项. c++ 运行时从 gnu 的 libstdc++ 转换到了 llvm 的 libc++ .你甚至可以在安装包里打包 clang 编译器和 c++ 运行时而不用担忧版权问题.

-Wunsequenced 可以提示 x = x++; 的问题 -Winteger-overflow 可以提示部分溢出问题 -Wunused-function -Wbool-boolean -Wundeclared-selector ...

强大的静态分析, 略有 haskell 的感觉

xcode 5 会扫描 doxygen 注释用来增强自动完成和 quick help


其实去年那个语法扩展的 session 也很棒: wwdc 2012 session 405 - modern objective C

最近的 LLVM 会议还有大量的货: http://llvm.org/devmtg/2013-04/

请教如何成为@luikore 级大牛...

#1 楼 @jasl ... 这是残缺的 transcript ... 视频里其实由浅入深的讲的很详细清楚

以后只用 rvm 什么的是不是不用装 xcode 了?

#3 楼 @WolfLee 本来就可以只装 command line tools 不装 xcode, 以后就是装了 xcode 就不用装 command line tools 了, 或者不装 xcode 直接从命令行开始下载安装 command line tools ...

PS. 貌似 Xcode 5 不会再带 LLVM GCC 了.

Important: LLVM GCC is not included in Xcode 5

#5 楼 @ichord en, 那个编译器前端是基于古老的 gcc-4.2 的, 各种问题很多, 现在也几乎没人用了

其实我觉得今年的 Advances in Objective-C 很多地方就是照搬去年的 Modern Objective-C

需要 登陆 后方可回复, 如果你还没有账号请 注册新账号