LLVM:修订间差异

求闻百科,共笔求闻
添加的内容 删除的内容
(机器人:清理不当的来源、移除无用的模板参数)
(机器人:修正重定向;整理源码)
标签消歧义链接
第10行: 第10行:
| latest preview version =
| latest preview version =
| latest preview date =
| latest preview date =
| operating system = [[跨平台]]
| operating system = [[跨平臺|跨平台]]
| genre = [[編译器]]
| genre = [[編译器]]
| programming language = [[C++]]
| programming language = [[C++]]
第17行: 第17行:
}}
}}


{{lang|en|'''LLVM'''}}是一套[[编译器]]基础设施项目,为[[自由软件]],以[[C++]]寫成,包含一系列模块化的编译器组件和[[工具链]],用来开发编译器[[前端]]和[[后端]]。它是为了任意一种[[程式语言]]而寫成的程式,利用[[虛擬技术]]创造出[[編译器|編译時期]]、[[链接器|链结時期]]、[[執行時期]]以及“閒置時期”的最佳化。
{{lang|en|'''LLVM'''}}是一套[[編譯器|编译器]]基础设施项目,为[[自由软件]],以[[C++]]寫成,包含一系列模块化的编译器组件和[[工具链]],用来开发编译器[[前端]]和[[后端]]。它是为了任意一种[[程式语言]]而寫成的程式,利用[[虛擬技术]]创造出[[編译器|編译時期]]、[[链接器|链结時期]]、[[執行時期]]以及“閒置時期”的最佳化。


它最早以[[C语言|C]]/[[C++]]为实作对象,而目前它已支援包括[[ActionScript]]、[[Ada]]、[[D语言]]、[[Fortran]]、[[GLSL]]、[[Haskell]]、[[Java]]字节码、[[Objective-C]]、[[Swift语言|Swift]]、[[Python]]、[[Ruby]]、[[Crystal]]、[[Rust]]、[[Scala]]<ref>{{Cite paper| last = Reedy| first = Geoff| title = Compiling Scala to LLVM| location = St. Louis, Missouri, United States| accessdate = 2013-02-19| date = 2012-09-24| url = http://www.infoq.com/presentations/Scala-LLVM| journal = | | | }}</ref>以及[[C♯|C#]]<ref>{{citation| title = Mono LLVM| accessdate = 2013-03-10| url = http://www.mono-project.com/Mono_LLVM| | | }}</ref>等语言。
它最早以[[C语言|C]]/[[C++]]为实作对象,而目前它已支援包括[[ActionScript]]、[[Ada]]、[[D語言|D语言]]、[[Fortran]]、[[GLSL]]、[[Haskell]]、[[Java]]字节码、[[Objective-C]]、[[Swift]]、[[Python]]、[[Ruby]]、[[Crystal]]、[[Rust]]、[[Scala]]<ref>{{Cite paper| last = Reedy| first = Geoff| title = Compiling Scala to LLVM| location = St. Louis, Missouri, United States| accessdate = 2013-02-19| date = 2012-09-24| url = http://www.infoq.com/presentations/Scala-LLVM| journal = | | | }}</ref>以及[[C♯|C#]]<ref>{{citation| title = Mono LLVM| accessdate = 2013-03-10| url = http://www.mono-project.com/Mono_LLVM| | | }}</ref>等语言。


== 历史 ==
== 历史 ==
第35行: 第35行:
LLVM提供了一套适合编译器系统的[[中间语言]]({{lang|en|Intermediate Representation}},IR),有大量变换和优化都围绕其实现。经过变换和优化后的中间语言,可以转换为目标平台相关的[[汇编语言]]代码。LLVM可以和[[GCC]]工具链一起工作,允许它与为该项目编写的大量现有编译器一起使用。LLVM还可以在编译、链接时生成[[可重新定位的程式碼]](Relocatable Code),甚至在运行时生成二进制机器码。
LLVM提供了一套适合编译器系统的[[中间语言]]({{lang|en|Intermediate Representation}},IR),有大量变换和优化都围绕其实现。经过变换和优化后的中间语言,可以转换为目标平台相关的[[汇编语言]]代码。LLVM可以和[[GCC]]工具链一起工作,允许它与为该项目编写的大量现有编译器一起使用。LLVM还可以在编译、链接时生成[[可重新定位的程式碼]](Relocatable Code),甚至在运行时生成二进制机器码。


LLVM的中间语言与具体的语言、指令集、类型系统无关,其中每条指令都是[[静态单赋值形式]](SSA), 即每个变量只能被赋值一次。这有助于简化变量之间的依赖分析。LLVM允许静态编译代码,或者通过[[实时编译]](JIT)机制将中间表示转换为机器码(类似Java)。
LLVM的中间语言与具体的语言、指令集、类型系统无关,其中每条指令都是[[静态单赋值形式]](SSA), 即每个变量只能被赋值一次。这有助于简化变量之间的依赖分析。LLVM允许静态编译代码,或者通过[[即时编译|实时编译]](JIT)机制将中间表示转换为机器码(类似Java)。


LLVM支援与语言无关的[[指令集架构]]及[[类型系统]]<ref>{{cite web
LLVM支援与语言无关的[[指令集架构]]及[[類型系統|类型系统]]<ref>{{cite web
| url=http://llvm.org/docs/LangRef.html
| url=http://llvm.org/docs/LangRef.html
| title=LLVM Language Reference Manual
| title=LLVM Language Reference Manual
第44行: 第44行:
|
|
|
|
}}</ref>。每个在[[静态单赋值形式]](SSA)的指令集代表著,每个[[变量 (程序设计)|變数]](被称为具有型別的暫存器)僅被賦值一次,這简化了變数间相依性的分析。LLVM允許程式碼被靜態的編译,包含在传统的GCC系统底下,或是类似[[JAVA]]等后期編译才将IF編译成机器碼所使用的[[即時編译]](JIT)技术。它的型別系统包含基本型別([[整数 (计算机科学)|整数]]或是[[浮点数]])及五个[[复合型別]]([[指针 (信息学)|指标]]、[[数组]]、向量、结构及[[子程序|函数]]),在LLVM具体语言的型別建制可以以结合基本型別来表示,举例来說,C++所使用的class可以被表示为结构、函式及[[函数指针]]的陣列所組成。
}}</ref>。每个在[[静态单赋值形式]](SSA)的指令集代表著,每个[[变量程序设计|變数]](被称为具有型別的暫存器)僅被賦值一次,這简化了變数间相依性的分析。LLVM允許程式碼被靜態的編译,包含在传统的GCC系统底下,或是类似[[Java|JAVA]]等后期編译才将IF編译成机器碼所使用的[[即時編译]](JIT)技术。它的型別系统包含基本型別([[整数计算机科学|整数]]或是[[浮点数]])及五个[[复合型別]]([[指针信息学|指标]]、[[数组]]、向量、结构及[[子程序|函数]]),在LLVM具体语言的型別建制可以以结合基本型別来表示,举例来說,C++所使用的class可以被表示为结构、函式及[[函数指针]]的陣列所組成。


LLVM JIT編译器可以最佳化在執行時期時程式所不需要的靜態分支,這在一些[[部份求值]](Partial Evaluation)的案例中相当有效,即当程式有許多选项,而在特定环境下其中多数可被判断为是不需要。這个特色被使用在[[Mac OS X Leopard]](v10.5)底下[[OpenGL]]的管线,当硬体不支援某个功能時依然可以被成功地运作<ref>{{cite web
LLVM JIT編译器可以最佳化在執行時期時程式所不需要的靜態分支,這在一些[[部份求值]](Partial Evaluation)的案例中相当有效,即当程式有許多选项,而在特定环境下其中多数可被判断为是不需要。這个特色被使用在[[Mac OS X Leopard]](v10.5)底下[[OpenGL]]的管线,当硬体不支援某个功能時依然可以被成功地运作<ref>{{cite web
第56行: 第56行:
|
|
|
|
}}</ref>。OpenGL堆栈下的绘图程式被編译为IR,接著在机器上執行時被編译,当系统拥有高阶[[GPU]]時,這段程式会进行极少的修改并将传遞指令給GPU,当系统拥有低阶的GPU時,LLVM将会編译更多的程序,使這段GPU无法執行的指令在本地端的[[中央处理器]]執行。LLVM增进了使用[[Intel GMA]]晶片等低端机器的效能。一个类似的系统发展于Gallium3D LLVMpipe,它已被合并到[[GNOME]],使其可运行在沒有GPU的环境<ref>Michael Larabel, [http://www.phoronix.com/scan.php?page=news_item&px=MTAxMjI "GNOME Shell Works Without GPU Driver Support"] , ''phoronix'', 6 November 2011</ref>。
}}</ref>。OpenGL堆栈下的绘图程式被編译为IR,接著在机器上執行時被編译,当系统拥有高阶[[图形处理器|GPU]]時,這段程式会进行极少的修改并将传遞指令給GPU,当系统拥有低阶的GPU時,LLVM将会編译更多的程序,使這段GPU无法執行的指令在本地端的[[中央处理器]]執行。LLVM增进了使用[[Intel GMA]]晶片等低端机器的效能。一个类似的系统发展于Gallium3D LLVMpipe,它已被合并到[[GNOME]],使其可运行在沒有GPU的环境<ref>Michael Larabel, [http://www.phoronix.com/scan.php?page=news_item&px=MTAxMjI "GNOME Shell Works Without GPU Driver Support"] , ''phoronix'', 6 November 2011</ref>。


根据2011年的一项测试,GCC在執行時期的性能平均比LLVM高10%<ref>{{cite web
根据2011年的一项测试,GCC在執行時期的性能平均比LLVM高10%<ref>{{cite web
第101行: 第101行:
|
|
|
|
}}</ref>,許多GCC的前端已經可以与其运行,LLVM目前支援[[Ada]]、[[C语言]]、[[C++]]、[[D语言]]、[[Fortran]]、[[Haskell]]、[[Julia (编程语言)|Julia]]、[[Objective-C]]、[[Rust]]及[[Swift (程式语言)|Swift]]的編译,它使用許多的編译器,有些来自4.0.1及4.2的[[GCC]]。
}}</ref>,許多GCC的前端已經可以与其运行,LLVM目前支援[[Ada]]、[[C语言]]、[[C++]]、[[D語言|D语言]]、[[Fortran]]、[[Haskell]]、[[Julia(编程语言|Julia]]、[[Objective-C]]、[[Rust]]及[[Swift (程式语言)|Swift]]的編译,它使用許多的編译器,有些来自4.0.1及4.2的[[GCC]]。


LLVM引发一些人来为許多语言开发新的編译器,其中一个最引发注意的就是[[Clang]],它是一个新的編译器,同時支援C、Objective-C以及C++。主要来自蘋果电脑的支持,Clang的目的用以取代GCC系统底下的C/Objective-C編译器,在当代的系统,他较为容易与[[集成开发环境]](IDE)整合,而且对于[[线程]]有更好的支援。Clang从3.8版本开始已经支持[[OpenMP]]<ref>{{cite web
LLVM引发一些人来为許多语言开发新的編译器,其中一个最引发注意的就是[[Clang]],它是一个新的編译器,同時支援C、Objective-C以及C++。主要来自蘋果电脑的支持,Clang的目的用以取代GCC系统底下的C/Objective-C編译器,在当代的系统,他较为容易与[[集成开发环境]](IDE)整合,而且对于[[线程]]有更好的支援。Clang从3.8版本开始已经支持[[OpenMP]]<ref>{{cite web
第133行: 第133行:
=== 中间端 ===
=== 中间端 ===


LLVM的核心是中间端表达式({{lang|en|Intermediate Representation}},IR),一种类似汇编的底层语言。IR是一种[[强类型]]的[[精简指令集]]({{lang|en|Reduced Instruction Set Computing}},RISC),并对目标指令集进行了抽象。例如,目标指令集的函数调用惯例被抽象为''call''和''ret''指令加上明确的参数。另外,IR采用无限个数的暂存器,使用如%0,%1等形式表达。LLVM支持三种表达形式:人类可读的汇编,在C++中对象形式和序列化后的bitcode形式。
LLVM的核心是中间端表达式({{lang|en|Intermediate Representation}},IR),一种类似汇编的底层语言。IR是一种[[强类型]]的[[精简指令集计算机|精简指令集]]({{lang|en|Reduced Instruction Set Computing}},RISC),并对目标指令集进行了抽象。例如,目标指令集的函数调用惯例被抽象为''call''和''ret''指令加上明确的参数。另外,IR采用无限个数的暂存器,使用如%0,%1等形式表达。LLVM支持三种表达形式:人类可读的汇编,在C++中对象形式和序列化后的bitcode形式。


例如,一个简单的[[Hello World]]程序可以表达为如下的汇编形式。对IR语言的完整描述请参考LLVM官方文档<ref>{{URL|http://llvm.org/docs/LangRef.html}}.</ref>:
例如,一个简单的[[Hello World]]程序可以表达为如下的汇编形式。对IR语言的完整描述请参考LLVM官方文档<ref>{{URL|http://llvm.org/docs/LangRef.html}}.</ref>:
第152行: 第152行:
=== 后端 ===
=== 后端 ===


至11.0版本,LLVM已经支持多种后端指令集,包括[[ARM]]、{{link-en|Qualcomm Hexagon}}、[[MIPS]]、[[Nvidia并行指令集]](LLVM中称为NVPTX),[[IBM POWER微处理器|PowerPC]]、[[AMD TeraScale]]<ref>{{cite mailing list |url=http://lists.llvm.org/pipermail/llvm-dev/2012-March/048409.html |title=[LLVMdev] RFC: R600, a new backend for AMD GPUs |mailinglist=llvm-dev |first=Tom |last=Stellard |date=March 26, 2012 |access-date=2019-02-18 |||}}</ref>、{{link-en|AMDGPU}}、[[SPARC]]、[[IBM Z|SystemZ]]、[[RISC-V]]、[[WebAssembly]]、[[x86]]、[[x86-64]]和[[XCore]]。
至11.0版本,LLVM已经支持多种后端指令集,包括[[ARM架構|ARM]]、{{link-en|Qualcomm Hexagon}}、[[MIPS]]、[[Nvidia并行指令集]](LLVM中称为NVPTX),[[IBM POWER微处理器|PowerPC]]、[[AMD TeraScale]]<ref>{{cite mailing list |url=http://lists.llvm.org/pipermail/llvm-dev/2012-March/048409.html |title=[LLVMdev] RFC: R600, a new backend for AMD GPUs |mailinglist=llvm-dev |first=Tom |last=Stellard |date=March 26, 2012 |access-date=2019-02-18 |||}}</ref>、{{link-en|AMDGPU}}、[[SPARC]]、[[IBM Z|SystemZ]]、[[RISC-V]]、[[WebAssembly]]、[[x86]]、[[x86-64]]和[[XCore]]。


LLVM包含一个专门的MC模块,将机器指令在文字形式和机器码形式间相互转换。在之前LLVM依靠系统或是平台专门的工具链将汇编翻译为机器码。LLVM机器码的集成汇编器已经支持绝大多数LLVM的目标平台。
LLVM包含一个专门的MC模块,将机器指令在文字形式和机器码形式间相互转换。在之前LLVM依靠系统或是平台专门的工具链将汇编翻译为机器码。LLVM机器码的集成汇编器已经支持绝大多数LLVM的目标平台。
第163行: 第163行:
=== C++标准库 ===
=== C++标准库 ===


LLVM项目包含一个C++标准库的实现(libcxx),具有[[MIT许可证]]和[[UIUC许可证]]的双许可协议。<ref>{{cite web|url=http://libcxx.llvm.org|title="libc++" C++ Standard Library|accessdate=2020-09-26|||}}</ref>
LLVM项目包含一个C++标准库的实现(libcxx),具有[[MIT许可协议|MIT许可证]]和[[UIUC许可证]]的双许可协议。<ref>{{cite web|url=http://libcxx.llvm.org|title="libc++" C++ Standard Library|accessdate=2020-09-26|||}}</ref>


== 另见 ==
== 另见 ==
第181行: 第181行:
* LLVM 2.0 Presentation —Google Tech Talk Presentation on LLVM 2.0
* LLVM 2.0 Presentation —Google Tech Talk Presentation on LLVM 2.0
* [http://arstechnica.com/apple/reviews/2009/08/mac-os-x-10-6.ars/9 Discussion of LLVM] by [[John Siracusa]] at [[Ars Technica]]
* [http://arstechnica.com/apple/reviews/2009/08/mac-os-x-10-6.ars/9 Discussion of LLVM] by [[John Siracusa]] at [[Ars Technica]]
* [http://www.aosabook.org/en/llvm.html LLVM内部结构](The Architecture of Open Source Applications, Volume II - ISBN 9781105571817)
* [http://www.aosabook.org/en/llvm.html LLVM内部结构](The Architecture of Open Source Applications, Volume II - ISBN 978-1-105-57181-7)
* [http://llvm.linuxfoundation.org/index.php/Main_Page LLVMLinux专案]
* [http://llvm.linuxfoundation.org/index.php/Main_Page LLVMLinux专案]