c语言通过编译器编译转换为机器码,重拾iOS-编译原理

894ba15a16245321342f9985a70a6498.png

关键词:LLVM,Clang,Swiftc,IR,preprocessor,Mach-O,dyld

编译器

把一种编程语言(原始语言)转换为另一种编程语言(目标语言)的程序叫做编译器.

大多数编译器由两部分组成: 前端和后端.

前端负责词法分析,语法分析,生成中间代码;

后端以中间代码作为输入,进行行架构无关的代码优化,接着针对不同架构生成不同的机器码。

前后端依赖统一格式的中间代码(IR), 使得前后端可以独立的变化. 新增一门语言只需要修改前端, 而新增一个CPU架构只需要修改后端即可. Objective C/C/C++使用的编译器前端是clang, swift是swift, 后端都是LLVM.

一、LLVM

LLVM的核心库提供了现代化的source-target-independent优化器和支持诸多流行CPU架构的代码生成器. Clang 和 LLDB都是基于LLVM衍生的子项目.

二、Clang

Clang是C语言家族的编译器前端,诞生之初是为了替代GCC,提供更快的编译速度。一张图了解clang编译的大致流程:

fe3a00e8ec6d8ceb62718493371b115f.png

大致看来, Clang可以分为一下几个步骤:

预处理 -> 词法分析 -> 语法分析 -> 静态分析 -> 生成中间代码和优化 -> 汇编 -> 链接

1、预处理(preprocessor)

预处理会进行如下操作:

1)头文件引入, 递归将头文件引用替换为头文件中的实际内容, 所以尽量减少头文件中的#import, 使用@class替代, 把#import放到.m文件中.

2)宏替换, 在源码中使用的宏定义会被替换为对应#define的内容, 不要在需要预处理的代码中加入太多的内联代码逻辑.

3)注释处理, 在预处理的时候, 注释被删除

4)条件编译, (#if, #else, #endif)

2、词法分析(lexical anaysis)

这一步把源文件中的代码转化为特殊的标记流. 词

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值