我一直听说LLVM。它是Perl的,然后是Haskell的,然后有人在其他语言中使用它?是什么?
LLVM是一个用于构造、优化和生成中间和/或二进制机器代码的库。
LLVM可以用作编译器框架,其中提供“前端”(解析器和词法分析器)和“后端”(将LLVM的表示转换为实际机器代码的代码)。
LLVM还可以充当JIT编译器——它支持x86/x86_64和PPC/PPC64程序集生成,具有旨在提高编译速度的快速代码优化。
不幸的是,自2013年以来被禁用,有能力玩LLVM的机器代码生成的C或c++代码在演示页面。
LLVM(以前的意思是“低级虚拟机”,但不再是)是一个编译器基础设施,用c++编写,它是为编译时、链接时、运行时和“空闲时”优化用任意编程语言编写的程序而设计的。LLVM最初是为C/ c++实现的,它独立于语言的设计(以及它的成功)已经衍生出了各种各样的前端,包括Objective C、Fortran、Ada、Haskell、Java字节码、Python、Ruby、ActionScript、GLSL等等。
LLVM编译器基础设施对于对代码执行优化和转换特别有用。它还包括许多用于不同用途的工具。Llvm-prof是一个分析工具,允许您对执行进行分析,以确定程序热点。Opt是一个优化工具,提供各种优化通道(例如,死代码消除)。
重要的是,LLVM为您提供了库,可以编写自己的pass。例如,如果您需要对传递到程序的某些函数的某些参数添加范围检查,那么编写一个简单的LLVM Pass就足够了。
有关编写自己的Pass的更多信息,请查看http://llvm.org/docs/WritingAnLLVMPass.html
LLVM基本上是一个用于构建编译器和/或面向语言的软件的库。最基本的要点是,尽管你有gcc,这可能是最常见的编译器套件,但它并不是为可重用而构建的。很难从GCC中获取组件并使用它来构建自己的应用程序。LLVM通过构建一套“模块化和可重用的编译器和工具链技术”很好地解决了这个问题。任何人都可以使用它来构建编译器和面向语言的软件。
根据“LLVM核心库入门”书(c):
事实上,LLVM的名称可能指以下任何一种: 这是一把可供几人使用的伞 这些项目一起构成了一个完整的编译器:前端, 后端、优化器、汇编器、链接器、libc++、编译器-rt和a JIT引擎。“LLVM"这个意思,比如说,在 以下句子:“LLVM由几个项目组成” 这是一个编译器构建部分或 完全与LLVM基础架构。例如,编译器可能 前端和后端使用LLVM,使用GCC和GNU系统 库执行最后的链接。LLVM的意思是 下面的句子,例如:“我用LLVM编译C程序。 . a MIPS平台 LLVM库:这是可重用的代码部分 LLVM基础架构。例如,LLVM在 我的项目使用LLVM通过它生成代码 即时编译框架”。 LLVM核心:优化 这发生在中间语言级别和后端 算法构成了LLVM的核心,也是项目开始的地方。LLVM有这个 LLVM和Clang是两个不同的词 projects" . < / p > LLVM IR: LLVM编译器中间 表示。LLVM在以下句子中有这个意思 “我建立了一个前端,将我自己的语言翻译成llvm”。
事实上,LLVM的名称可能指以下任何一种:
LLVM库:这是可重用的代码部分 LLVM基础架构。例如,LLVM在 我的项目使用LLVM通过它生成代码 即时编译框架”。
LLVM核心:优化 这发生在中间语言级别和后端 算法构成了LLVM的核心,也是项目开始的地方。LLVM有这个 LLVM和Clang是两个不同的词 projects" . < / p >
LLVM IR: LLVM编译器中间 表示。LLVM在以下句子中有这个意思 “我建立了一个前端,将我自己的语言翻译成llvm”。
LLVM的一个很好的总结是:
在前端,您有Perl和许多其他高级语言。在后端,有直接在机器上运行的本机代码。
中心是中间代码表示。如果每一种高级语言都可以用这种LLVM IR格式表示,那么基于这种IR的分析工具就可以很容易地重用——这是基本原理。
低级虚拟机(LLVM)
替代方案:GCC(GNU编译器集合)。GDB -调试工具。支持更多语言和架构。
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<一口>[对]< /一口>使用
Intermediate Representation (IR)
.class
ClassLoader
有三种等效的IR形式:
llvm-dis可以用来将bitcode转换为human readable
llvm-dis
bitcode
human readable