Wiki
Clang /ˈklæŋ/ is a compiler front end for the programming languages C, C++, Objective-C, Objective-C++, OpenMP, OpenCL, and CUDA. It uses LLVM as its back end and has been part of the LLVM release cycle since LLVM 2.6.
It is designed to be able to replace the full GNU Compiler Collection (GCC). Its contributors include Apple, Microsoft, Google, ARM, Sony, Intel and Advanced Micro Devices (AMD). It is open-source software, with source code released under the University of Illinois/NCSA License, a permissive free software licence.
LLVM
LLVM 是 Low Level Virtual Machine
(底层虚拟机)的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。可以作为多种语言编译器的后台来使用。
clang -rewrite-objc
clang -rewrite-objc
的作用是把 oc 代码转写成 c/c++ 代码,推测 OC 底层的实现原理。
使用方法
|
比如,在 OC 中,方法调用又称为消息发送,但消息发送是怎么实现的呢?
|
在终端输入
|
在生成的 ViewController.cpp
文件中,可以找到 ViewDidLoad 方法改写后的实现:
|
也就是说 [p foo]
在动态编译的时候,会被转意为: objc_msgSend(p, sel_registerName("foo"));
。
指定SDK
OC 代码转写成 C/C++ 代码时,在模拟器和真机上,有时候是有区别的。如果需要指定 SDK ,那么要结合xcrun
命令。
真机:
|
模拟器:
可通过 xcodebuild -showsdks
来查看机器上的 SDK
|
指定 framework
如果使用了iOS frameworks,(如UIKit) 或者 第三方 SDK (如听云),执行clang -rewrite-objc
的时候会提示错误:
这是因为没有引入 framework,clang 不知道去哪里找,需要用 -F 选项指定 要引入的 framework。
|
如果指定了 sdk,则不需要指定 iOS 内部 frameworks
```
之前在读 Apple 开源的 runtime 源码的时候,经常使用这个命令,就起了个简短的别名,方便使用:
- 在~/.bashrc 或者 ~/.zshrc(for zsh 用户)中添加一行
alias deoc="xcrun -sdk iphonesimulator9.3 clang -rewrite-objc"。(请先使用
xcodebuild -showsdks` 查看自己电脑上的 sdk 做相应修改) - 保存,退出;打开一个新窗口,或者在当前窗口运行
source ~/.bashrc(for bash users)
或者source ~/.zshrc (for zsh users)
- 现在开始,使用
deoc
来代替xcrun -sdk iphonesimulator9.3 clang -rewrite-objc
,后面接 OC 源文件 (和 -F framework,如果需要引入第三方 sdk)。
关于clang
的更多使用方法,请参考:
- objc 中国-编译器
- man clang
Refrences: