LLVM究竟是什么?

bod*_*ydo 438 llvm

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

Lir*_*una 348

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

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

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

如果您有兴趣,可以使用LLVM的机器代码,这些机器代码是在其演示页面中使用 C或C++代码生成的.

  • 如果你想玩它,看看这篇惊人的文章:http://gnuu.org/2009/09/18/writing-your-own-toy-compiler/ (36认同)
  • 答案中提供的链接显示"LLVM演示页面目前已被禁用." (27认同)
  • http://ellcc.org/demo/index.cgi是另一种通过LLVM将C/C++编译到各种目标的方法,包括中间代码 (5认同)
  • 现在,您可以使用编译器资源管理器来使用从 C/C++ 生成的 LLVM。https://godbolt.org/ (2认同)

Pet*_*eoh 86

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

在此输入图像描述

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

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

  • 图片胜过千言万语 (25认同)
  • 如果您可以使用LLVM编译到其IR,那么可能会打开很多工具来分析IR.但是,如果您的工具只能分析本机二进制文件(例如x86),那么无论是LLVM生成的二进制文件还是gcc生成的二进制文件,或者生成的英特尔编译器,都没有区别. (3认同)
  • 因此,看来LLVM对编译器设计人员很有用。除了独立于源代码分析生成的代码之外,程序员是否还应该关心是否使用标准编译器或基于LLVM的编译器进行编译? (2认同)
  • @KrishnaOza 1. https://wdv4758h.github.io/notes/compiler/llvm-ir.html 2. https://ubiquitydotnet.github.io/Llvm.NET/articles/Samples/Kaleidscope-ch3.html 3. https://xiongyingfei.github.io/SA/2015/4%20LLVM%20-%20GaoQing.pdf (2认同)

N 1*_*1.1 65

低级虚拟机(LLVM)是一种用C++编写的编译器基础结构,专为编译时,链接时,运行时和以任意编程语言编写的程序的"空闲时"优化而设计.最初是为C/C++实现的,LLVM的独立于语言的设计(以及成功)已经产生了各种各样的前端,包括Objective C,Fortran,Ada,Haskell,Java字节码,Python,Ruby,ActionScript,GLSL , 和别的.

阅读本文以获取更多解释
另请查看Unladen Swallow

  • 根据项目文档,__LLVM不是首字母缩写词.参考:https://llvm.org/ (14认同)
  • ..所以文档试图说的是什么; 虽然*LLVM*是*低级虚拟机*的首字母缩写,但该项目简称为*LLVM*,而不是完全拼写的单词. (12认同)
  • 之前它具有上述缩写,但后来删除了https://en.wikipedia.org/wiki/LLVM (2认同)
  • 总结一下评论。“低级虚拟机 (LLVM)”应该类似于“LLVM(在项目生命周期的早期意味着“低级虚拟机”)” (2认同)

小智 49

根据"LLVM核心库入门"一书(c):

实际上,LLVM这个名称可能引用以下任何一个:

  • LLVM项目/基础设施:这是几个项目的保护伞,它们共同构成了一个完整的编译器:前端,后端,优化器,汇编器,链接器,libc ++,编译器-rt和JIT引擎.单词"LLVM"具有这个含义,例如,在下面的句子中:"LLVM由几个项目组成".

  • 基于LLVM的编译器:这是使用LLVM基础结构部分或完全构建的编译器.例如,编译器可能使用LLVM作为前端和后端,但使用GCC和GNU系统库来执行最终链接.LLVM在下面的句子中具有这个含义,例如:"我使用LLVM将C程序编译到MIPS平台".

  • LLVM库:这是LLVM基础结构的可重用代码部分.例如,LLVM在句子中有这样的含义:"我的项目使用LLVM通过其即时编译框架生成代码".

  • LLVM核心:在中间语言级别发生的优化和后端算法构成项目启动的LLVM核心.LLVM在以下句子中具有这种含义:"LLVM和Clang是两个不同的项目".

  • LLVM IR:这是LLVM编译器中间表示.LLVM在句子中使用时具有这种含义,例如"我构建了一个将我自己的语言翻译成LLVM的前端".


red*_*dit 35

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

  • Clang是LLVM的C/C++前端编译器.它将C代码转换为LLVM bitcode,后端编译器将其转换为某种汇编语言. (10认同)
  • 那么LLVM是库,而Clang是编译器吗? (6认同)

yoA*_*ex5 9

低级虚拟机(LLVM)

[Xcode构建过程]

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

LLVM - 是伞形项目(库集),它是不同项目的品牌名称(IR - 中间表示、调试工具...),现在它不是虚拟机的缩写。LLDB(LLVM 调试器) - 调试工具。大公司支持

编译器:

Language FrontEnd(Many: Clang, Haskel, Swiftc...) -> Optimizer(Single) -> Backend(Many: arm64, x86_64, armv7...)
Run Code Online (Sandbox Code Playgroud)

前端生成Intermediate Representation (IR, LLVM IR). 这种通用语言允许简单的缩放过程。如果你正在创建新的语言,你只负责前端,如果你正在开发新的架构,你应该关心后端。它是 JVM 中的一种文件,供[About].class使用ClassLoader

有三种等效的 IR 形式:

llvm-dis可以用来转换bitcodehuman readable


小智 5

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

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

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