| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> LLVM系列(一)致敬 -> 正文阅读 |
|
[移动开发]LLVM系列(一)致敬 |
1.了解历史????????LLVM 是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。 ????????LLVM 计划启动于2000年,最初由美国UIUC大学的 Chris Lattner 博士主持开展。2006年Chris Lattner 加盟Apple Inc. 并致力于LLVM 在Apple 开发体系中的应用。Apple 也是 LLVM 计划的主要资助者。 ? ? ? ? ICON 如下: Chris Lattner 尊容如下(也是Swift之父): ?致敬!!! 2.充满思考的架构? ? ? ? LLVM 是一个模块化和可重用的编译器和工具链技术的集合,Clang 是 LLVM 的子项目,是 C,C++ 和 Objective-C 编译器,因为多模块的复用,所以提供了惊人的快速编译,据说比 GCC 快3倍。 ????????LLVM 当时是为了解决一个小问题而开发的(一个小故事):当使用OpenGL 函数库的时候(Mac OS 10.4 和 10.5环境下),比如你要调用这个函数,glVertex3f(),编译器必须将其转化为特定的GPU可以理解的数据。但是这带来一个问题:市面上有海量的GPU,每个GPU的性能和参数也不尽相同,所要求的数据格式也不同。这时 LLVM 可以产生很小的一部分代码去解决这个问题,这是 LLVM 诞生的初衷。 ????????一开始 LLVM 是开源的,所有代码在转成二进制时就叫做 bytecode -- 因为 java 当年就是这么叫的。当时这一部分有很多问题:比如不能扩展,无法兼容,非常脆弱。后来采用的是 bitcode 机制。LLVM 2.0 将所有代码以比特流(bit stream)而不是字节流(byte stream)的形式来编码。这就是 bitcode 这一术语的由来。这个就是iOS为什么一个字节是8bit(比特),1比特是0.125字节。说起这个bitcode,我们来看看下面的这张广为流传的图: ????????看过《趣谈网络协议》的同学都非常熟悉这张开篇图。这张图完美解释了LLVM的工作过程。当然还有另外一张简单明了的图如下: ? ? ? ? 解释一下上图:
????????有的同学就会说了这两张图区别在哪?实际上我们讲的不是区别,而是想说这个bitcode就是上面图中的中间部分,可能这2张图还是无法说清楚,我们再看下面这张图: ?????????上图中可以清楚地知道这个中间代码,就是这个Optimizer部分就是bitcode部分。上图的大概意思是:
? ? ? ? 到此我们的来意就明显了,我们这一系列的文章主要探讨Frontend,也就是词法分析、语法分析、语义分析、生成中间代码这一阶段。这里面的水很深,我们浅尝辄止😌😌😌。下面我们来看我们研究的主角:Clang。 3.我们的主角:Clang? ? ? ? 说起这个Clang,他只是这个LLVM整个项目的一个子项目,是基于LLVM架构的C/C++/Objective-C编译器前端。其官方网站:http://clang.llvm.org/。由于Clang采用库的模块化设计,易于 IDE 集成及其他用途的重用,其设计清晰简单,容易理解,所以就给我们扩展带来的便利。在编译过程中,Clang 创建并保留了大量详细的元数据 (metadata),有利于我们对其进行调试和查看错误报告。下面又有了一张图介绍了Clang所处的具体位置: ????????下面我们来浅尝一下:通过终端了解一下main.m文件的编译阶段干了什么,?在终端中输入clang -ccc-print-phases main.m,便有了如下输出
????????可以看出整个过程经历了input、preprocessor、compiler、backend、assembler、linker、bind-arch 7步。您肯定想知道里面每一步具体做了什么,请看下一篇Clang的编译过程详解。 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 23:42:31- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |