llvm与gcc

llvm与gcc

  1. llvm 是一个编译器,也是一个编译器架构,是一系列编译工具,也是一个编译器工具链,开源 C++11 实现。

  2. gcc 相对于 clang 的优势:

    • gcc 支持更过语言前端,如 Java, Ada, FORTRAN, Go等
    • gcc 支持更多地 CPU 目标架构
    • gcc 支持更多语言扩展,比如 gcc 可以完美地支持 Linux Kernel 的编译,而 clang 会遇到一些扩展的问题
  3. clang 相对于 gcc 的优势:

    • clang 的 AST 和整个设计是人类可以阅读的
    • clang 的模块化和复用性更好,clang 从初衷上就是以 API 的形式设计,可以被源码分析工具,重构,IDE等复用。而 gcc 在设计时就没有这个考量,gcc 被设计为“一大团”静态编译器,总之就是可以实现功能,并且功能很强大(上面优点),但其中内容基本不可知,gcc 的设计就没有考虑复用性
    • clang 可以序列化其生成的 AST 到硬盘上并且被其他程序读入,这对整个程序的分析很有用,gcc 不支持这项功能
    • llvm 的优化在全程都会进行,包括编译时优化,链接时优化,装载时优化,运行时优化,以及闲时优化。可参考:LLVM全时优化。
    • clang 更快且用更少内存
    • clang 在设计时就考虑提供更加清晰准确地诊断信息(error 和 warning 信息)
    • gcc 的许可证是 GPL,clang 是 BSD

gcc 就像橡皮泥,能够塑造出任何优秀的作品,但基本没有复用性可言;llvm 就像乐高积木,虽然更加粗犷,但是模块化和复用性极佳。

在这里插入图片描述

那么,llvm 框架模块化的优势究竟是怎样在其他领域为其他应用带来巨大的便利的呢?以下整理自 知乎@蓝色 大佬的一个回答(LLVM相比于GCC,有哪些技术上的优势?):

  • 统一的IR与模块化。你可以很轻易的抽取LLVM的组件(以库的形式)出来用于其它领域,如抽取LLVM JIT用于 MapD 这样的 GPU 数据库,或者抽取LLVM的整个后端(优化与CodeGen)用于 TVM 这样的深度学习推理框架。这样带来的好处就是 LLVM 不再仅仅是用于给 Clang 等编译器前端提供服务的编译器后端,而是可以为需要JIT / CodeGen 功能的所有领域服务,比如提到的GPU数据库、深度学习推理框架,还包括安全、区块链等应用领域。而这一切LLVM所需要的仅仅是一个统一的中间表示格式:LLVM IR。所以,现在比较常见的开发模式变为:

    各种各样的应用(DSL、GPU数据库、TVM、安全、区块链等)----> 生成 LLVM IR ----> LLVM的优化 ----> LLVM Code Gen ----> 目标代码(ARM、x86、Hexagon、NVPTX、AMDGPU、WebAssembly…)。 这在LLVM出现之前,基本上是做不到的事情,不仅GCC,包括其它编译器都可以理解为“一坨”,根本抽不出来。

  • 快速的可定制化。这一点架设在第一点的基础上,由于在LLVM中编写优化Pass非常方便,所以针对各种各样的应用,可以变为:

    • 各种各样的应用(DSL、GPU数据库、TVM、安全、区块链等)----> 生成 LLVM IR ----> 编写针对自己特定应用的优化Pass ----> LLVM的优化 ----> LLVM Code Gen ----> 目标代码(ARM、x86、Hexagon、NVPTX、AMDGPU、WebAssembly…)

    • 也包括:各种各样的应用(DSL、GPU数据库、TVM、安全、区块链等)----> 生成 LLVM IR ----> 编写针对自己特定应用的优化Pass ----> LLVM的优化 ----> LLVM Code Gen ----> 目标代码(ARM、x86、Hexagon、NVPTX、AMDGPU、WebAssembly,自己的后端(如AI芯片)…)

  • 使用现代C++代码编写并有良好的代码组织。LLVM使用C++11编写,代码十分清晰与规范,对于阅读并且改写非常的方便。同时,其代码组织非常的好,每一个地方放什么东西,一目了然。而我也与一些同僚聊过,大家也都觉得LLVM是更好读、更好改的代码。

  • License优势。这一点是优势,但是是否是技术优势,看如何理解,但是这一点确实帮助了LLVM很多,让其快速被各大公司采用并不断回馈它。

Ref:

https://www.youtube.com/watch?v=RzrHuP2aVEg

https://www.zhihu.com/question/23807363

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

攻防世界web新手区解题 view_source / robots / backup

1**. view_source** 题目描述:X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。 f12查看源码即可发现flag 2. robots 题目描述:X老师上课讲了Robots协议,小宁同学却上课打了瞌睡,赶紧来教教…

python参数传递*args和**kwargs

python参数传递*args和**kwargs 和* 实际上真正的Python参数传递语法是 * 和 ** 。*args 和 **kwargs 只是一种约定俗成的编程实践。我们也可以写成 *vars 和 **kvars 。就如同其他常规变量的命名一样, args 和 kwargs 只是一种习惯的名称。 *args 和 **kwargs 一…

听GPT 讲Rust源代码--src/tools(25)

File: rust/src/tools/clippy/clippy_lints/src/methods/suspicious_command_arg_space.rs 在Rust源代码中,suspicious_command_arg_space.rs文件位于clippy_lints工具包的methods目录下,用于实现Clippy lint SUSPICIOUS_COMMAND_ARG_SPACE。 Clippy是Ru…

Java一次编译,到处运行是如何实现的

Java一次编译,到处运行是如何实现的 转自:https://cloud.tencent.com/developer/article/1415194 (排版微调) JAVA编译运行总览 Java是一种高级语言,要让计算机执行你撰写的Java程序,也得通过编译程序的…

JIT(动态编译)和AOT(静态编译)编译技术比较

JIT(动态编译)和AOT(静态编译)编译技术比较 转自:https://www.cnblogs.com/tinytiny/p/3200448.html Java 应用程序的性能经常成为开发社区中的讨论热点。因为该语言的设计初衷是使用解释的方式支持应用程序的可移植…

python解释器

python解释器 计算机编程语言 本部分参考自:https://zhuanlan.zhihu.com/p/141212114 从计算机编程语言说起,它主要分为三类:机器语言、汇编语言、高级语言。 机器语言是一种计算机可以直接识别并执行的二进制指令集。由于其可以直接交给…

编译型语言与解释型语言

编译型语言与解释型语言 首先要说明,编译型语言与解释型语言这种分类方法是不科学的,或者说已经过时了,但是这种称呼大抵还是能够让人明白我们将要讨论的是什么东西。 文中所列参考是笔者认为比较有帮助的一些扩展阅读内容。 首先贴一个很形…

常见的各种shell及其区别

常见的各种shell及其区别 引子 for((i1;i<10;i)); do echo $(expr $i \* 3 1); done 网上搜到的 shell for循环脚本&#xff0c;别人都能正常运行&#xff0c;我却报错&#xff1a; Syntax error: Bad for loop variable究竟是怎么回事呢&#xff1f; shell简介…

shell脚本 变量

shell脚本 变量类型 什么是Shell变量 用一个固定的字符串去表示不固定的内容。 Shell变量的类型 shell脚本中自定义变量的类型&#xff0c;我们这里分为&#xff1a; 自定义变量环境变量位置变量与定义变量 这四类&#xff0c;它们有一些相同点&#xff0c;但又有些不同点…

攻防世界web新手区解题 /cookie / disabled_button / weak_auth

cookie 题目描述&#xff1a;X老师告诉小宁他在cookie里放了些东西&#xff0c;小宁疑惑地想&#xff1a;‘这是夹心饼干的意思吗&#xff1f;’ 使用burp suite抓包查看 发现提示&#xff1a; look-herecookie.php 于是在url后加上 cookie.php 得到提示查看返回 就得到了f…

Python 函数式编程

Python 函数式编程 转自&#xff1a;https://www.liaoxuefeng.com/wiki/1016959663602400/1017328525009056&#xff0c;推荐去该链接读原文&#xff0c;有习题和热烈的评论区交流。 函数式编程 函数是Python内建支持的一种封装&#xff0c;我们通过把大段代码拆成函数&…

Python中的生成器与迭代器

Python中的生成器与迭代器 转自&#xff1a;https://www.liaoxuefeng.com/wiki/1016959663602400/1017323698112640&#xff0c;推荐去该链接读原文&#xff0c;有习题和热烈的评论区交流。 生成器 通过列表生成式&#xff0c;我们可以直接创建一个列表。但是&#xff0c;受…

基于GET报错的sql注入,sqli-lab 1~4

根据注入类型可将sql注入分为两类&#xff1a;数字型和字符型 例如&#xff1a; 数字型&#xff1a; sleect * from table where if 用户输入id 字符型&#xff1a;select * from table where id 用户输入id &#xff08;有引号) 通过URL中修改对应的D值&#xff0c;为正常数字…

Python 装饰器详解(上)

Python 装饰器详解&#xff08;上&#xff09; 转自&#xff1a;https://blog.csdn.net/qq_27825451/article/details/84396970&#xff0c;博主仅对其中 demo 实现中不适合python3 版本的语法进行修改&#xff0c;并微调了排版&#xff0c;本转载博客全部例程博主均已亲测可行…

xss原理和注入类型

XSS漏洞原理 : XSS又叫CSS(cross Site Script), 跨站脚本攻击,指的是恶意攻击者往Web页面里插入恶意JS代码,当用户浏览该页时,嵌入其中的Web里的JS代码就会被执行,从而达到恶意的特殊目的. 比如:拿到cooike XSS漏洞分类: 反射性(非存储型) payload没有经过存储,后端接收后,直接…

Python 装饰器详解(中)

Python 装饰器详解&#xff08;中&#xff09; 转自&#xff1a;https://blog.csdn.net/qq_27825451/article/details/84581272&#xff0c;博主仅对其中 demo 实现中不适合python3 版本的语法进行修改&#xff0c;并微调了排版&#xff0c;本转载博客全部例程博主均已亲测可行…

存储型xss案例

存储型xss原理: 攻击者在页面插入xss代码,服务端将数据存入数据库,当用户访问存在xss漏洞的页面时,服务端从数据库取出数据展示到页面上,导致xss代码执行,达到攻击效果 案例: 在一个搭建的论坛网站中, 根据存储型xss注入的条件,要找到可以存储到数据库的输入位置,并且这个位置…

反射型XSS案例

**原理:**攻击者将url中插入xss代码,服务端将url中的xss代码输出到页面上,攻击者将带有xss代码的url发送给用户,用户打开后受到xss攻击 需要url中有可以修改的参数 案例: 可能存在反射型xss的功能(点) : 搜索框等&#xff08;所有url会出现参数的地方都可以尝试&#xff09;……

Python 装饰器详解(下)

Python 装饰器详解&#xff08;下&#xff09; 转自&#xff1a;https://blog.csdn.net/qq_27825451/article/details/84627016&#xff0c;博主仅对其中 demo 实现中不适合python3 版本的语法进行修改&#xff0c;并微调了排版&#xff0c;本转载博客全部例程博主均已亲测可行…

xss-lab靶场通关writeup(1~6.......在更新)

level 2 : 标签被编码&#xff0c;利用属性完成弹窗 输入 发现没有弹窗 查看源代码&#xff1a; 发现&#xff1a; <>符号被编码 说明keybord参数进行了处理&#xff0c;那么只能从属性上进行恶意编码&#xff1a;先将属性的引号和标签闭合&#xff0c;用 // 将后面的…