为什么需要编译器?

1、计算机CPU只能读懂机器码(一堆0和1组成的编码)

2、高级编程语言(OC,Swift)最终也可以被计算机执行,why?

3、这就需要一个编译器编译的过程。在编译过程中,编译器的作用便是把我们的高级编程语言通过一系列的操作转化成可被计算机执行的机器语言。

什么是LLVM?

LLVM是架构编译器的框架系统,以C 编写而成,用于优化以任意程序语言编写的程序的编译时间,链接时间,运行时间以及空闲时间,对开发者保持开发,并兼容已有脚本。LLVM以及被Apple,Microsoft,Google,Facebook(Meta)等各家大公司采用。

传统的编译器架构 - 经典的三段式涉及

ios开发mvvm模式和mvc的详解(iOSLLVMClang浅谈)(1)

图片来自网络

1、Frontend:前端->词法分析、语法分析、语义分析、生成中间代码(LLVM IR)

2、Optimizer:优化器->中间代码优化

3、Backend:后端->生成机器码

4、前后端没有完全分离,耦合在一起,如果要支持一门新的语言或者平台,需要做大量的工作。

ios开发mvvm模式和mvc的详解(iOSLLVMClang浅谈)(2)

图片来自网络

前端后端使用统一的中间代码LLVM IR

如果需要支持一种新的语言,硬件设备,只需要实现一个新的前后端

什么是Clang?

Clang是一个C语言,C ,OC语言的轻量级编译器,源代码发布于BSD协议下。Clang将支持其普通Lambda表达式、返回类型的简化处理以及更好地处理constexpr关键字。Clang是一个由Apple主导编写,基于LLVM的C/C /OC编译器。

ios开发mvvm模式和mvc的详解(iOSLLVMClang浅谈)(3)

Clang 编译流程 图片来自网络

Xcode编译器发展史

Xcode3以前:GCC

Xcode3:增加LLVM,GCC(前端) LLVM(后端)

Xcode4.2:Clang LLVM3.0成为默认编译器

Xcode4.6:LLVM升级到4.6版本

Xcode5:GCC被废弃,新的编译器LLVM5.0,正式完成从GCC到Clang LLVM的过渡

为什么Xcode要用Clang LLVM取代GCC?

GCC是第三方开源的,不属于苹果维护,所以也就无法完全掌握其开发进程,Apple为OC增加许多新特性,但是GCC开发者对这些支持却不友好,Apple需要做模块化,GCC久托不做。

随着Apple对其Xcode性能要求越来越高,最终还是从0到1开发了Clang前端编译器,是基于LLVM的

对于GCC,Clang有以下优点:

1、编译速度快,在某些平台上,Clang编译器编译速度明显快过GCC编译器,debug模式下前者是后者的1/3。

2、占用内存小:Clang生成的AST占用内存是GCC的1/5。

3、模块化设计:Clang采用基于库的模块化设计,易于IDE集成

4、诊断信息可读性强,在编译过程中,Clang创建并保留了大量详细的元数据,有利于调试和错误报告

5、设计清晰简单,容易理解,扩展性强

小结

1、OC和Swift都采用Clang作为编译器前端,编译器前端主要进行词法分析,语法分析,语义分析,生成中间代码,在这个过程中,会进行类型检查,如果发现错误或者警告会标注出来在哪一行。

2、编译器后端会进行机器无关的代码优化,生成机器语言,并且进行机器相关的代码优化,根据不同的系统架构生成不同的机器码。

,