一. ios编译过程
1、LLVM概述
下面通过三种代码来研究:
print("hello");
//hello.py
#include<stdio.h>
int main(int argc,char *argv[]){
printf("hello world");
return 0;
}
//hello.c
#import <stdio.h>
#define A 10
int main(int argc, const char * argv[]) {
printf("%d",A + 20);
return 0;
}
//main.m
复制代码
C和C++(hello.c和main.m)需要通过clang
命令生成a.out文件才能执行
.
那么为什么clang
命令可以编译我们的C和C++代码,成为二进制机器能读的懂的文件呢?
cd
open /usr/bin
查看 clang的位置
复制代码
LLVM概述
LLVM架构编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),堆开发者保持开发,并兼容已有脚本。LLVM计划启动于2000年,最初由美国UIUC大学的Chris Lattner博士主持开展。2006年Chris Latther加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。Apple也是LLVM计划的主要资助者。
目前LLVM已经被苹果IOS开发工具、Xilinx Vivado、Facebook、Google等各大公司采用。
1.编译器前端(Frontend)
:它解析源代码,进行词法分析,语法分析,语义分析,检查源码是否错误,然后构建抽象语法树
(Abstract Syntax Tree,AST),LLVM的前端还会生成中间代码
(intermediate representation,IR).
2.优化器(Optimizer)
:优化器负责进行各种优化。改善代码的运行时间,列如消除冗余计算等。
3.后端(Backend)/代码生成器(CodeGenerator)
:将代码映射到目标指令集。生成机器语言,并且进行机器相关的代码优化。
iOS的编译器框架
Objective C/C/C++使用编译器前端Clang,Swift是Swift,后端都是LLVM。
LLVM设计
当编译器决定支持多种源语言或多种硬件架构时,LLV