LLVM究竟是什么?

时间:2010-03-01 09:06:55

标签: llvm

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

7 个答案:

答案 0 :(得分:310)

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

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

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

如果您感兴趣,可以使用LLVM的机器代码,这些机器代码是从demo page中的C或C ++代码生成的。

答案 1 :(得分:62)

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

Read this for more explanation
还可以查看Unladen Swallow

答案 2 :(得分:57)

LLVM的一个很好的总结是:

enter image description here

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

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

答案 3 :(得分:46)

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

  

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

     
      
  • LLVM项目/基础设施:这是几个人的保护伞   共同构成完整编译器的项目:前端,   后端,优化器,汇编器,链接器,libc ++,编译器-rt和a   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"。

  •   

答案 4 :(得分:32)

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

答案 5 :(得分:5)

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

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

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

答案 6 :(得分:3)

低级虚拟机(LLVM)

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

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

编译器:

models = []
sims = []

for i in range(6):
      models.append(KerasPickleWrapper(tensorflow.keras.models.clone_model(model)))
      sims.append(Sim())
    
p = Pool()
p.map(Sim.run, sims, models)

FrontEnd 生成 Language FrontEnd(Many: Clang, Haskel...) -> Optimizer(Single) -> Backend(Many: ARM, x86...) 。这种通用语言允许简单的扩展过程。如果您正在创建新语言,您只负责前端,如果您正在开发新架构,您应该关心后端。它是 JVM 中的一种 Intermediate Representation (IR) 文件,由 .class[About]

使用

有你等效的 IR 形式:

ClassLoader 可用于将 llvm-dis 转换为 bitcode