【iOS内存管理-编译链接的过程】

news2024/11/18 18:39:11

文章目录

  • 前言
  • 计算机语言
    • 文件后缀名
  • 编译和链接的过程
    • 编译链接
    • 预处理(预编译)-> 产生.i文件
    • 编译 -> 产生.s文件
    • 汇编 -> 产生.o文件
    • 链接
  • 总结

前言

就我而言,iOS开发的过程中接触到的编译链接方面的知识很少,这部分知识还是很重要的。

对于iOS的编译链接过程来说并不难,和微机原理的汇编过程还是挺像的。今天对于编译链接的过程学习和了解一下。
参考:iOS程序员的自我修养-编译、链接过程
参考:iOS编译过程

计算机语言

计算机语言有机器语言,汇编语言和高级语言。对于OC这种高级语言来说分为 编译语言和解释型语言。
在这里插入图片描述

  • 编译型语言(一次性翻译)
    • 特点:一次性翻译。
    • 编译型语言的程序只要等编译器编译之后,每次运行都可以直接运行,OC和swift就是如此。
    • 优点就是执行速度够快,因为不用多次编译。
    • 缺点就是可移植性差,编译的时候需要对操作系统的库做出链接,可能需要不同的库。
  • 解释型语言(逐步翻译)
    • 解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态解释和执行,如php,javascript
      即解释一条代码,执行一条
    • 优点就是可移植性好,不需要繁杂的系统库。
    • 缺点显而易见就是执行速度慢,不是一次性的。

文件后缀名

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

  • .i 文件:.i 文件是预处理器处理源代码之后生成的文件,其中包含了宏展开、条件编译等预处理操作后的代码。

  • .s 文件:.s 文件是汇编器生成的汇编代码文件。它将预处理器生成的 .i 文件翻译成机器指令的文本表示形式,每个汇编指令对应一条机器指令。

  • .o 文件:.o 文件是编译器生成的目标文件,也被称为对象文件。它包含了汇编器生成的机器指令以及一些符号表、重定位信息和其他调试信息。

  • .m 文件:.m 文件是 Objective-C 源代码文件的常见扩展名。它包含了 Objective-C 的代码,可以与 C 和 C++ 代码混合使用。

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

编译和链接的过程

上面说过OC/swift都是编译语言,在执行的时候通过编译器生成机器码,机器码可以直接在CPU上执行,效率更快。

OC的编译是基于Clang/ LLVM来编译的,简单了解LLVM是一个模块化的可重用的编译器和工具技术的集合,Clang是LLVM的子程序,C,C++,OC都是Clang的子程序。其目的就是更快的效率编译出更好的程序。

编译链接过程:预处理 -> 词法分析 -> 语法分析 -> 静态分析 -> 生成中间代码和优化 -> 汇编 -> 链接 =
预处理 -> 编译 -> 汇编 -> 链接
请添加图片描述

编译链接

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

2,编译:把预处理完的一系列文件进行一系列词法、语法、语义分析,并且优化后生成相应的汇编代码,产生.s文件

3,汇编:汇编器将汇编代码生成机器指令,输出目标文件,产生.o文件(根据汇编指令和机器指令的对照表一一翻译就可以了);

4,链接:在一个文件中可能会到其他文件,因此,还需要将编译生成的目标文件和系统提供的文件组合到一起,这个过程就是链接。经过链接,最后生成可执行文件

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

预处理(预编译)-> 产生.i文件

clang -E main.m -o main.i

处理源代码文件中的以"#"开头的预编译指令

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

总结编译器在预处理阶段处理结果:

  • 宏替换 (在源码中使用的宏定义会被替换为对应的内容)
  • 头文件引入(#include,#import)使用对应文件.h的内容替换这一行的内容,所以尽量减少头文件中的#import,使用@class替代,把#import放到.m文件中。)
  • 处理条件编译指令(#if,#else,#endif)

编译 -> 产生.s文件

clang -S main.i -o main.s

编译过程也分为 词法分析 -> 语法分析 -> 静态分析 最后优化生成相应的汇编代码,得到.s文件

  • 词法分析 :这一步把源文件中的代码转化为特殊的标记流,源码被分割成一个一个的字符和单词,在行尾Loc中都标记出了源码所在的对应源文件和具体行数,方便在报错时定位问题。
    请添加图片描述
  • 语法分析:这一步是把词法分析生成的标记流,解析成一个抽象语法树(abstract syntax tree – AST),同样地,在这里面每一节点也都标记了其在源码中的位置。此时运算符号的优先级确定了;有些符号具有多重含义也确定了,比如“*”是乘号还是对指针取内容;表达式不合法、括号不匹配等,都会报错。
    请添加图片描述
  • 静态分析 :分析类型声明和匹配问题,如出现方法被调用但是未定义、定义但是未使用的变量等,以此提高代码质量。
    • 类型分析:在此阶段clang会做检查,最常见的是检查程序是否发送正确的消息给正确的对象,是否在正确的值上调用了正常函数。如果你给一个单纯的 NSObject* 对象发送了一个 hello 消息,那么 clang 就会报错,同样,给属性设置一个与其自身类型不相符的对象,编译器会给出一个可能使用不正确的警告。
    • 其他分析:关于是否多次初始化的检查。
  • 中间代码生成和优化: LLVM 会对代码进行编译优化,例如针对全局变量优化、循环优化、尾递归优化等,最后输出汇编代码。
  • 目标代码生成和优化: 根据中间语言生成依赖具体机器的汇编语言。并优化汇编语言。

汇编 -> 产生.o文件

clang -c main.s -o main.o

在这一阶段,汇编器将上一步生成的可读的汇编代码转化为机器代码。最终产物就是 以 .o 结尾的目标文件。使用Xcode构建的程序会在DerivedData目录中找到这个文件。

链接

clang main.o -o main

这一阶段是将上个阶段生成的目标文件和引用的静态库链接起来,最终生成可执行文件,链接器解决了目标文件和库之间的链接。

使用clang main.m生成可执行文件a.out(不指定名字默认为a.out),使用file a.out可以看到其类型信息:

a.out: Mach-O 64-bit executable x86_64

可以看出可执行文件类型为 Mach-O 类型,在 MAC OS 和 iOS 平台的可执行文件都是这种类型。

Mach-O(Apple官方文档)

请添加图片描述

总结

编译链接是一iOS文件从开始到变成可执行的文件的过程,我们不去研究原理,但是对于整个流程的掌握还是很有必要的。

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

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

相关文章

【JavaSE】- 包装类和String常用方法

包装类和常用方法 1.1 包装类1.2 自动装箱和自动拆箱1.3 包装类型转String类型2.1 String2.2 String常用方法3.1 StringBuffer4.1 StringBuilder 1.1 包装类 1.2 自动装箱和自动拆箱 // 手动装箱int n1 100;Integer integer new Integer(n1);// 手动拆箱Integer integer02 I…

electron globalShortcut 快捷键与系统全局快捷键冲突

用 electron 开发自己的接口测试工具(Post Tools),在设置了 globalShortcut 快捷键后,发现应用中的快捷键与系统全局快捷键冲突了,导致系统快捷键不可正常使用。 快捷键配置 export function initGlobalShortcut(main…

20款奔驰E300升级柏林之声音响系统,体验不一样的感觉

享有盛名的 Burmester 音响系统可带来独特音质,打造震撼的听觉体验。高性能扬声器可营造殿堂级的立体声音响效果。您可以分别为前排和后排乘客优化这一设置,进一步提升听觉体验。

如何快速搭建自己同城跑腿系统?尚无忧跑腿小程序源码

是一款集代买、代送、代取等服务为一体的本地同城跑腿配送系统,支持二次开发,功能定制。 跑腿系统可众包模式,提供全套解决方案,包括跑腿系统配送端、用户端以及强大的后台管理系统。 使用uniappthinkphp技术 适配支持公众号APP…

【问卷分析】调节效应检验的操作②

文章目录 2.2 当调节变量是分类变量时(1) 确定组别区分(2)检验调节效应值(3)结果解读 接上一篇文章: 【问卷分析】调节效应检验的操作① 2.2 当调节变量是分类变量时 我们将以该模型中的调节变…

ASO优化之在海外如何进行竞品分析

进行竞争对手研究,需要分析当前的市场形势,确定竞争对手表现的模式,并将其应用到我们应用营销策略中。不同的应用可以在直观的用户界面上进行简单的比较,很容易看到长期趋势。 在App Store和Google Play上获取竞争对手评论区的信…

promise规范及应用

##promise解析 *啥是异步? //异步执行let count 1let timer setTimeout(function () {countconsole.log(in, count);}, 1000);console.log(out);// out>1000>in//循环执行let count 1let timer setInterval(function () {countconsole.log(in, count);}, 1000);con…

YOLO学习笔记1. YOLOV1的基本概念

YOLO学习笔记1. YOLOV1的基本概念 一、 YOLO简介二、一些基本概念1. two-stage和one-stage2. 指标分析(1)精度的概念(2)召回率的概念(3)IOU(4)置信度阈值(5) …

成功解决VScode每次只能打开一个文件,即只能打开一个编辑窗口。

成功解决VScode每次只能打开一个文件,即只能打开一个编辑窗口。 解决方案 解决方案 点击文件 --> 首选项 --> 设置 --> 工作台 --> 编辑管理 --> 取消勾选Enable Preview 如下图所示: 下拉,取消勾选Enable Preview

[JVM] 1. 初步认识JVM

核心思想: “Write Once, Run anywhere”. 各种语言通过编译器转换成字节码文件,在JVM上运行。 一、Java虚拟机 Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成…

Netty核心技术十一--用Netty 自己 实现 dubbo RPC

1. RPC基本介绍 RPC(Remote Procedure Call):远程 过程调用,是一个计算机 通信协议。该协议允许运 行于一台计算机的程序调 用另一台计算机的子程序, 而程序员无需额外地为这 个交互作用编程 两个或多个应用程序都分 布在不同的服…

AJAX与axios框架

文章目录 前言案例跨域访问总结❗ 前言 提示:这里可以添加本文要记录的大概内容: 通过 ajax 进行前后端交互 案例 此项目用到了javaweb知识 首先创建JavaWeb项目编写代码: package ajax;import java.io.IOException; import java.util.A…

个人引导页源码带三个按钮可添加

个人引导页源码带三个按钮可添加 简洁优雅引导页

SpingBoot配置文件

普通参数配置 之前用阿里云oss,如果在每一个都程序都写这个 1.代码一旦修改要一个一个改 2.代码复用性低 所以可以配置到springBoot的配置文件来进行对应的读取,这样复用性就高了 赋值Value(和最下面注解功能相同) 在applicat…

淘宝app商品详情原数据API接口【详情页优惠券数据】Python语言示例请求范例,多种语言均支持

首先以Python语言请求示例为介绍 请求示例 # coding:utf-8 """ Compatible for python2.x and python3.x requirement: pip install requests """ from __future__ import print_function import requests # 请求示例 url 默认请求参数已经做U…

密码学学习笔记(十一):哈希函数 - Merkle–Damgård结构

Merkle–Damgrd是一种算法,由Ralph Merkle和Ivan Damgrd提出。它通过迭代调用压缩函数来计算消息的哈希值。 应用 拿SHA-2举例,首先我们需要对需要进行哈希运算的输入做填充,然后将填充后的输入划分为等长的分组,每个分组的长度…

中级课程——SSRF

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言挖掘 前言 挖掘

【网站开发】jq (jquery)实现瀑布流布局

要实现网站瀑布流效果&#xff0c;可以使用HTML、CSS和jquery来完成。下面是一种常见的实现方式&#xff1a; 注意要引入jQuery库。 代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title>…

git下载源码及环境搭建之数据库(二)

学习目标&#xff1a; 数据库 新项目使用 数据库文件 的配置 及相关属性的设置 步骤&#xff1a; 数据库 下图所示为开发时所用数据库 第一步&#xff1a;新建一个数据库 注意&#xff1a; 字符集与排序规则我们应该选择utf-8 相关 选中新创建的表&#xff0c;点击备份—还…

【雕爷学编程】Arduino动手做(06)---KY-038声音传感器模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…