zoukankan      html  css  js  c++  java
  • LLVM小记2

    LLVM低级虚拟机

    传统的编译器架构:

     

    Forntend前端:词法分析、语法分析、语义分析、生成中间代码

    Optimizer优化器:中间代码生成

    Backend后端:生成机器码

     

    LLVM

    架构:不同的前端后端使用统一的中间代码LLVM Intermediate Representation (LLVM IR)如果需要支持一种新的编程语言,那么只需要实现一个新的前端;如果需要支持一种新的硬件设备,只需要实现一个新的后端;优化阶段是一个通用的阶段,它针对的是统一的LLVM IR,不论是支持新的编程语言还是支持新的硬件设备,都不需要对优化阶段做修改。

    处理过程

    预处理->词法分析->Token -> 语法分析 -> AST -> 中间代码生成 -> LLVM IR -> 优化 -> 生成汇编代码 -> Link -> 目标文件

    1、编译前端(clang)处理:

    预处理:替进行头文件引入,宏替换,注释处理,条件编译(#ifdef)等操作

    词法分析(lexical anaysis):词法分析器读入源文件的字符流,将他们组织称有意义的词素(lexeme)序列,对于每个词素,此法分析器产生词法单元(token)作为输出。

    语法分析(semantic analysis):词法分析产生的词法单元Token流会被解析成一颗抽象语法树(abstract syntax tree AST);有了抽象语法树,Clang就可以对这个树进行分析,找出代码中的错误。比如类型不匹配,亦或Objective-C中向target发送了一个未实现的消息。

    CodeGen(中间代码生成):遍历语法树,生成LLVM IR(中间)代码。LLVM IR是编译前端的输出,编译后端的输入。

    2IR处理

    LLVM会对生成的IR进行优化,优化会调用相应的Pass进行处理;

    Pass由多个节点组成,都是 Pass 类的子类,每个节点负责做特定的优化;

    补充:Pass相关可以见Writing an LLVM Pass开发和调试第一个 LLVM Pass

    3、编译后端处理

    生成汇编代码:LLVMIR进行优化后,会针对不同CPU架构生成不同的目标代码,最后以汇编代码的格式输出;

    汇编:汇编器以汇编代码作为输入,将汇编代码转换为机器代码,最后输出目标文件(Object File)

    链接:链接动态库,o文件,生成一个Mach-O格式的可执行文件,

     

     

     

    不开心,每天不知道在干什么

    也学不会

    也不懂

    感觉到的就是很迷茫,很迷茫,不知道未来的方向

    好像所有的规划都变了,不知道自己该做点什么

    特别不喜欢现在这样

    不知道自己每天在干什么

    看东西也看不懂

    不知道自己到底适不适合这个

    毕业以后呢

    未来呢

    自己该怎么办啊

    好愁啊

  • 相关阅读:
    vector 向量容器用法祥解
    stdafx.h 的作用
    vector 利用swap 函数进行内存的释放 vector<int>().swap
    LPCTSTR LPCWSTR LPCSTR 含义
    Application->ProcessMessages();
    sizeof 和 strlen 的区别
    程序编译没错,运行报错:无法定位程序输入点GT_BufLaserFollowRatio(这是函数)于动态链接库GTS.DLL上
    用户登录注销功能
    在项目开发中经常用到的全局函数
    在项目开发中经常用到的全局函数2
  • 原文地址:https://www.cnblogs.com/lin1216/p/13330494.html
Copyright © 2011-2022 走看看