iOS编译器

Objective-C 和 Swift都是编译语言模块化

编译语言在执行的时候,必须先经过编译器生成机器码函数

CPU执行机器码工具

LLVM 编译编译语言优化

LLVM 是一个模块化和可重用的编译器和工具链技术的集合code

LLVM 核心库提供一个优化器,对流行的 CPU 作代码生成支持orm

Clang 是 LLVM 的子项目,是 C,C++ 和 Objective-C 编译器对象

clang static analyzer 主要是进行语法分析,语义分析和生成中间代码,对代码进行检查,出错的和须要警告的会标注出来。资源

lld 是 Clang / LLVM 的内置连接器,clang 必须调用连接器(lld)来产生可执行文件开发

 

1,编译源文件的时候,编译器首先作的是一些预处理工做。好比预处理器会处理源文件中的宏定义,将代码中的宏用其对应定义的具体内容进行替换。编译器

2,.m 源文件里都有一堆的声明和定义,这些代码文本都会从string 转化成特殊的标记流,每个标记流都包含了对应的 源码内容 和在源码中的位置.

注意这里的位置是宏展开以前的位置,这样一来,若是编译过程当中遇到什么问

题,clang 可以在源码中指出出错的具体位置

3,标记流将会被解析成一棵抽象语法树 (abstract syntax tree -- AST),在抽象语法树中的每一个节点都标注了其对应源码中的位置,一样的,若是产生了什么问题,clang 能够定位到问题所在处的源码位置.

4,一旦编译器把源码生成了抽象语法树,编译器能够对这棵树作分析处理,以找出代码中的错误,好比类型检查:即检查程序中是否有类型错误。例如:若是代码中给某个对象发送了一个消息,编译器会检查这个对象是否实现了这个消息(函数、方法)。此外,clang 对整个程序还作了其它更高级的一些分析,以确保程序没有错误。

细化:

类型检查(动态的和静态的)

每当开发人员编写代码的时候,clang 都会帮忙检查错误。其中最多见的就是检查程序是否发送正确的消息给正确的对象,是否在正确的值上调用了正确的函数。若是你给一个单纯的 NSObject* 对象发送了一个 hello 消息,那么 clang 就会报错。一样,若是你建立了 NSObject 的一个子类 Test,而后试图给这个子类中某个属性设置一个与其自身类型不相符的对象,编译器会给出

一个可能使用不正确的警告

动态的在运行时作检查,静态的在编译时作检查。以往,编写代码时能够向任意对象发送任何消息,在运行时,才会检查对象是否可以响应这些消息。因为只是在运行时作此类检查,因此叫作动态类型。

静态类型,是在编译时作检查。当在代码中使用 ARC 时,编译器在编译期间,会作许多的类型检查:由于编译器须要知道哪一个对象该如何使用。例如,若是 myObject没有 hello 方法,那么就不能写以下这行代码

clang 在静态分析阶段,除了类型检查外,还会作许多其它一些分析。若是你把 clang的代码仓库 clone 到本地,而后进入目录 lib/StaticAnalyzer/Checkers,你会看到全部静态检查内容。好比 ObjCUnusedIVarsChecker.cpp 是用来检查是否有定义了,可是从未使用过的变量。而 ObjCSelfInitChecker.cpp 则是检查在 你的初始化方法中中调用

self 以前,是否已经调用 [self initWith...] 或 [super init] 了。编译器还进行了一些其它的检查,例如在 lib/Sema/SemaExprObjC.cpp 的 2,534 行,有这样一句:Diag(SelLoc, diag::warn_arc_perform_selector_leaks);这个会生成严重错误的警告 “performSelector may cause a leak because its selector

is unknown” 。

5,clang 完成代码的标记,解析和分析后,接着就会生成 LLVM 代码。

6,LVVM优化器会进行BitCode的生成,连接期优化等等。

 

 

 

 

 手机执行IPA包的简单过程

一个手机,拿到IPA包里面的OC代码以后,编译器Clang进行编译连接成机器语言后,在手机显示屏中显示,

Xcode执行源代码的简单过程

Xcode软件里面有个编译器(clang)把项目里面的代码资源编译成机器语言后,利用mac电脑的CPU来执行机器语言,而后在经过模拟器显示.

相关文章
相关标签/搜索