iOS底层探索(一) - 从零开始认识Clang与LLVMhtml
编译器是属于底层知识,在平常开发中少有涉及,但在个人印象中,越接近底层是越须要编程基本功,也是越复杂的。但要想提高技术却始终绕不开要对底层原理的探究,不少资料都是直接抛出一堆函数概念和一顿操做,基础通常的小伙伴看了表示一脸懵逼。在此结合我本身的理解进行优化总结一下。毕竟知识水平有限,有问题或总结不妥的地方欢迎指出,多多学习,很是感谢!2018.2前端
预处理顾名思义是预先处理,那预处理都作了哪些事情呢?内容以下。编程
(1) import 头文件替换后端
面向对象编程的思惟下,咱们写代码会常常用到其余类的属性\方法等,咱们只须要导入头文件就能够用了,如:bash
#import <Foundation/Foundation.h>
// 这里将会在预处理时会把 Foundation.h 文件的内容拷贝过来并替换
复制代码
基于这个原理,这里引出了一个小问题,若是 ClassA.h
文件引用了 ClassB.h
,而且 ClassB.h
也引用了 ClassA.h
,这里是否是就会互相循环引入了?数据结构
@class ClassA;
复制代码
#import "ClassA.h"
复制代码
ClassA
是一个类,这样你就可使用ClassA
作类名了,若是须要使用 ClassA
的方法属性等能够在 .m 实现文件中再经过 import MyClass.h
的方式使用,这种方法不但能够解决互相引入的问题还能够优化编译速度。(2) macro 宏展开函数
无参宏: 如:学习
#define DATA_TYPE_NUM @"number"
复制代码
在此宏定义做用域内,输入了 DATA_TYPE_NUM,在预处理过程当中 DATA_TYPE_NUM 都会被替换成 @"number"。优化
带参宏: 带参数的宏 如:ui
#define CYXColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
复制代码
(3) 处理其余的预编译指令(其实预编译过程也是出了预编译指令的过程)
条件编译语句也是在预处理阶段完成,而且条件编译只容许编译源程序中知足条件的程序段,使生成的目标程序较短,从而减小了内存的开销并提升了程序的效率,如如下代码就只会保留一个return语句:
#if DEBUG
return YES;
#else
return NO;
#endif
复制代码
(4) 总结:
预处理指令 | 用法解析 |
---|---|
#undef | 取消已定义的宏 |
#if | 若是给定条件为真,则编译如下代码 |
#ifdef | 若是宏已经定义,则编译如下代码 |
#ifndef | 若是宏没有定义,则编译如下代码 |
#elif | 若是前面的#if给定条件不为真,当前条件为真,则编译如下代码 |
#endif | 结束一个#if……#else条件编译块 |
*PS:还须要了解更多关于预编译的内容,还请自行百度*
[图片上传失败...(image-cf6f6f-1531632712782)][图片上传失败...(image-fd9112-1531632712782)]
`$clang -E main.m`
复制代码
Objective-C语言包含了关键字if、else、new等,那么在词法分析步骤时,遇到i与f或n与e与w组合在一块儿的时候,须要将这几个字母组合为关键字if或new这个词法单元。
什么是token流呢?能够这么理解:就是有"类型",有"值"的一些小单元。
好比一个运算表达式:
(28 + 78) * 2
这里面只须要解析出(
是一个开括号,28
是数字整形,+
是一个运算符号便可。
编译指令: $clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m
编译指令:$clang -fmodules -fsyntax-only -Xclang -ast-dump main.m
语法分析的最终产物是输出抽象语法树
语法分析,在Clang中由Parser和Sema两个模块配合完成
交验语法是否正确
根据当前语言的语法,生成语意节点,并将全部节点组合成抽象语法树(AST)
这一步跟源码等价,能够反写出源码
Static Analysis 静态分析
这是上篇,为保证博客质量与阅读体验(我的感受一次阅读过多文字有点影响阅读体验),先分享已完成的上半部分,下篇将继续介绍Clang编译过程当中的剩下环节,欢迎持续关注,感谢理解与支持!2018.2
下面是一些关键词,有兴趣的朋友先自行谷歌学习吧,下篇等我有闲情的时候再更新了,我也不知道何时。2018.7.15
https://zh.wikipedia.org/wiki/C%E9%A2%84%E5%A4%84%E7%90%86%E5%99%A8 https://llvm.org/docs/tutorial/LangImpl2.html https://www.objc.io/issues/6-build-tools/compiler/