我一直都在听LLVM。它在Perl中,那么它在Haskell中,然后有人在其他语言中使用它吗?它是什么?
答案 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的一个很好的总结是:
在前端你有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