fbpx
维基百科

LLVM

LLVM是一套编译器基础设施项目,为自由软件,以C++寫成,包含一系列模块化的编译器组件和工具链,用来开发编译器前端后端。它是為了任意一種程式語言而寫成的程式,利用虛擬技術創造出編譯時期鏈結時期執行時期以及“閒置時期”的最佳化。

LLVM
開發者LLVM開發團隊
首次发布2003
目前版本
  • 16.0.2 (2023年4月19日)[1]
源代码库
  • github.com/llvm/llvm-project
编程语言C++
操作系统跨平台
类型編譯器
许可协议帶有LLVM例外的Apache许可证2.0
网站www.llvm.org

它最早以C/C++為實作對象,而目前它已支援包括ActionScriptAdaD語言FortranGLSLHaskellJava字节码、Objective-CSwiftPythonRubyCrystalRustScala[2]以及C#[3]等语言。

历史

LLVM專案的發展起源於2000年伊利诺伊大学厄巴纳-香槟分校維克拉姆·艾夫(Vikram Adve)與克里斯·拉特納(Chris Lattner)的研究,他們想要為所有靜態及動態語言創造出動態的編譯技術。LLVM是以BSD授權來發展的开源軟體。2005年,蘋果電腦雇用了克里斯·拉特納及他的團隊為蘋果電腦開發應用程式系統[4],LLVM為現今macOSiOS開發工具的一部分。

LLVM的命名最早源自於底層虛擬機器Low Level Virtual Machine)的首字母縮寫[5],由於這個專案的範圍並不侷限於建立一個虛擬機器,這個縮寫導致了廣泛的疑惑。LLVM開始成長之後,成為眾多編譯工具及低階工具技術的統稱,使得這個名字變得更不貼切,開發者因而決定放棄這個縮寫的意涵[6],現今LLVM已單純成為一個品牌,適用於LLVM下的所有專案,包含LLVM中介碼(LLVM IR)、LLVM除錯工具、LLVM C++標準函式庫等。

因LLVM對產業的貢獻,计算机协会於2012年将ACM软件系统奖授與維克拉姆·艾夫、克里斯·拉特納及Evan Cheng[7]

自9.0.0版本开始,LLVM使用带有LLVM额外条款的Apache许可证2.0进行授权[8]。而从2019年10月开始,LLVM项目的代码托管正式迁移到了GitHub[9]

描述

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

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

LLVM支援與語言無關的指令集架構類型系統[10]。每個在静态单赋值形式(SSA)的指令集代表著,每個變數(被稱為具有型別的暫存器)僅被賦值一次,這簡化了變數間相依性的分析。LLVM允許程式碼被靜態的編譯,包含在傳統的GCC系統底下,或是類似JAVA等後期編譯才將IF編譯成機器碼所使用的即時編譯(JIT)技術。它的型別系統包含基本型別(整數或是浮点数)及五個複合型別指標数组、向量、結構及函數),在LLVM具體語言的型別建制可以以結合基本型別來表示,舉例來說,C++所使用的class可以被表示為結構、函式及函数指针的陣列所組成。

LLVM JIT編譯器可以最佳化在執行時期時程式所不需要的靜態分支,這在一些部份求值(Partial Evaluation)的案例中相當有效,即當程式有許多選項,而在特定環境下其中多數可被判斷為是不需要。這個特色被使用在Mac OS X Leopard(v10.5)底下OpenGL的管線,當硬體不支援某個功能時依然可以被成功地運作[11]。OpenGL堆栈下的繪圖程式被編譯為IR,接著在機器上執行時被編譯,當系統擁有高階GPU時,這段程式會進行極少的修改並將傳遞指令給GPU,當系統擁有低階的GPU時,LLVM將會編譯更多的程序,使這段GPU無法執行的指令在本地端的中央处理器執行。LLVM增進了使用Intel GMA晶片等低端機器的效能。一個類似的系統發展於Gallium3D LLVMpipe,它已被合併到GNOME,使其可運行在沒有GPU的環境[12]

根據2011年的一项測試,GCC在執行時期的性能平均比LLVM高10%[13][14]。而2013年測試显示,LLVM可以編譯出接近GCC相同效能的執行碼[15]

編譯器

LLVM已经成为多个编译器和代码生成相关子项目的母项目。

前端

LLVM最初被用來取代GCC中的程式碼產生器[16],許多GCC的前端已經可以與其運行,LLVM目前支援AdaC语言C++D語言FortranHaskellJuliaObjective-CRustSwift的編譯,它使用許多的編譯器,有些來自4.0.1及4.2的GCC

LLVM引發一些人來為許多語言開發新的編譯器,其中一個最引發注意的就是Clang,它是一個新的編譯器,同時支援C、Objective-C以及C++。主要來自蘋果電腦的支持,Clang的目的用以取代GCC系統底下的C/Objective-C編譯器,在當代的系統,他較為容易與集成开发环境(IDE)整合,而且對於线程有更好的支援。Clang从3.8版本开始已经支持OpenMP[17]。GCC底下Objective-C的開發已經停滯,而蘋果電腦已經將其支援移至其他的維護分支。

Utrecht Haskell編譯器可以產生LLVM使用的程式碼,但它還在初期的開發階段,並且在許多案例,展示他比起C程式碼產生器擁有更好的效率[18]Glasgow Haskell Compiler(GHC)擁有一個可以運作的LLVM後端,程式執行效能對比起原先的編譯器可以達到30%的加速,它僅比一個由GHC所實現,並擁有多項最佳化技術的編譯器還慢[19]

還有其他的元件在不同的開發階段,包含(但不限於)Java bytecode[20]通用中间语言(CIL)、MacRuby(實現Ruby 1.9)、Standard ML及新的graph coloring暫存器配置. [來源請求]

中间端

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

例如,一个简单的Hello World程序可以表达为如下的汇编形式。对IR语言的完整描述请参考LLVM官方文档[21]

@.str = internal constant [14 x i8] c"hello, world\0A\00" declare i32 @printf(i8*, ...) define i32 @main(i32 %argc, i8** %argv) nounwind { entry:  %tmp1 = getelementptr [14 x i8], [14 x i8]* @.str, i32 0, i32 0  %tmp2 = call i32 (i8*, ...) @printf( i8* %tmp1 ) nounwind  ret i32 0 } 

后端

至11.0版本,LLVM已经支持多种后端指令集,包括ARMQualcomm Hexagon英语Qualcomm HexagonMIPS、Nvidia并行指令集(LLVM中称为NVPTX),PowerPC、AMD TeraScale[22]AMDGPU英语AMDGPUSPARCSystemZRISC-VWebAssemblyx86x86-64和XCore。

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

链接器

lld链接器子项目旨在为LLVM开发一个内置的,平台独立的链接器[23],去除对所有第三方链接器的依赖。在2017年5月,lld已经支持ELF、PE/COFF、 和Mach-O。在lld支持不完全的情况下,用户可以使用其他项目,如GNU ld链接器。 lld支持链接时优化。当LLVM链接时优化被启用时,LLVM可以输出bitcode而不是本机代码,而本机代码生成由链接器优化处理。

C++标准库

LLVM项目包含一个C++标准库的实现(libcxx),具有MIT许可证和UIUC许可证的双许可协议。[24]

另見

參考文獻

  1. ^ Release 16.0.2. 2023年4月19日 [2023年4月29日]. 
  2. ^ Reedy, Geoff. Compiling Scala to LLVM. St. Louis, Missouri, United States. 2012-09-24 [2013-02-19]. (原始内容于2020-11-29). 
  3. ^ Mono LLVM, [2013-03-10], (原始内容于2020-06-15) 
  4. ^ Adam Treat, mkspecs and patches for LLVM compile of Qt4 (页面存档备份,存于互联网档案馆
  5. ^ . [2011-12-22]. (原始内容存档于2012-01-17). 
  6. ^ . [22 December 2011]. (原始内容存档于2012年1月12日). 
  7. ^ . ACM. [2013-04-28]. (原始内容存档于2012-04-02). 
  8. ^ LLVM 9.0.0 License. [2020-11-14]. (原始内容于2020-11-11). 
  9. ^ Migration Proposal. [2020-11-14]. (原始内容于2020-11-25). 
  10. ^ LLVM Language Reference Manual. [16 April 2012]. (原始内容于2012-06-11). 
  11. ^ Chris Lattner. . LLVMdev mailing list. 15 August 2006 [26 October 2008]. (原始内容存档于2006年11月4日). 
  12. ^ Michael Larabel, "GNOME Shell Works Without GPU Driver Support" (页面存档备份,存于互联网档案馆), phoronix, 6 November 2011
  13. ^ V. Makarov. SPEC2000: Comparison of LLVM-2.9 and GCC4.6.1 on x86. [3 October 2011]. (原始内容于2020-08-03). 
  14. ^ V. Makarov. SPEC2000: Comparison of LLVM-2.9 and GCC4.6.1 on x86_64. [3 October 2011]. (原始内容于2020-08-03). 
  15. ^ Michael Larabel. LLVM/Clang 3.2 Compiler Competing With GCC. 27 December 2012 [31 March 2013]. (原始内容于2020-11-30). 
  16. ^ Lattner, Chris; Vikram Adve. Architecture For a Next-Generation GCC. First Annual GCC Developers' Summit. May 2003 [6 September 2009]. (原始内容于2020-07-07). 
  17. ^ Clang 3.8 Release Notes. [August 24, 2016]. (原始内容于2016-10-31). 
  18. ^ Compiling Haskell To LLVM (PDF). [26 June 2008]. (原始内容 (PDF)于2016-08-06). 
  19. ^ . [13 August 2010]. (原始内容存档于2011-06-25). 
  20. ^ Gaël Thomas; et al. VMKit: a substrate for virtual machines. LLVM.org. [2014-09-17]. (原始内容于2020-11-09).  VMKit 目前的开发已经停滞,并且只支持和 LLVM 3.3 协同编译。对更高版本的 LLVM,需要对源码做一些修改。VMKit 在编译时需要 LLVM 源码中的lib, include
  21. ^ llvm.org/docs/LangRef.html.
  22. ^ Stellard, Tom. [LLVMdev] RFC: R600, a new backend for AMD GPUs. llvm-dev (邮件列表). March 26, 2012 [2019-02-18]. (原始内容于2020-12-01). 
  23. ^ lld - The LLVM Linker. The LLVM Project. [May 10, 2017]. (原始内容于2020-12-29). 
  24. ^ . [2020-09-26]. (原始内容存档于2017-04-29). 

外部連結

llvm, 是一套编译器基础设施项目, 为自由软件, 以c, 寫成, 包含一系列模块化的编译器组件和工具链, 用来开发编译器前端和后端, 它是為了任意一種程式語言而寫成的程式, 利用虛擬技術創造出編譯時期, 鏈結時期, 執行時期以及, 閒置時期, 的最佳化, 開發者開發團隊首次发布2003目前版本16, 2023年4月19日, 源代码库github, llvm, llvm, project编程语言c, 操作系统跨平台类型編譯器许可协议帶有例外的apache许可证2, 0网站www, llvm, org它最早以c, . LLVM 是一套编译器基础设施项目 为自由软件 以C 寫成 包含一系列模块化的编译器组件和工具链 用来开发编译器前端和后端 它是為了任意一種程式語言而寫成的程式 利用虛擬技術創造出編譯時期 鏈結時期 執行時期以及 閒置時期 的最佳化 LLVM開發者LLVM開發團隊首次发布2003目前版本16 0 2 2023年4月19日 1 源代码库github wbr com wbr llvm wbr llvm project编程语言C 操作系统跨平台类型編譯器许可协议帶有LLVM例外的Apache许可证2 0网站www wbr llvm wbr org它最早以C C 為實作對象 而目前它已支援包括ActionScript Ada D語言 Fortran GLSL Haskell Java字节码 Objective C Swift Python Ruby Crystal Rust Scala 2 以及C 3 等语言 目录 1 历史 2 描述 3 編譯器 3 1 前端 3 2 中间端 3 3 后端 3 4 链接器 3 5 C 标准库 4 另見 5 參考文獻 6 外部連結历史 编辑LLVM專案的發展起源於2000年伊利诺伊大学厄巴纳 香槟分校維克拉姆 艾夫 Vikram Adve 與克里斯 拉特納 Chris Lattner 的研究 他們想要為所有靜態及動態語言創造出動態的編譯技術 LLVM是以BSD授權來發展的开源軟體 2005年 蘋果電腦雇用了克里斯 拉特納及他的團隊為蘋果電腦開發應用程式系統 4 LLVM為現今macOS及iOS開發工具的一部分 LLVM的命名最早源自於底層虛擬機器 Low Level Virtual Machine 的首字母縮寫 5 由於這個專案的範圍並不侷限於建立一個虛擬機器 這個縮寫導致了廣泛的疑惑 LLVM開始成長之後 成為眾多編譯工具及低階工具技術的統稱 使得這個名字變得更不貼切 開發者因而決定放棄這個縮寫的意涵 6 現今LLVM已單純成為一個品牌 適用於LLVM下的所有專案 包含LLVM中介碼 LLVM IR LLVM除錯工具 LLVM C 標準函式庫等 因LLVM對產業的貢獻 计算机协会於2012年将ACM软件系统奖授與維克拉姆 艾夫 克里斯 拉特納及Evan Cheng 7 自9 0 0版本开始 LLVM使用带有LLVM额外条款的Apache许可证2 0进行授权 8 而从2019年10月开始 LLVM项目的代码托管正式迁移到了GitHub 9 描述 编辑LLVM提供了一套适合编译器系统的中间语言 Intermediate Representation IR 有大量变换和优化都围绕其实现 经过变换和优化后的中间语言 可以转换为目标平台相关的汇编语言代码 LLVM可以和GCC工具链一起工作 允许它与为该项目编写的大量现有编译器一起使用 LLVM还可以在编译 链接时生成可重新定位的程式碼 Relocatable Code 甚至在运行时生成二进制机器码 LLVM的中间语言与具体的语言 指令集 类型系统无关 其中每条指令都是静态单赋值形式 SSA 即每个变量只能被赋值一次 这有助于简化变量之间的依赖分析 LLVM允许静态编译代码 或者通过实时编译 JIT 机制将中间表示转换为机器码 类似Java LLVM支援與語言無關的指令集架構及類型系統 10 每個在静态单赋值形式 SSA 的指令集代表著 每個變數 被稱為具有型別的暫存器 僅被賦值一次 這簡化了變數間相依性的分析 LLVM允許程式碼被靜態的編譯 包含在傳統的GCC系統底下 或是類似JAVA等後期編譯才將IF編譯成機器碼所使用的即時編譯 JIT 技術 它的型別系統包含基本型別 整數或是浮点数 及五個複合型別 指標 数组 向量 結構及函數 在LLVM具體語言的型別建制可以以結合基本型別來表示 舉例來說 C 所使用的class可以被表示為結構 函式及函数指针的陣列所組成 LLVM JIT編譯器可以最佳化在執行時期時程式所不需要的靜態分支 這在一些部份求值 Partial Evaluation 的案例中相當有效 即當程式有許多選項 而在特定環境下其中多數可被判斷為是不需要 這個特色被使用在Mac OS X Leopard v10 5 底下OpenGL的管線 當硬體不支援某個功能時依然可以被成功地運作 11 OpenGL堆栈下的繪圖程式被編譯為IR 接著在機器上執行時被編譯 當系統擁有高階GPU時 這段程式會進行極少的修改並將傳遞指令給GPU 當系統擁有低階的GPU時 LLVM將會編譯更多的程序 使這段GPU無法執行的指令在本地端的中央处理器執行 LLVM增進了使用Intel GMA晶片等低端機器的效能 一個類似的系統發展於Gallium3D LLVMpipe 它已被合併到GNOME 使其可運行在沒有GPU的環境 12 根據2011年的一项測試 GCC在執行時期的性能平均比LLVM高10 13 14 而2013年測試显示 LLVM可以編譯出接近GCC相同效能的執行碼 15 編譯器 编辑LLVM已经成为多个编译器和代码生成相关子项目的母项目 前端 编辑 LLVM最初被用來取代GCC中的程式碼產生器 16 許多GCC的前端已經可以與其運行 LLVM目前支援Ada C语言 C D語言 Fortran Haskell Julia Objective C Rust及Swift的編譯 它使用許多的編譯器 有些來自4 0 1及4 2的GCC LLVM引發一些人來為許多語言開發新的編譯器 其中一個最引發注意的就是Clang 它是一個新的編譯器 同時支援C Objective C以及C 主要來自蘋果電腦的支持 Clang的目的用以取代GCC系統底下的C Objective C編譯器 在當代的系統 他較為容易與集成开发环境 IDE 整合 而且對於线程有更好的支援 Clang从3 8版本开始已经支持OpenMP 17 GCC底下Objective C的開發已經停滯 而蘋果電腦已經將其支援移至其他的維護分支 Utrecht Haskell編譯器可以產生LLVM使用的程式碼 但它還在初期的開發階段 並且在許多案例 展示他比起C程式碼產生器擁有更好的效率 18 Glasgow Haskell Compiler GHC 擁有一個可以運作的LLVM後端 程式執行效能對比起原先的編譯器可以達到30 的加速 它僅比一個由GHC所實現 並擁有多項最佳化技術的編譯器還慢 19 還有其他的元件在不同的開發階段 包含 但不限於 Java bytecode 20 通用中间语言 CIL MacRuby 實現Ruby 1 9 Standard ML及新的graph coloring暫存器配置 來源請求 中间端 编辑 LLVM的核心是中间端表达式 Intermediate Representation IR 一种类似汇编的底层语言 IR是一种强类型的精简指令集 Reduced Instruction Set Computing RISC 并对目标指令集进行了抽象 例如 目标指令集的函数调用惯例被抽象为call和ret指令加上明确的参数 另外 IR采用无限个数的暂存器 使用如 0 1等形式表达 LLVM支持三种表达形式 人类可读的汇编 在C 中对象形式和序列化后的bitcode形式 例如 一个简单的Hello World程序可以表达为如下的汇编形式 对IR语言的完整描述请参考LLVM官方文档 21 str internal constant 14 x i8 c hello world 0A 00 declare i32 printf i8 define i32 main i32 argc i8 argv nounwind entry tmp1 getelementptr 14 x i8 14 x i8 str i32 0 i32 0 tmp2 call i32 i8 printf i8 tmp1 nounwind ret i32 0 后端 编辑 至11 0版本 LLVM已经支持多种后端指令集 包括ARM Qualcomm Hexagon 英语 Qualcomm Hexagon MIPS Nvidia并行指令集 LLVM中称为NVPTX PowerPC AMD TeraScale 22 AMDGPU 英语 AMDGPU SPARC SystemZ RISC V WebAssembly x86 x86 64和XCore LLVM包含一个专门的MC模块 将机器指令在文字形式和机器码形式间相互转换 在之前LLVM依靠系统或是平台专门的工具链将汇编翻译为机器码 LLVM机器码的集成汇编器已经支持绝大多数LLVM的目标平台 链接器 编辑 lld链接器子项目旨在为LLVM开发一个内置的 平台独立的链接器 23 去除对所有第三方链接器的依赖 在2017年5月 lld已经支持ELF PE COFF 和Mach O 在lld支持不完全的情况下 用户可以使用其他项目 如GNU ld链接器 lld支持链接时优化 当LLVM链接时优化被启用时 LLVM可以输出bitcode而不是本机代码 而本机代码生成由链接器优化处理 C 标准库 编辑 LLVM项目包含一个C 标准库的实现 libcxx 具有MIT许可证和UIUC许可证的双许可协议 24 另見 编辑 自由软件主题 Clang C C 編譯器 GNU lightning GNU Compiler Collection GCC OpenGL參考文獻 编辑 Release 16 0 2 2023年4月19日 2023年4月29日 Reedy Geoff Compiling Scala to LLVM St Louis Missouri United States 2012 09 24 2013 02 19 原始内容存档于2020 11 29 Mono LLVM 2013 03 10 原始内容存档于2020 06 15 Adam Treat mkspecs and patches for LLVM compile of Qt4 页面存档备份 存于互联网档案馆 存档副本 2011 12 22 原始内容存档于2012 01 17 Chris Lattner discusses the name LLVM 22 December 2011 原始内容存档于2012年1月12日 ACM Awards ACM 2013 04 28 原始内容存档于2012 04 02 LLVM 9 0 0 License 2020 11 14 原始内容存档于2020 11 11 Migration Proposal 2020 11 14 原始内容存档于2020 11 25 LLVM Language Reference Manual 16 April 2012 原始内容存档于2012 06 11 Chris Lattner A cool use of LLVM at Apple the OpenGL stack LLVMdev mailing list 15 August 2006 26 October 2008 原始内容存档于2006年11月4日 Michael Larabel GNOME Shell Works Without GPU Driver Support 页面存档备份 存于互联网档案馆 phoronix 6 November 2011 V Makarov SPEC2000 Comparison of LLVM 2 9 and GCC4 6 1 on x86 3 October 2011 原始内容存档于2020 08 03 V Makarov SPEC2000 Comparison of LLVM 2 9 and GCC4 6 1 on x86 64 3 October 2011 原始内容存档于2020 08 03 Michael Larabel LLVM Clang 3 2 Compiler Competing With GCC 27 December 2012 31 March 2013 原始内容存档于2020 11 30 Lattner Chris Vikram Adve Architecture For a Next Generation GCC First Annual GCC Developers Summit May 2003 6 September 2009 原始内容存档于2020 07 07 引文使用过时参数coauthors 帮助 Clang 3 8 Release Notes August 24 2016 原始内容存档于2016 10 31 Compiling Haskell To LLVM PDF 26 June 2008 原始内容存档 PDF 于2016 08 06 LLVM Project Blog The Glasgow Haskell Compiler and LLVM 13 August 2010 原始内容存档于2011 06 25 Gael Thomas et al VMKit a substrate for virtual machines LLVM org 2014 09 17 原始内容存档于2020 11 09 引文格式1维护 显式使用等标签 link VMKit 目前的开发已经停滞 并且只支持和 LLVM 3 3 协同编译 对更高版本的 LLVM 需要对源码做一些修改 VMKit 在编译时需要 LLVM 源码中的lib include llvm wbr org wbr docs wbr LangRef wbr html Stellard Tom LLVMdev RFC R600 a new backend for AMD GPUs llvm dev 邮件列表 March 26 2012 2019 02 18 原始内容存档于2020 12 01 lld The LLVM Linker The LLVM Project May 10 2017 原始内容存档于2020 12 29 libc C Standard Library 2020 09 26 原始内容存档于2017 04 29 外部連結 编辑LLVM計劃官方網站 页面存档备份 存于互联网档案馆 LLVM Project Blog 页面存档备份 存于互联网档案馆 LLVM A Compilation Framework for Lifelong Program Analysis amp Transformation 页面存档备份 存于互联网档案馆 a published paper by Chris Lattner and Vikram Adve LLVM Language Reference Manual 页面存档备份 存于互联网档案馆 describes the LLVM intermediate representation LLVM 2 0 Presentation 页面存档备份 存于互联网档案馆 Google Tech Talk Presentation on LLVM 2 0 Discussion of LLVM 页面存档备份 存于互联网档案馆 by John Siracusa at Ars Technica LLVM內部結構 页面存档备份 存于互联网档案馆 The Architecture of Open Source Applications Volume II ISBN 9781105571817 LLVMLinux專案 取自 https zh wikipedia org w index php title LLVM amp oldid 70969740, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。