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 条评论
登录 后参与评论

相关文章

  • 编译过程

    hankleo
  • javac 编译过程

    b) 词法分析:根据标记序列构造抽象语法树(AST:用来描述程序代码语法结构的树形表示方式,每一个节点代表程序中的一个语法结构。

    WindWant
  • [记录点滴] luaxml编译过程

    记录一次luaxml编译的解决过程 参考 http://blog.csdn.net/dc_show/article/details/38957991

    罗西的思考
  • 编译ios WebRTC

    之前我还以为WebRTC有很多实现,结果最终大家用的都是chromium里的代码。

    王沛文
  • C++ gcc编译过程

    第一步:预处理 将源代码的.c 、.cpp 、.h 等文件包含到一个文件中。在这个过程中会使用一些预处理指令要求编译器使用什么样的方式包含这些文件。预处理结束之...

    老九学堂-小师弟
  • C/C++编译全过程

    词法分析程序按照从左到右的顺序wyuq 扫描源代码,生成单词对应的符号,把字符描述的程序转换为符号描述的中间程序。

    聚名12255
  • GCC编译过程记 原

          对于编程工作者来说,GCC是一个熟悉的名字,它的全称是“GNU Compiler Collection”。GCC是一组编译器集合,目前其支持C、C+...

    珲少
  • C语言编译过程

    预编译结果解释 # linenum filename flags 分别对应行号、文件、标识。 flag对应的含义

    用户2929716
  • jsp编译、执行过程

    https://blog.csdn.net/napoay/article/details/50755064

    大学里的混子
  • JavaScript的预编译过程

    在全局环境中会生成一个 GO对象 (Global Object),还是按照上面的四步执行。

    FinGet
  • Android 项目编译过程

    Android 工程构建的持续集成,需要搭建一套编译和打包自动化流程,比如建立每日构建系统、自动生成发布文件等等。这些都需要我们对Android工程的编译和打包...

    阳光岛主
  • C语言编译过程

    连接---->将目标代码与C函数库相连接,并将源程序所用的库代码与目标代码合并,并形成最终可执行的二进制机器代码(程序)。

    老九学堂-小师弟
  • iOS视图编程指南(View Programming Guide for iOS)(译)

    Jacklin
  • Ubuntu20.04linux内核(5.4.0版本)编译准备与实现过程-编译过程(2)

    Ubuntu20.04linux内核(5.4.0版本)编译准备与实现过程-编译前准备(1)

    玖柒的小窝
  • 用gcc编译c语言程序以及其编译过程

    对于初学c语言编程的我们来说,学会如何使用gcc编译器工具,对理解c语言的执行过程,加深对c语言的理解很重要!!!

    黑泽君
  • C++编译与链接(1)-编译与链接过程

    大家知道计算机使用的一系列的1和0 那个一个C++语言程序又是如何从一个个.h和.cpp文件变成包含1和0的可执行文件呢? 可以认为有以下的几个环节 源程序->...

    magicsoar
  • 编译器的工作过程

    源码要运行,必须先转成二进制的机器码。这是编译器的任务。 比如,下面这段源码(假定文件名叫做test.c)。 #include <stdio.h> int m...

    ruanyf
  • ubuntu pogoplug openwrt 编译全过程

    qinyang
  • php-7.3.6 编译安装过程

    wget http://cn2.php.net/distributions/php-7.3.3.tar.gz

    砸漏

扫码关注云+社区

领取腾讯云代金券