iOS关于编译那些事儿

news/2024/8/30 22:25:56 标签: xcode, 前端, c/c++

当我们点击XCode的run的时候,他做了如下流程图的内容:

首先iOS使用的编译器而非解释器,好处的执行效率高,编译后生成机器码直接在CPU上运行. iOS使用的编译器是LLVM,他是一个工具链技术的集合,内置lld链接器.

LLVM中的Clang是编译器前端:它主要是进行预处理、词法分析、语法分析、语义分析、静态分析、生成中间代码。

LLVM的编译器后端:它将中间代码优化生成汇编代码,然后汇编器再将其生成机器代码,最近生成可执行文件.o即Mach-O文件。

链接器:链接器的作用主要有两个,一个是做符号绑定;另一个就是将多个Mach-O文件合并成一个. 符号可以看作是函数名和全局变量名,通关链接器与内存地址进行绑定.

总结一下编译过程就是:1.LLVM处理预处理命令,如嵌入宏;2.LLVM进行词法、语法、语义等的分析;3.生成AST;4.生成IR;5生成机器码即可执行文件Mach-O,链接器将多个Mach-O文件合并成一个.

另外说一下动态链接器dyld,他可以动态加载动态库,比如系统库都是运行是动态加载的.动态库的符号绑定可以在程序启动执行的时候绑定也可以符号第一次被用到的时候绑定.


http://www.niftyadmin.cn/n/1114652.html

相关文章

PDO(百度知道)

PDO一是PHP数据对象(PHP Data Object)的缩写。二是丙二醇简称PDO。三是阿曼石油开发公司 (petroleum development of Oman.)的缩写。四是过程数据对象(Process data object)的缩写。五是太平洋十年涛动。目…

QuickSort 快速排序

快速排序是一种优雅的算法,作者C.A.R.Hoare曾说,当它最初开发出Quicksort时,他认为这种算法太简单了,不值得发表,而且直到能够分析这种算法的预期运算时间之后,他才写出经典的“Quicksort”论文。 在最…

JDBC学习笔记(10)——调用函数存储过程

如何使用JDBC调用存储在数据库中的函数或存储过程: * 1.通过COnnection对象的prepareCall()方法创建一个CallableStatement * 对象的实例,在使用Connection对象的prepareCall() 方法时,需要传入一个String类型的字符串, * 该字符串用于…

(五)浅谈OpenStack T版服务组件--Neutron计算服务(#^.^#) 持续更新中

文章目录前言一、OpenStack网络1、linux网络虚拟化2、liunx虚拟网桥(br)linux虚拟局域网4、开放虚拟交换机OvS二、openstack网络基础服务1、网络组件2、网络结构3、网络子网与端口4、openstack中的网络模型(neutron)三、OpenStack-Neutron网络服务1、Neutron网络基础架构2、Neu…

Linux命令之grep/sed/awk等行转列

行转列 样例文件如下 cat file.txt a b c d e f g h icat file.txt |xargs -n1xargs -n 1 < file.txttr " " "\n" < file.txt4、sed s/ /\n/g file.txt 此命令在Linux上执行正常&#xff0c;在Mac上执行无效&#xff0c;原因是因为Mac上的sed是BS…

日记 晴 2017.7.30

ab 默认有个强制类型转换&#xff01;和aab是不一样的 public class Demo2 {public static void main(String[] args) { int a1; float b1.1f; System.out.println("ba:"(ba)); System.out.println("ab:"(ab));}} 转载于:https://www.cnblogs.com/yunfeiol…

CSS 天坑 I - 字体单位

首先&#xff0c;本文所讨论的“坑”是在做回应式网页设计( Responsive Web Design 以下简称 RWD&#xff09;时显现的&#xff0c;如果你还只是在做传统的Web设计这算不上是一个坑&#xff0c;因为传统的Web页面是死的&#xff0c;不会自动调节不能适应各类设备屏幕尺寸自然不…

TCL笔试题 将A,B,B,C,D,E,第三个字符不可以是E的所有组合输出;

思路&#xff1a;利用排列思想&#xff0c;进行递归&#xff1b;#include "iostream"using namespace std;char b[10];void pick_one(char a[],int num[],int n){if(n6){b[n]\0;cout<<b<<endl;return;}for(int i0;i<5;i){if(n2&&a[i]E)contin…