iOS之 LLVM 一

139 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

LLVM概述

LLVM是架构编译器(compiler)的框架系统,以C++编写而成。用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼任已有脚本
LLVM计划启动于2000年,最初由美国UIUC大学的Chris Lattner博士主持开展。2006Chris Lattner加盟Apple Inc,并致力于LLVMApple开放体系中的应用

Apple也是LLVM计划的主要自助者

目前LLVM已经被苹果iOS开发工具、Xilinx VivadoFacebookGoogle等各大公司采用

传统编译器设计

image.png

  • 源码(Source Code),经过编译器前端(Frontend)→优化器(Optimizer)→编译器后端(Backend),生成机器代码(Machine Code
    • 机器代码(Machine Code):就是CPU可执行的二进制代码
    • 从源码到机器码的生成,这个过程都是编译器负责完成的
iOS的编译器架构

Objective-CCC++使用的编译器前端是ClangSwift使用的编译器前端是swiftc,而它们使用的编译器后端都是LLVM

image-2.png 各个模块的职责:

  • 编译器前端(Frontend
    • 编译器前端的任务是解析源代码。它会进行:词法分析、语法分析、语义分析,检查源代码是否存在错误,然后构建抽象语法树(Abstract Syntax Tree, AST
    • LLVM的前端还会生成中间代码(intermediate representation, IR
  • 优化器(Optimizer
    • 优化器负责进行各种优化。改善代码的运行时间,例如:消除冗余计算等
  • 后端(Backend)/代码生成器(Code Generator
    • 将代码映射到目标指令集。生成机器代码,并进行机器代码的相关优化
LLVM的设计

当编译器决定支持多种源语言或多种硬件框架时,LLVM最重要的地方就来了。其他的编译器如GCC,它方法非常成功,但由于它是作为整体应用程序设计的,因此它们的用途受到了很大的限制

LLVM设计的最重要方面是,使用通用的代码表示形式(IR),它是用来在编译器中表示代码的形式。所以LLVM可以为任何编程语言独立编写前端,并且可以为任意硬件架构独立编写后端

image-3.png

  • 简单来说,LLVM最大的优势,就是将编译器的前后端分离,从而提高可扩展性
Clang

ClangLLVM项目中的一个子项目

它是基于LLVM架构的轻量级编译器,诞生之初为了替代GCC,提供更快的编译速度

它是负责编译CC++Objective-C语音的编译器,它属于整个LLVM架构中的编译器前端

对于开发者来说,研究Clang可以给我们带来很多好处