LLVM初探

作者: 狗蛋的春天 | 来源:发表于2020-09-21 21:54 被阅读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);
      }
    

    相关文章

      网友评论

        本文标题:LLVM初探

        本文链接:https://www.haomeiwen.com/subject/tibbyktx.html