iOS 编译过程

iOS 编译采用 Clang 作为编译器前端,LLVM 作为编译器后端,编译器前端负责语法分析,语义分析,生成生成中间码 (LLVM IR),在这个过程中,会进行类型检查,如果发现错误或者警告会标注出来在哪一行;编译器后端会进行机器无关的代码优化,生成机器语言,并且进行机器相关的代码优化。

当一个 xcode 工程 build 之后一般会执行如下几个步骤:

Clang 的编译过程

预处理

预处理器会处理源文件中的宏定义,将代码中的宏用其对应定义的具体内容进行替换,删除注释,展开头文件,产生 .i 文件。

词法分析

预处理完成了以后,开始词法分析,这里会把代码切成一个个 Token,比如大小括号,等于号还有字符串等。

语法分析

语法分析,在 Clang 中由 ParserSema 两个模块配合完成,验证语法是否正确,根据当前语言的语法,生成语意节点,并将所有节点组合成抽象语法树 AST

静态分析

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

类型检查

一般会把类型检查分为两类:动态的和静态的。动态的在运行时做检查,静态的在编译时做检查。以往,编写代码时可以向任意对象发送任何消息,在运行时,才会检查对象是否能够响应这些消息。由于只是在运行时做此类检查,所以叫做动态类型。

至于静态类型,是在编译时做检查。当在代码中使用 ARC 时,编译器在编译期间,会做许多的类型检查:因为编译器需要知道哪个对象该如何使用。

LLVM 的编译过程

目标代码的生成与优化

CodeGen 负责将语法树 AST 丛顶至下遍历,翻译成 LLVM IR 中间码,LLVM IR 中间码编译过程的前端的输出后端的输入。

编译器后端主要包括代码生成器、代码优化器。代码生成器将中间代码转换为目标代码,代码优化器主要是进行一些优化,比如删除多余指令,选择合适寻址方式等,如果开启了 bitcode 苹果会做进一步的优化,有新的后端架构还是可以用这份优化过的 bitcode 去生成。优化中间代码生成输出汇编代码,把之前的 .i 文件转换为汇编语言,产生 .s 文件

汇编

目标代码需要经过汇编器处理,把汇编语言文件转换为机器码文件,产生 .o 文件。

链接

链接又分为静态链接和动态链接。 对 .o 文件中的对于其他的库的引用的地方进行引用,生成最后的可执行文件(同时也包括多个 .o 文件进行 link)。

静态链接

静态链接:在编译链接期间发挥作用,把目标文件和静态库一起链接形成可执行文件。

动态链接

动态链接:链接过程推迟到运行时再进行。

如果多个程序都用到了一个库,那么每个程序都要将其链接到可执行文件中,非常冗余,动态链接的话,多个程序可以共享同一段代码,不需要在磁盘上存多份拷贝,但是动态链接发生在启动或运行时,增加了启动时间,造成一些性能的影响。 静态库不方便升级,必须重新编译,动态库的升级更加方便。

参考

点击 Run 之后发生了什么?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • iOS RunTime之三:消息发送

    由上面一章中,我们了解了什么是RunTime的数据结构,下面了解一下Runtime的消息发送。

    s_在路上
  • 浅谈 NSTimer 是否精确?

    NSTimer 的启动依赖 RunLoop,如果在主线程中做了耗时的操作,当前 RunLoop 持续的时间超过了定时器的间隔时间,那么下一次定时就被延后了。

    s_在路上
  • HTTPS 之对称加密与非对称加密

    加密 encryption 与解密 decryption 使用的是同样的密钥 secret key,对称加密是最快速、最简单的一种加密方式。加密和解密算法是公开...

    s_在路上
  • 如何做用户运营体系的推导思考

    | 导语   本文将以互联网保险为例,从设计运营模型、绘制核心路径、需求分析与拆解、梳理运营边界4个环节阐述推导的思考过程。 体系,是一定范围内同类的事物按照...

    腾讯大讲堂
  • 【行业】用于AI开发的最佳5个开源框架

    AiTechYun 编辑:nanan AI和机器学习是目前流行的两个术语,有时甚至可以互换使用。然而,两项都不一样。虽然AI所涉及的机器可以执行具有人类智能特征...

    AiTechYun
  • 智能音箱的中国战争

    2016年,在全球互联网行业享有盛誉的“互联网女皇”,KPCB合伙人玛丽·米克尔有过一个预判:“语音拐点已经到来,在2015年智能手机销量下滑之后,Echo销量...

    罗超频道
  • 用Keras通过Python进行卷积神经网络的手写数字识别

    图像识别是深度学习技术的一个普遍具有的功能。

    青橙.
  • 关于CRM one order函数的一些代码审查和改进建议

    这个函数的signature是别人写好的,大家研究过consumer怎么消费这个FM的? 如果et_product_detail有多个entry,则es_pr...

    Jerry Wang
  • kubernetes关键概念总结

    每个service对应一个cluster IP,cluster IP对应的服务网段最初是在配置kube-apiserver、kube-controller-ma...

    charlieroro
  • thrift 一个有意思的特性:Class名称无关性

    最近开发的一个项目,后端采用thrift框架来提供rpc服务(java语言实现),然后前端采用php语言来生成thrift client调用后台RPC服务。由于...

    菩提树下的杨过

扫码关注云+社区

领取腾讯云代金券