【iOS】编译与链接过程

前言

计算机语言分为:机器语言、汇编语言和高级语言。
高级语言又能分为:编辑语言、解释语言。

解释语言

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

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

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

典型语言:php,javascript

编译语言

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

优点:执行速度快

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

典型语言:objective-c,C++

文件后缀名

在iOS编译和链接的过程中,不同的文件后缀名代表不同的文件类型和中间过程。

`.i `文件:`.i `文件是预处理器处理源代码之后生成的文件,其中包含了宏展开、条件编译等预处理操作后的代码。`.s` 文件:`.s` 文件是汇编器生成的汇编代码文件。它将预处理器生成的 .i 文件翻译成机器指令的文本表示形式,每个汇编指令对应一条机器指令。`.o` 文件:`.o` 文件是编译器生成的目标文件,也被称为对象文件。它包含了汇编器生成的机器指令以及一些符号表、重定位信息和其他调试信息。`.m` 文件:`.m` 文件是 Objective-C 源代码文件的常见扩展名。它包含了 Objective-C 的代码,可以与 C 和 C++ 代码混合使用。

这些文件在编译和链接过程中的不同阶段产生,并在整个过程中相互转换和传递,最终生成可执行文件或库文件。

编译和链接过程

OC是编译型语言,使用Low Level Virtual Machine 的编译器开发工具套件(LLVM)生成机器码,机器码可以直接在CPU上执行,效率更快。

LLVM 是一个项目,其作用就是提供一个广泛的工具,可以将任何高级语言的代码编译为任何架构的 CPU 都可以运行的机器代码。它将整个编译过程分类了三个模块:前端、公用优化器、后端。clang 是 LLVM 的一个前端,它的作用是针对 C 语言家族的语言进行编译,像 c、c++、Objective-C。而 Swift 则自己实现了一个前端来进行 Swift 编译,优化器和后端依然是使用 LLVM 来完成。

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

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

详解

iOS整个编译链接过程如图
在这里插入图片描述

预处理

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

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

编译

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

  1. 词法分析:词法分析的任务是从源代码中读取输入字符,按照构词规则构词规则切分成一系列的单词(token),提交给语法分析使用。词法分析器的分析结果,即输出为token序列,其中token包含两部分内容,即token=类型枚举+属性值,token也被称为“词素”,指的是单个有意义的元素。
  2. 语法分析:语法分析以词法分析程序输出的Token流为输入,分析源程序的语法结构,判断它是否为相应程序设计语言的合法程序,最后生成符合特定文法的语法分析树。
  3. 静态分析:使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致, 同时它也收集类型信息,并把这些信息存放在语法树或符号表中,供随后的中间代码生成使用。
  4. 代码生成: LLVM 会对代码进行编译优化,例如针对全局变量优化、循环优化、尾递归优化等,最后输出汇编代码。然后根据中间语言生成依赖具体机器的汇编语言,并优化汇编语言。

汇编

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

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

链接

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高薪Offer收割机之redis集群

单节点的redis并发能力是有限的,如果需要进一步提高redis的并发能力,就需要搭建集群。 Redis中的集群分为三种: 主从复制,哨兵模式,分片集群 先来看一下主从复制: 在主从集群中一个主节点可以有多个从节…

智安网络|移动安全的转型:零信任如何重新定义格局

数字化转型和远程/移动办公的常态化已经成为许多企业的现实。这一转变为企业带来了许多便利,但同时也引入了前所未有的风险,涉及员工的隐私、个人身份和特权访问凭证。尤其是在经济衰退和疫情的持续影响下,许多企业不得不在提高生产力的同时面…

Linux: USB Gadget 驱动简介

文章目录 1. 前言2. 背景3. USB Gadget 驱动3.1 什么是 USB Gadget 驱动?3.2 USB Gadget 驱动框架3.3 USB 设备控制器(UDC) 驱动3.3.1 USB 设备控制器(UDC) 驱动 概述3.3.2 USB 设备控制器(UDC) 驱动示例 3.4 USB Gadget Function 驱动3.5 USB Gadget 驱动3.5.1 USB…

Vector - CANoe - VCDL与SomeIP

目录 一、基础介绍 二、vCDL介绍 1、vCDL工程创建 2、 vCDL编辑器关键字介绍 3、创建命名空间Datatype 接口示例 4、创建命名空间ICalculate 5、创建命名空间Participants 一、基础介绍 SomeIP作为车载以太网一个重要的组成部分,因为它的测试也是我们作为总…

Socket--七层协议与Socket原生框架

Socket 一、网络七层协议 / OSI 七层模型 2.1 物理层 解决两个硬件之间怎么通信的问题,常见的物理媒介有光纤、电缆、中继器等。它主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。 它的主要作用是传输比特流(就是由1、0转化为电流强…

C#中的HashTable和Dictionary之间的区别

面试基础:C#中的HashTable和Dictionary之间的区别 HashTable和Dictionary都是用于存储数据的数据结构的类型。这两个数据结构都将存储的数据保存为键值对。

视频融合平台EasyCVR级联后上级平台播放失败的问题排查与优化

EasyCVR视频融合平台基于云边端智能协同架构,具有强大的数据接入、处理及分发能力,平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制等视频能力与服务,可支持多协议、多类型的海量设备接入与分发。 …

TPS61021A 具有 0.5V 超低输入电压的3A升压转换器

1 特性 1 • 输入电压范围:0.5V至4.4V • 启动时的最小输入电压为0.9V • 可设置的输出电压范围:1.8V到4.0V • 效率高达91%(VIN2.4V、VOUT3.3V 且IOUT 1.5A 时) • 2.0MHz 开关频率 • IOUT > 1.5A,VOUT 3.…

JavaWeb(3)——HTML、CSS、JS 快速入门

一、JavaScript 运算符 • 赋值运算符( ) 赋值运算符执行过程? 将等号右边的值赋予给左边, 要求左边必须是一个容器 出现是为了简化代码, 比如让 let age 18 ,age 加 2 怎么写呢 let age 18age 2console.log(age)age * 2con…

Android Studio Flutter 开发配置

近来比较闲,就研究下Flutter 开发,在此记录下studio 配置过程,时间是2023.7.19 在 Windows 操作系统上安装和配置 Flutter 开发环境 1.首先下载 Flutter SDKhttps://storage.flutter-io.cn/flutter_infra_release/releases/stable/windows/…

STM32MP157驱动开发——设备树知识

文章目录 概述开发板中设备树文件目录结构设备树文件语法设备树文件参考实例:Devicetree 格式DTS 文件的格式node 的格式properties 的格式 dts 文件包含 dtsi 文件常用的属性#address-cells 、#size-cellscompatiblemodelstatusreginterruptgpio属性name( 过时了&a…

二、DDL-1.数据库操作

一、查询 1、查询所有数据库 show databases; MySQL自带的默认的数据库有四个: 二、创建 1、创建一个新的数据库itcast(不区分大小写): create database itcast; 查询所有数据库:多了itcast 2、再创建同名的数据库…