1 - LLVM简介

前言

  •  什么是LLVM
    • 官网: [https://llvm.org/](https://llvm.org/)
    • LLVM项目是模块化、可重用的编译器以及工具链技术的集合
    • 美国计算机协会(ACM)将其2012年软件系统奖项颁给了LLVM,之前曾经活动此奖项的软件和技术包括:Java、the World Wide Web、Smalltalk、UNIX、Eclipse等等
  • 创始人
    • Chris Lattner,也是Swift之父
  • 有些文章把LLVM当做Low Level Virtual Machine(低级虚拟机)的缩写简称,官方描述如下:
    • The name "LLVM" itself is not an acronym; it is the full name of the project
    • "LLVM"这个名称本身不是首字母缩略词,它是项目的全

一、传统的编译器架构

  •  Frontend: 前端
    • 词法分析、语法分析、语义分析、生成中间代码
  • Optimizer: 优化器
    • 中间代码优化
  • Backend:后端
    • 生成机器码

二、LLVM架构 

  • 不同的前端后端使用统一的中间代码LLVM Intermediate Representation(LLVM IR)
  • 如果需要支持一种新的编程语言,那么只需要实现一个新的前端
  • 如果需要支持一种新的硬件设备,那么只需要实现一个新的后端
  • 优化阶段是一个通用阶段,他针对的是统一的LLVM IR,不论是支持新的编程语言,还是支持新的硬件设备,都不需要对优化阶段做修改
  • LLVM现在被作为实现各种静态和运行时编译语言的通用基础结构(GCC家族、Java、.NET、Python、Ruby、Scheme、Haskkell、D等)

总结:

        相比较之下,GCC的前端和后端没分得太开,前端后端耦合在了一起,所以GCC为了支持一门新的语言,或者为了支持一个新的目标平台,旧变得特别困难。

三、Clang

  • 什么是Clang?
  • 相比GCC,Clang具有如下优点
    • 编译速度快:在某些平台,Clang的编译速度显著的快过GCC(Debug模式下编译OC速度比GCC快3倍) 
    • 占用内存小:Clang生成的AST所占用的内存是GCC的五分之一左右
    • 模块化设计:Clang采用基于库的模块化设计,易于IDE集成及其他用途的重用
    • 诊断信息可读性强:在编译过程中,Clang创建并保留大量详细的元数据(metadata),有利于调试和纠错
    • 设计清晰简单,容易理解,易于扩展增强

四、Clang和LLVM关系

  • 广义的LLVM
    •  整个LLVM架构
  • 狭义的LLVM
    • LLVM后端(代码优化、目标代码生成)

五、OC源文件的编译过程

  • 命令行查看编译的过程:clang -ccc-print-phases main.m

preprocessor阶段

  • 预处理
  • 查看preprocessor(预处理的结果):clang -E main.m

compiler阶段

  • 编译器成ir中间代码

backend阶段

  • 后端生成汇编

assembler阶段

  • 汇编生成目标代码

linker阶段

  • 链接静/动态库

bind_arch阶段

  • 生成目标架构代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值