LLVM初探
2020-09-21 本文已影响0人
狗蛋的春天
LLVM是编译器相关
1、广义:前端+后端
2、狭义:后端
前端
1、c/c++/oc开发的源码经过clang编译生成LLVM中间代码IR
2、clang编译相比gcc更高效,速度更快,兼容更好
3、我们写的源代码经过编译前段clang进行词法分析语法分析等一些基本操作生成中间代码
后端
1、经过clang编译生成中间代码IR后,LLVM会接着经过一些优化,逐步生成最终的机器码(根据不同的架构x86,arm等)
2、一般所说的LLVM就是编译后端,经过一些优化后生成的相对应的平台二进制。
------------分割线-----------
《实际查看编译过程》
1、cd 到main.m所在项目的的目录中执行下面命令
clang -ccc-print-phases main.m
2、得到如下加载编译顺序,最终得到对应平台的可执行的代码
0: input, "main.m", objective-c //找到程序入口.m文件
1: preprocessor, {0}, objective-c-cpp-output //预处理器preprocessor 把我们写的代码中的宏定义、匿名分类(扩展)等进行对应转换。
2: compiler, {1}, ir //编译器编译compiler 成中间代码IR
3: backend, {2}, assembler //编译器后端 汇编
4: assembler, {3}, object //生成目标代码
5: linker, {4}, image //链接动态库
6: bind-arch, "x86_64", {5}, image //生成对应结构的代码
《查看预处理preprocessor的结果》
1、cd到main.m所在目录执行 clang -E main.m得到
int main(int argc, char * argv[]) {
NSString * appDelegateClassName;
int a = 10;
int b = 20;
int c = a + b + 100;
@autoreleasepool {
appDelegateClassName = NSStringFromClass([AppDelegate class]);
}
return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}
文中对应的main.m
/*
定义宏,进行预处理preprocessor查看结果(把Maco=100替换到了文中)
*/
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#define Maco 100
int main(int argc, char * argv[]) {
NSString * appDelegateClassName;
int a = 10;
int b = 20;
int c = a + b + Maco;
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
appDelegateClassName = NSStringFromClass([AppDelegate class]);
}
return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}