Xcode编译过程的一些东西

编译过程:
1.预处理(Pre-process):把宏替换,删除注释,展开头文件,产生 .i 文件
2.编译(Compliling):把之前的 .i 文件转换成汇编语言,产生 .s文件
3.汇编(Asembly):把汇编语言文件转换为机器码文件,产生 .o 文件
4.链接(Link):对.o文件中的对于其他的库的引用的地方进行引用,生成最后的可执行文件(同时也包括多个 .o 文件进行 link)

冷启动3个阶段:

1、dyld(dynamic link editor),Apple的动态连接器,可以装载Mach-O(可执行文件、动态库等)
装载app的可执行文件,同时递归加载所有依赖的动态库
当dyld把可执行文件、动态库都装载完成后,会通知runtime进行下一步处理

2、runtime所做的事情

调用map_images函数中调用call_load_methods,调用所有Class和Category的+load方法
进行各种objc结构的初始化(注册objc类、初始化类对象等等)
调用C++静态初始化器和attribure((constructor))修饰的函数(JSONKit中存在具体应用)
到此为止,可执行文件和动态库中所有的符号(Class, Protocol, Selector, IMP...)都已按格式成功加载到内存中,被runtime所管理

总结
app的启动由dylb主导,将可执行文件加载到内存,顺便加载所有依赖的动态库
并由runtime负责加载成objc定义的结构
所有初始化工作结束后,dyld就会调用main函数
接下来就是ApplicationMain函数,AppDelegate的application:didFinishLaunchingWithOptions:方法

按照不同的阶段优化
dyld:
减少动态库、合并一些动态库(定期清理不必要的动态库)
减少objc类、分类的数量、减少selector数量(定期清理不必要的类、分类)
减少C++虚构函数
Swift尽量使用struct

runtime:
使用+initialize方法和dispatch_once取代所有的attribute((constructor))、C++静态构造器、Objc的+load方法

main:
在不影响用户体验的前提下,尽可能将一些操作延迟,不要全部都放在finishLaunching方法中
按需加载

编译器:把源代码文件转换为更为低级的语言,先通过编译器生成机器码(机器码可在CPU上运行、效率高)Xcode使用Clang编译器(C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器)把源代码转换为更为低级的LLVM IR,然后LLVM作为中间语言(机器码生成器、架构编译器、由C++编译而成)来进行下一步二进制文件的产出。

编译语言:C++、Objective-C、Swift,需要经过编译器编译才能在CPU上运行

直译式语言:JavaScript、Python,不需要编译过程,而是在执行的时候通过一个中间的解释器将代码解释为CPU可以执行的代码

如图:图片出处请点击我 文章

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值