ChatGPT解决这个技术问题 Extra ChatGPT

LLVM 到底是什么?

我一直在听说 LLVM。它是在 Perl 中,然后是在 Haskell 中,然后有人在其他语言中使用它?它是什么?

它与 GCC 的确切区别是什么(观点 = 安全等)?

书中有一章很好地解释了这里的一切:www.aosabook.org/en/llvm.html

n
null

LLVM 是一个用于构建、优化和生成中间和/或二进制机器代码的库。

LLVM 可以用作编译器框架,您可以在其中提供“前端”(解析器和词法分析器)和“后端”(将 LLVM 的表示转换为实际机器代码的代码)。

LLVM 还可以充当 JIT 编译器 - 它支持 x86/x86_64 和 PPC/PPC64 程序集生成,并具有旨在提高编译速度的快速代码优化。

不幸的是,自 2013 年以来被禁用,可以使用从 demo page 处的 C 或 C++ 代码生成的 LLVM 机器代码。


如果您想使用它,请查看这篇精彩的文章:gnuu.org/2009/09/18/writing-your-own-toy-compiler
答案中提供的链接显示“LLVM 演示页面当前已禁用”。
ellcc.org/demo/index.cgi 是通过 LLVM 将 C/C++ 编译到各种目标(包括中间代码)的另一种方式
你能举一个实际的例子来说明它的含义吗?
现在,您可以使用 Compiler Explorer 使用从 C/C++ 生成的 LLVM。 godbolt.org
g
ggorlen

LLVM 的一个很好的总结是这样的:

https://i.stack.imgur.com/9xGDe.png

在前端,你有 Perl 和许多其他高级语言。在后端,您拥有直接在机器上运行的本地代码。

中心是您的中间代码表示。如果每种高级语言都可以用这种 LLVM IR 格式表示,那么基于这种 IR 的分析工具可以很容易地重用——这就是基本原理。


图片值一千字👍
因此,LLVM 似乎对编译器设计者很有用。除了独立于源代码分析生成的代码之外,程序员是否应该关心他是否使用标准编译器或基于 LLVM 的编译器进行编译?
如果你可以用 LLVM 编译到它的 IR,那么你可能会打开很多工具来分析 IR。但如果你的工具只能分析原生二进制文件(例如 x86),那么无论是 LLVM 生成的二进制文件还是 gcc 生成的二进制文件,还是 Intel 编译器生成的,都没有区别。
有人可以分享学习 LLVM IR 的任何资源吗?
C
Cœur

LLVM(过去的意思是“低级虚拟机”,但现在不再是)是一种编译器基础设施,用 C++ 编写,专为编写的程序的编译时、链接时、运行时和“空闲时”优化而设计在任意编程语言中。最初是为 C/C++ 实现的,LLVM 的语言独立设计(和成功)后来催生了各种各样的前端,包括 Objective C、Fortran、Ada、Haskell、Java 字节码、Python、Ruby、ActionScript、GLSL , 和别的。

Read this for more explanation
另请查看Unladen Swallow


..所以文档想说什么;虽然 LLVM 是 Low Level Virtual Machine 的首字母缩写词,但该项目只是简单地命名为 LLVM,而不是完全拼写出来的单词。
之前它有上述缩写,但后来删除了 en.wikipedia.org/wiki/LLVM
总结评论。 “低级虚拟机(LLVM)”应该类似于“LLVM(这意味着项目生命周期早期的“低级虚拟机”)”
C
Community

根据'Getting Started With LLVM Core Libraries'书(c):

事实上,LLVM 这个名字可能指的是以下任何一个: LLVM 项目/基础设施:这是几个项目的保护伞,它们一起形成了一个完整的编译器:前端、后端、优化器、汇编器、链接器、libc++、编译器- rt 和 JIT 引擎。 “LLVM”一词具有此含义,例如,在以下句子中:“LLVM 由多个项目组成”。基于 LLVM 的编译器:这是一个部分或完全使用 LLVM 基础架构构建的编译器。例如,编译器可能将 LLVM 用于前端和后端,但使用 GCC 和 GNU 系统库来执行最终链接。 LLVM 在以下句子中具有此含义,例如:“我使用 LLVM 将 C 程序编译到 MIPS 平台”。 LLVM 库:这是 LLVM 基础架构的可重用代码部分。例如,LLVM 在这句话中有这样的含义:“我的项目使用 LLVM 通过其 Just-in-Time 编译框架生成代码”。 LLVM 核心:中间语言级别的优化和后端算法构成了项目开始的 LLVM 核心。 LLVM 在以下句子中具有此含义:“LLVM 和 Clang 是两个不同的项目”。 LLVM IR:这是 LLVM 编译器的中间表示。 LLVM 在诸如“我构建了一个将我自己的语言翻译成 LLVM 的前端”之类的句子中使用时具有此含义。


J
Jens

LLVM 基本上是一个用于构建编译器和/或面向语言的软件的库。基本要点是,尽管您拥有 gcc,这可能是最常见的编译器套件,但它并不是为了可重用而构建的,即。很难从 gcc 中获取组件并使用它来构建您自己的应用程序。 LLVM 通过构建一组“模块化和可重用的编译器和工具链技术”很好地解决了这个问题,任何人都可以使用这些技术来构建编译器和面向语言的软件。


所以 LLVM 是库,而 Clang 是编译器?
Clang 是 LLVM 的 C/C++ 前端编译器。它将 C 代码转换为 LLVM 位码,由后端编译器翻译成某种汇编语言。
H
Hashim Sharif

LLVM 编译器基础结构对于对代码执行优化和转换特别有用。它还包含许多服务于不同用途的工具。 llvm-prof 是一个分析工具,允许您对执行进行分析以识别程序热点。 Opt 是一种优化工具,可提供各种优化过程(例如消除死代码)。

重要的是 LLVM 为您提供库,以编写您自己的通行证。例如,如果您需要对传递给程序的某些函数的某些参数添加范围检查,那么编写一个简单的 LLVM Pass 就足够了。

有关编写自己的通行证的更多信息,请查看此http://llvm.org/docs/WritingAnLLVMPass.html


y
yoAlex5

低级虚拟机(LLVM)

替代方案:GCC(GNU 编译器集合)。 GDB(GNU Debugger) - 调试工具。支持更多的语言和架构。

LLVM - 是伞形项目(库集),它是具有不同项目的品牌名称(IR - 中间表示,调试工具......)现在它不是虚拟机或首字母缩略词。 LLDB(LLVM Debugger) - 调试工具。大公司支持

编译器:

Language FrontEnd(Many: Clang, Haskel...) -> Optimizer(Single) -> Backend(Many: ARM, x86...)

FrontEnd 生成 Intermediate Representation (IR)。这种通用语言允许简单的缩放过程。如果您正在创建新语言,则您只负责 FrontEnd,如果您正在开发新架构,则应注意 BackEnd。它是 JVM 中的一种 .class 文件,由 ClassLoader[About] 使用

有等效的 IR 表格:

人类可读的汇编语言表示

内存编译器 IR,

[磁盘位码表示]

llvm-dis 可用于将 bitcode 转换为 human readable