【iOS】编译与链接

news2025/1/10 16:07:43

前言

计算机语言分为机器语言、汇编语言和高级语言。

可以将高级语言分为两种:编译语言和解释型语言(直译式语言)。

解释型语言(逐步进行解释执行)

解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态解释和执行,即解释一条代码,执行一条代码

优点:可移植好,因为只需要各种系统有解释器便可运行,不需要乱七八糟的系统库支持

缺点:执行速度慢,因为相比直接执行,多了一个翻译过程。

典型语言:php,javascript

编译型语言(一次性翻译)

编译型语言的程序只要经过编译器编译之后,每次运行程序都可以直接运行,不需要再次“翻译”。

优点:执行速度快

缺点:可移植性差,因为编译需要对操作系统的库做出链接,所以程序运行时需要用到特定的系统库

典型语言:objective-c,swift

编译链接过程

  1. 预处理:处理macro 宏(如#define), import 头文件替换及处理其他的预编译指令,产生.i文件。(都是以#号开头)
  2. 编译:把预处理完的一系列文件进行一系列词法、语法、语义分析,并且优化后生成相应的汇编代码,产生.s文件。
  3. 汇编:汇编器将汇编代码生成机器指令,输出目标文件,产生.o文件。(根据汇编指令和机器指令的对照表一一翻译就可以了)
  4. 链接:在一个文件中可能会到其他文件,因此,还需要将编译生成的目标文件和系统提供的文件组合到一起,这个过程就是链接。经过链接,最后生成可执行文件。

经过编译和链接,才会把写的代码转换成计算机能识别的二进制指令。

iOS编译是啥?

编译其实是一个用代码解释代码的过程。在 Objective-C 和 Swift 的编译过程中,用来解释代码的,使用的是Low Level Virtual Machine 的编译器开发工具套件(LLVM)。简单的说,LLVM 是一个项目,其作用就是提供一个广泛的工具,可以将任何高级语言的代码编译为任何架构的 CPU 都可以运行的机器代码。它将整个编译过程分类了三个模块:前端、公用优化器、后端。

  • 前端:对目标语言代码进行语法分析,语义分析,生成中间代码。在这个过程中,会进行类型检查,如果发现错误或者警告会标注出来在哪一行。我们在开发的过程中,其实 Xcode 也会使用前端工具对你的代码进行分析,并实时的检查出来某些错误。前端是针对特定语言的,如果需要一个新的语言被编译,只需要再写一个针对新语言的前端模块即可。
  • 公用优化器:将生成的中间文件进行优化,去除冗余代码,进行结构优化。
  • 后端:后段将优化后的中间代码再次转换,变成汇编语言,并再次进行优化,最后将各个文件代码转换为机器代码并链接。链接是指将不同代码文件编译后的不同机器代码文件合并成一个可执行文件。

clang 是 LLVM 的一个前端,它的作用是针对 C 语言家族的语言进行编译,像 c、c++、Objective-C。而 Swift 则自己实现了一个前端来进行 Swift 编译,优化器和后端依然是使用 LLVM 来完成。

Xcode 在编译 iOS 项目的时候,使用的正是 LLVM。其实我们在编写代码以及调试的时候,也在使用 LLVM 提供的功能,例如代码高亮(clang)、实时代码检查(clang)、代码提示(clang)、debug 断点调试(LLDB),这些都是 LLVM 前端提供的功能。而对于后端来说,我们接触到的就是关于 arm64、armv7、armv7s 这些 CPU 架构了。

我们的项目是一个 target,一个编译目标,它拥有自己的文件和编译规则,在我们的项目中可以存在多个子项目,这在编译的时候就导致了使用了 Cocoapods 或者拥有多个 target 的项目会先编译依赖库。

iOS编译干了啥?

  1. 写入辅助文件:将项目的文件结构对应表、将要执行的脚本、项目依赖库的文件结构对应表写成文件,方便后面使用;并且创建一个 .app 包,后面编译后的文件都会被放入包中。
  2. 运行预设脚本:Cocoapods 会预设一些脚本,当然你也可以自己预设一些脚本来运行。这些脚本都在 Build Phases 中可以看到。
  3. 编译文件:针对每一个文件进行编译,生成可执行文件 Mach-O,这过程涉及 LLVM 的完整流程,包括前端、优化器、后端。
  4. 链接文件:将项目中的多个可执行文件合并成一个文件。
  5. 拷贝资源文件:将项目中的资源文件拷贝到目标包。
  6. 编译 storyboard 文件:storyboard 文件也是会被编译的。
  7. 链接 storyboard 文件:将编译后的 storyboard 文件链接成一个文件。
  8. 编译 Asset 文件:我们的图片如果使用 Assets.xcassets 来管理图片,那么这些图片将会被编译成机器码,除了 icon 和 launchImage。
  9. 运行 Cocoapods 脚本:将在编译项目之前已经编译好的依赖库和相关资源拷贝到包中。
  10. 对包进行签名
  11. 完成打包

在上述流程中:2 - 9 步骤的数量和顺序并不固定,这个过程可以在Build Phases中指定。Phases:阶段、步骤,这个选项Tab在Xcode中的意思就是编译步骤。其实在Xcode中我们不仅可以设定整个编译步骤和顺序,还可以对编译规则(Build Rules)和具体步骤的参数(Build Settings)进行设定。

iOS整个编译链接过程

在这里插入图片描述

预处理(Prepressing)

处理macro 宏, import 头文件替换及处理其他的预编译指令,产生.i文件(都是以#号开头!)。规则如下:

  1. "#define"删除并展开对应宏定义。
  2. 处理所有的条件预编译指令。如#if/#ifdef/#else/#endif。
  3. "#include/#import"包含的文件递归插入到此处。
  4. 删除所有的注释"//或/**/"。
  5. 添加行号和文件名标识,编译调试会用到。

编译(Compilation)

这个过程就是把上面的main.i文件进行:词法分析、语法分析、静态分析,优化生成相应的汇编代码,最终生成main.s文件。

  1. 词法分析:把源代码的字符序列分割成一个个token(关键字、表示符、字面量、特殊符号),比如把标识符放到符号表里面。
  2. 语法分析:生成抽象语法树AST,此时运算符号的优先级确定了;有些符号具有多重含义也确定了,比如:*是乘号还是对指针取内容;表达式不合法、括号不匹配等等,都会报错。
  3. 静态分析:分析类型声明和匹配问题。比如整型和字符串相加,肯定会报错。
    中间语法生成:CodeGen根据AST自上向下逐步翻译成LLVM IR,并且对在编译期就可以确定的表达式进行优化,比如代码里面的a=1+3,可以优化成a=4。(假如开启了bitcode)
  4. 目标代码生成与优化:根据中间语法生成依赖具体机器的汇编语言;并优化汇编语言。这个过程中,假如有变量且定义在同一个编译单元里,那么就给这个变量分配空间,确定变量的地址。假如变量或者函数不定义在这个编译单元里面,那就等到链接的时候才能确定地址。

汇编(Assembly)

将main.s文件编译成main.o文件。(也就是我们常说的目标文件)

这个过程就是把上面得到的main.s文件里面的汇编指令翻译成机器指令,最终生成等到main.o

链接(Linking)

这个过程就是将main.o编译成对应的Mach-O文件,也就是我们常说的可执行文件。链接的本质就是把一个或多个目标文件和需要的库(静态库/动态库,如果需要的话)组合成一个文件(Mach-O可执行文件)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/752045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Leetcode】142.环形链表II

题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则…

多媒体开发之cgo

go语言作为近十年来优秀的现代开发语言的代表,由于继承了c语言的简洁和很多现代语言的表达方式,在广泛的应用场景中得到众多爱好者的喜爱,如何将go和c、c进行联合开发,拓展整个开发生态,不用重复造轮子,掌握…

k8s 持久化存储

我们继续来查看 k8s 的卷,上一次我们分享了将磁盘挂载到容器中,empyDir 和 gitRepo 都是会随着 pod 的启动而创建,随着 pod 的删除而销毁 那么我们或许会有这样的需求,期望在 pod 上面读取节点的文件或者使用节点的文件系统来访问…

Win10 配置ADB安装2023.7.12版本

目录 1. ADB工具介绍2. ADB安装流程 参考 Win10 配置安装ADB教程总结20200514, fastboot刷机 1. ADB工具介绍 ADB ( Android Debug Bridge),即Android 调试桥。是 Google 为开发人员提供的一种命令行工具,用于与安卓设备进行通信&#xff0…

开源网安加入东莞市大数据协会,共建安全可靠软件产业生态

​近日,开源网安成为东莞市大数据协会会员单位,与协会共同构建安全可靠软件产业生态,在科技创新、共建安全生态等方面发力,推动软件产业引领经济高质量发展,推动大湾区企业加快数字化建设进程。 东莞市大数据协会致力于…

Oracle使用PL/SQL导出表,结果显示insert语句

导出表到sql文件中有两种方法,下面我们列举两种方法的操作 1、选择工具->导出->选中要导出的表->点击sql插入->自定义导出路径以及文件,点击导出即可。当然也可以在where子句中增加条件,以便筛选导出 2、首选查询表数据&#xff…

阿里云无影云电脑使用方法_3分钟上手教程

阿里云无影云电脑即无影云电脑,云电脑如何使用?云电脑购买后没有用户名和密码,先创建用户设置密码,才可以登录连接到云电脑。云桌面想要访问公网还需要开通互联网访问功能。阿里云百科来详细说下阿里云无影云电脑从购买、创建用户…

Low-Light Image Enhancement via Stage-Transformer-Guided Network 论文阅读笔记

这是TCSVT 2023年的一篇暗图增强的论文 文章的核心思想是,暗图有多种降质因素,单一stage的model难以实现多降质因素的去除,因此需要一个multi-stage的model,文章中设置了4个stage。同时提出了用预设query向量来代表不同的降质因素…

Kubernetes 组件介绍

Kubernetes 组件 部署完 Kubernetes,便拥有了一个完整的集群 一组工作机器,称为节点, 会运行容器化应用程序。每个集群至少有一个工作节点 工作节点会托管 Pod ,而 Pod 就是作为应用负载的组件。 控制平面管理集群中的工作节点…

【JAVA8】Stream\Comparator

Stream Reduction, 给N个数值,求出其总和/最大值/最小值/均值这一类的操作,称为Reduction Option Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。 Optional 类的引入很好的解…

<网络>UPD协议详解

UDP协议详解 网络传输的实质UDP协议端格式UDP的特点面向数据报UDP的缓冲区UDP使用注意事项基于UDP的应用层协议 网络传输的实质 在网络中,我们通过调用系统函数send/recv/write/read使用套接字来进行主机之间的网络通信,那么是不是我们在调用这几个函数…

vue3使用provideinject实现祖孙组件通讯

vue3使用provide&inject实现祖孙组件通讯 之前在使用vue2时,写过一篇博客记录父子组件的数据通讯 简单来说,父传子通过自定义属性,子传父通过自定义事件,兄弟间通过事件总线。也有更直观的vuex实现任意组件之间的数据通讯&a…

掘金量化—Python SDK文档—2.策略程序架构

目录 Python SDK文档 2.策略程序架构 2.1掘金策略程序初始化 2.2行情事件处理函数 2.3交易事件处理函数 2.4其他事件处理函数 2.5策略入口 Python SDK文档 2.策略程序架构 2.1掘金策略程序初始化 通过init 函数初始化策略,策略启动即会自动执行。在 init 函数中可以&#x…

数据结构与算法——什么是线性表(线性存储结构)

我们知道,具有“一对一”逻辑关系的数据,最佳的存储方式是使用线性表。那么,什么是线性表呢? 线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来&#xf…

【Unity面试篇】Unity 面试题总结甄选 |Unity基础篇 | ❤️持续更新❤️

2.2 前言 关于Unity面试题相关的所有知识点:🐱‍🏍2023年Unity面试题大全,共十万字面试题总结【收藏一篇足够面试,持续更新】为了方便大家可以重点复习某个模块,所以将各方面的知识点进行了拆分并更新整理…

swin-transformer

面向视觉任务的transfomer Vision Transformer(ViT)在视觉任务中的局限性 需求数据量巨大 CNN中是图像整体输入,并且经过多年的演变,发展出了多个不同的优化策略。从而在学习时能够在一定先验知识的前提下拟合数据。 而transformer是将图像切割成若干较小…

精彩回放 | AI驱动下的流程挖掘如何提升企业决策和运营效率?

流程挖掘是一种从事件日志中发现、监控和优化实际业务流程的技术。在AI的驱动下,流程挖掘能进行更深层次的自动化和智能化处理,从而帮助企业更准确地了解和优化业务流程,提高决策的精确度和运营的效率。然而,AI驱动的流程挖掘在实…

FPGA——pwm呼吸灯

文章目录 一、实验环境二、实验任务三、实验过程3.1 verilog代码3.2 引脚配置 四、仿真4.1 仿真代码4.2 仿真结果 五、实验结果六、总结 一、实验环境 quartus 18.1 modelsim vscode Cyclone IV开发板 二、实验任务 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化…

便捷查物流教程

当下寄递物品早已成为常态,而如何快速进行物流信息查询,成为收寄人所关心的问题。在回答这个问题之前,首先我们要知道,物流信息查询,有哪些方法? 1、官网单号查询 知道快递公司和单号的情况下,…

目标检测——目标检测概述

目录 目标检测常用的开源数据集PASCAL VOC数据集MS COCO数据集 常用的评价指标IOU(交并比)mAP(Mean Average Precision) NMS(非极大值抑制)目标检测方法分类 目标检测 常用的开源数据集 PASCAL VOC数据集 …