编译原理之美
宫文学
北京原点代码 CEO
46197 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
编译原理 · 期中考试周 (1讲)
编译原理之美
15
15
1.0x
00:00/00:00
登录|注册

25 | 后端技术的重用:LLVM不仅仅让你高效

授权更友好
支持全过程优化的设计思想
有很多可以学习借鉴的项目
支持JIT和AOT两种模式
良好的模块化设计和接口
支持了GNU Linux上的很多语言
GNU Compiler Collection
优点
包含多个组成部分:LLVM核心、Clang前端、LLDB、LLVM版本的C++标准类库等
支持多种语言的前端、多种后端CPU架构
主要聚焦于编译器的后端功能
开源的编译器基础设施项目
很多语言都获得了后端工具的帮助
动手安装和使用LLVM,写点代码测试它的功能
LLVM有很好的模块化设计,支持即时编译(JIT)和提前编译(AOT),支持全过程的优化,并且具备友好的授权
后端工具对于语言设计者很重要
把IR编译成汇编代码和可执行文件
从文本格式的IR生成二进制的字节码
优化IR
从C语言代码生成IR
使用类型化的和SSA特点的IR进行各种分析、优化和转换
支持多种语言的前端、多种后端CPU架构
GCC
LLVM
一课一思
课程小结
建立C++开发环境来使用LLVM
体验一下LLVM的功能
了解LLVM的特点
两个编译器后端框架:LLVM和GCC
后端技术的重用:LLVM

该思维导图由 AI 生成,仅供参考

在编译器后端,做代码优化和为每个目标平台生成汇编代码,工作量是很大的。那么,有什么办法能降低这方面的工作量,提高我们的工作效率呢?答案就是利用现成的工具。
在前端部分,我就带你使用 Antlr 生成了词法分析器和语法分析器。那么在后端部分,我们也可以获得类似的帮助,比如利用 LLVM 和 GCC 这两个后端框架。
相比前端的编译器工具,如 Lex(Flex)、Yacc(Bison)和 Antlr 等,对于后端工具,了解的人比较少,资料也更稀缺,如果你是初学者,那么上手的确有一些难度。不过我们已经用 20~24 讲,铺垫了必要的基础知识,也尝试了手写汇编代码,这些知识足够你学习和掌握后端工具了。
本节课,我想先让你了解一些背景信息,所以会先概要地介绍一下 LLVM 和 GCC 这两个有代表性的框架的情况,这样,当我再更加详细地讲解 LLVM,带你实际使用一下它的时候,你接受起来就会更加容易了。

两个编译器后端框架:LLVM 和 GCC

LLVM 是一个开源的编译器基础设施项目,主要聚焦于编译器的后端功能(代码生成、代码优化、JIT……)。它最早是美国伊利诺伊大学的一个研究性项目,核心主持人员是 Chris Lattner(克里斯·拉特纳)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

LLVM是一个开源的编译器基础设施项目,主要聚焦于编译器的后端功能,支持多种语言的前端和多种后端CPU架构。LLVM的出名是由于苹果公司全面采用了这个框架,而在Android平台上最新的开发语言Kotlin也支持基于LLVM编译成本地代码。LLVM还支持了很多其他语言和工具,如Rust、Julia、OpenGL、TensorFlow等。相比之下,GCC也是一个有代表性的编译器后端框架,支持了GNU Linux上的很多语言。在本课程中,主要采用LLVM,但其中学到的一些知识在学习GCC或其他编译器后端时也是有用的。LLVM的特点包括良好的模块化设计和接口、同时支持JIT和AOT两种模式、有很多可以学习借鉴的项目、全过程优化的设计思想以及更友好的授权。这些特点使得LLVM不仅能让你更高效,还能提高工作效率。 文章介绍了如何安装LLVM,并使用LLVM自带的命令行工具体验其功能。通过示例展示了从C语言代码生成IR、优化IR、从文本格式的IR生成二进制的字节码以及将IR编译成汇编代码和可执行文件的过程。同时,还介绍了LLVM的IR有两种格式,文本格式和字节码格式,以及如何转换这两种格式。此外,还介绍了LLVM的灵活性,可以即时编译运行字节码,以及将字节码编译成目标平台的汇编代码的过程。最后,总结了使用LLVM的命令行工具,包括clang前端、llvm-as、llc等,并鼓励读者在熟悉了命令行工具之后进一步在编程环境中使用LLVM。 LLVM的特点包括良好的模块化设计和接口、同时支持JIT和AOT两种模式、有很多可以学习借鉴的项目、全过程优化的设计思想以及更友好的授权,这些特点使得LLVM不仅能让你更高效,还能提高工作效率。文章还介绍了LLVM的IR有两种格式,文本格式和字节码格式,以及如何转换这两种格式。此外,还介绍了LLVM的灵活性,可以即时编译运行字节码,以及将字节码编译成目标平台的汇编代码的过程。最后,总结了使用LLVM的命令行工具,包括clang前端、llvm-as、llc等,并鼓励读者在熟悉了命令行工具之后进一步在编程环境中使用LLVM。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理之美》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • 无嗔
    Mozilla 还真的是一家非营利性的科技公司

    作者回复: 嗯。它实际上分为Mozilla基金会和Mozilla公司,基金会是公司的唯一股东。 成立一个公司的目的,是为了可以和谷歌这样的公司做生意,但赚来的钱是为了实现Mozilla基金会的使命。 挺有理想主义精神的一个组织。 中国未来是否也会孕育出着这样的组织呢?

    2019-12-02
    16
  • 阿鼎
    老师未提到visual studio的后端,请老师也介绍一下?

    作者回复: 你指的是微软的编译器后端技术? 我没有太关注微软,有几个原因: 1.微软的技术只能跑在windows上,而我希望能够用于多个平台,包括多个桌面操作系统和移动端等。 2.从研究的目的,我希望看到源代码和开放的文档,这点微软肯定是不支持的。 3.从使用的目的,我们希望后端工具能够帮助我们迅速实现自己的语言,而微软肯定没有动力帮这个忙。 总体来说,我希望采用开源的工具,并且是授权友好的开源工具。互联网时代这么多的创新,都是建立在开源的基础上的。 不过,技术都是相通的。微软这几年拥抱开源的态度也进步了很多。但至少目前为止,还没有办法用他们的东西。

    2019-10-21
    10
  • 拉欧
    老师的技术深度真心让人敬佩

    作者回复: 谢谢肯定! 只要喜欢技术,就会不断挖掘不断精进的。你一定会青出于蓝!

    2019-12-05
    8
  • 安排
    老师请问下,LLVM 版本的 C++ 标准类库,这个是什么意思啊? 是说libc++是用llvm后端编译出来的吗?区别于gun项目的libstdc++吗? libc++这个c++标准类库是苹果弄出来的吗?

    作者回复: C++标准类库是C++语言的标准中规定的。 标准类库的实现可以有多个,比如gnu、apache等的版本。 http://libcxx.llvm.org 这个页面写了LLVM项目为什么要另外实现一个。这里面有对实现方法的不同理解、有License的原因,有符合标准的原因。 至于libc++的贡献者,可能有苹果的人,因为苹果肯定是关心License的,这也是macOS选择基于FreeBSD定制,而不会基于Linux或其他有版权问题的Unix定制的原因吧!

    2019-10-21
    3
  • 在Windows上安装好llvm后,只能用clang命令,llvm-as和llc命令用不了,这是为什么呢?

    作者回复: 首先,找一下有没有llvm-as和llc这两个可执行文件。如果找不到,可能安装得不完整? 其实,我建议拿下llvm的源代码来,自己编译一下。为什么呢?因为你自己编译的时候,缺省用的是debug模式,这样用一些命令的时候,会有一些debug模式下的特性可以用。比如,opt命令在debug模式下就能输出更多的信息,便于你做编译优化的实验。

    2019-11-05
    2
    2
  • 疯二中
    老师你好,我在window上使用clang,看输出好像是用了visual studio的c++标准库。llvm没有提供window版本的c++标准库吗?

    作者回复: libc++是llvm提供的一个标准库,在MacOs和Linux上基本上成为了事实标准,替代了原来GNU的libstdc++。 可惜,目前对windows平台还没有正式支持,只有试验性的支持,你可以参见: https://libcxx.llvm.org/docs/BuildingLibcxx.html#experimental-support-for-windows

    2019-11-28
  • Ivan.Qi
    增加一些LLVM的中文资料 LLVM后端开发书籍或文章整理 https://zhuanlan.zhihu.com/p/645857966 毕昇编译--llvm编译入门 https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&__biz=MzkyNTMwMjI2Mw==&scene=2&album_id=2974971429714837504&count=3#wechat_redirect
    2023-09-02归属地:广东
    1
  • 请问示例代码在哪里下载?
    2024-02-07归属地:北京
  • allen
    老师,你提供的示例代码,我在运行的时候,报以下错误,能回答一下吗: Could not find a package configuration file provided by "LLVM" with any of the following names: LLVMConfig.cmake llvm-config.cmake
    2023-04-26归属地:上海
  • Geek_a0b00e
    老师,您好,能详细讲讲llvm中的memory SSA吗
    2022-06-24
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部