当前位置:网站首页>Keil升级到AC6后,到底有哪些变化?
Keil升级到AC6后,到底有哪些变化?
2022-08-05 09:21:00 【李肖遥】
关注、星标公众号,直达精彩内容
来源:嵌入式专栏
Keil MDK默认使用的是Arm编译器(Arm Compiler),目前主要是AC5和AC6。
而AC6相较于AC5在编译速度上有很大的提升,那么,你知道为什么吗?
原因在于AC6是基于现代LLVM和Clang技术构建而成,今天就来讲讲AC6和LLVM的编译原理。
关于编译器AC6
早在2015年,Arm就推出了AC6编译器,并集成在Keil MDK中。但由于AC5和AC6对代码的的兼容性不友好,导致很多使用Keil MDK的用户还是AC5编译器。
所以兼容性不友好,但AC6的编译速度相比AC5快很多,因此还是吸引了一部分人使用AC6编译器。
为什么AC6编译速度快了很多呢?原因在于AC6使用了一套全新的架构技术。
AC6组件如下图:

1.armclang
基于现代LLVM和Clang技术构建
支持GNU语法汇编
与最初为GCC编写的源代码高度兼容
实现规范,包括ANSI / ISO C和C ++,用于Arm架构的ABI,用于64位Arm架构的ABI以及Arm C语言扩展(ACLE)
2.armlink
功能丰富的专用嵌入式链接器,该链接器将对象和库组合在一起以生成可执行文件
3.Arm C库:由Arm针对性能和代码密度进行了优化,并包括 用于深度嵌入式应用程序的微型MicroLib。
4.Arm C++库:基于LLVM libc ++项目的库
这部分内容可参看:
https://developer.arm.com/tools-and-software/embedded/arm-compiler
Keil MDK 编译器 AC5 和 AC6 优化选项重要内容有着很大区别:ARM Compiler 5(和更早版本)使用armcc编译器,而ARM Compiler 6将armcc替换为armclang,armclang基于LLVM,它具有不同的命令行参数、指令等,因此算是一个新的编译器。
LLVM基础内容
上面我们讲到了AC6是基于LLVM,下面就来讲讲关于LLVM的内容。
1.什么LLVM?
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
在理解LLVM时,我们可以认为它包括了一个狭义的LLVM和一个广义的LLVM。广义的LLVM其实就是指整个LLVM编译器架构,包括了前端、后端、优化器、众多的库函数以及很多的模块;而狭义的LLVM其实就是聚焦于编译器后端功能(代码生成、代码优化、JIT等)的一系列模块和库。
2.LLVM优势
传统编译器分三个阶段:
前端(Frontend)-- 优化器(Optimizer)-- 后端(Backend)
前端负责分析源代码,可以检查语法级错误,并构建针对语言的抽象语法树(AST);抽象语法树可以进一步转换为优化,最终转为新的表示方式,然后再交给让优化器和后端处理;
最终由后端生成可执行的机器码。

llvm也分三个阶段,但是设计上略微的有些区别, LLVM不同的就是对于不同的语言它都提供了同一种中间表示:

前端可以使用不同的编译工具对代码文件做词法分析以形成抽象语法树AST,然后将分析好的代码转换成LLVM的中间表示IR(intermediate representation);中间部分的优化器只对中间表示IR操作,通过一系列的pass对IR做优化;后端负责将优化好的IR解释成对应平台的机器码。LLVM的优点在于,中间表示IR代码编写良好,而且不同的前端语言最终都转换成同一种的IR。
为什么使用三段式设计?优势在哪里?首先解决一个很大的问题:假如有N种语言(C、OC、C++、Swift...)的前端,同时也有M个架构(模拟器、arm64、x86...)的target,是否就需要N*M个编译器?三段式架构的价值就提现出来了,通过共享优化器的中转,很好的解决了这个问题。
Clang和LLVM关系
Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。那么为什么已经有了GCC还要开发Clang呢?Clang相比于GCC有什么优势呢?
其实,这也是Clang当初在设计开发的时候所主要考虑的原因。Clang是一个高度模块化开发的轻量级编译器,它的编译速度快、占用内存小、非常方便进行二次开发。
LVM和Clang的关系是怎样的呢。我们将它们对应于传统的编译器当中的几个独立的部分,这样能够更加方便明确生动的表述。

其实,对应到这个图中,我们就可以非常明确的找出它们的对应关系。LLVM与Clang是C/C++编译器套件。对于整个LLVM的框架来说,包含了Clang,因为Clang是LLVM的框架的一部分,是它的一个C/C++的前端。Clang使用了LLVM中的一些功能,目前知道的就是针对中间格式代码的优化,或许还有一部分生成代码的功能。
从源代码角度来讲,clang是基于LLVM的一个工具。而功能的角度来说,LLVM可以认为是一个编译器的后端,而clang是一个编译器的前端,他们的关系更加的明了,一个编译器前端想要程序最终变成可执行文件,是缺少不了对编译器后端的介绍的。
LLVM编译工具链编译流程
使用LLVM的对一门语言编译的简图如下所示:

LLVM编译一个源文件的过程:预处理 -> 词法分析 -> Token -> 语法分析 -> AST -> 代码生成 -> LLVM IR -> 优化 -> 生成汇编代码 -> Link -> 目标文件.
完全需要我们手工,或者依靠其他工具如lex, yacc来做的事情,是从源代码到token的词法分析和从token到AST的语法分析;词法分析的输出是将源代码解析成一个个的token。这些token就是有类型和值的一些小单元,比如是关键字,还是数字,还是标识符,从AST转LLVM开始,LLVM就开始提供一系列的工具帮助我们快速开发。从IR(中间指令代码)到DAG(有向无环图)再到机器指令,针对常用的平台,LLVM有完善的后端。也就是说,我们只要完成了到IR这一步,后面的工作我们就享有和Clang一样的先进生产力了。
CodeGen负责将语法树从顶至下遍历,翻译成LLVM IR,LLVM IR是Frontend的输出,也是LLVM Backerend的输入,桥接前后端。
LLVM命令:
可以使用 llc 将 LLVM 字节代码转换成特定于平台的汇编代码
lli 可以通过解释器或使用高级选项中的即时 (JIT) 编译器执行此工作
llvm-gcc 是 GNU Compiler Collection (gcc) 的修改版本,可以在使用 -S -emit-llvm 选项运行时会生成 LLVM 字节代码。
编译指令:
clang -c -emit-llvm test1.c -o test1.bc 编译产生字节码
clang -S -emit-llvm test.c -o test.ll 编译产生可视化字节码
llvm-dis test1.bc test1.ll bc字节码转为可视化字节码ll
llvm-as test1.ll test1.bc 可视化字节码转为字节码bc
版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
关注我的微信公众号,回复“加群”按规则加入技术交流群。点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。边栏推荐
- ECCV 2022 Oral Video Instance Segmentation New SOTA: SeqFormer & IDOL and CVPR 2022 Video Instance Segmentation Competition Champion Scheme...
- 使用稀疏 4D 卷积对 3D LiDAR 数据中的运动对象进行后退分割(IROS 2022)
- shell脚本实例
- PAT乙级-B1019 数字黑洞(20)
- 线程之Happens-before规则
- 请问如果想往mysql里面写数据,直接用flink-connector-jdbc就可以吧,可是我在f
- flink cdc支持从oracle dg库同步吗
- 使用HBuilder离线本地打包ipa教程
- 深度学习21天——卷积神经网络(CNN):天气识别(第5天)
- ts/js 函数传参带函数写法
猜你喜欢

【LeetCode】623. 在二叉树中增加一行

欧盟 | 地平线 2020 ENSEMBLE:D2.13 SOTIF Safety Concept(上)

营销建议 | 您有一份八月营销月历待查收! 建议收藏 !

CCVR eases heterogeneous federated learning based on classifier calibration

并发之CAS

深度学习21天——卷积神经网络(CNN):天气识别(第5天)

Undefined symbols for architecture arm64解决方案

js 图形操作一(兼容pc、移动端实现 draggable属性 拖放效果)

Hundred lines of code launch red hearts, why programmers lose their girlfriends!

Example of Noise Calculation for Amplifier OPA855
随机推荐
2022.8.3
好资料汇总
【Excel实战】--图表联动demo_001
PAT Grade B-B1020 Mooncake(25)
韦东山 数码相框 项目学习(六)tslib的移植
IT研发/开发流程规范效能的思考总结
百行代码发射红心,程序员何愁命不中女朋友!
thinkPHP5 realizes clicks (data increment/decrement)
js graphics operation one (compatible with pc, mobile terminal to achieve draggable attribute drag and drop effect)
Two-table query average grouping in sql server
上海控安技术成果入选市经信委《2021年上海市网络安全产业创新攻关成果目录》
ECCV 2022 Oral 视频实例分割新SOTA:SeqFormer&IDOL及CVPR 2022 视频实例分割竞赛冠军方案...
MySQL内部函数介绍
Hundred lines of code launch red hearts, why programmers lose their girlfriends!
无题十
工程制图知识点
flink cdc支持从oracle dg库同步吗
交换机端口的三种类型详解与hybrid端口实验
ts/js function pass parameter with function writing
CCVR eases heterogeneous federated learning based on classifier calibration
