iOS笔记

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);
  }
上一篇下一篇

猜你喜欢

热点阅读