日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LLVM架构详述

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LLVM架构详述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 什么是LLVM?
  • 傳統編譯器架構
  • LLVM架構
  • 什么是Clang?
    • 詞法分析
    • 語法分析
    • LLVM IR
  • 源碼下載

什么是LLVM?

LLVM項目時模塊化,可重用的編譯器以及工具鏈技術的集合

美國計算機協會(ACM)將其2012年軟件系統獎項頒給了LLVM,之前曾經獲得此獎的軟件和技術包括Java,Apache,Mosaic,the World Wide Web,Smalltalk,UNIX,Eclipse等等

創始人:
Chris Lattner,亦是Swift之父

有些文章把LLVM當做Low Level virtual Machine(低級虛擬機)的縮寫簡稱,官方描述如下:
The name “LLVM” itself is not an acronym;it is the full name of the project

“LLVM”這個名稱本身不是首字母縮略詞,它是項目的全名

傳統編譯器架構


Frontend:前端
詞法分析,語法分析,語義分析,生成中間代碼

Optimizer:優化器

Backend:后端
生成機器碼

LLVM架構


不同的前端后端使用同一的中間代碼LLVM Intermediate Representation(LLVM IR)

如果需要支持一種新的編程語言,那么只需要實現一個新的前端

如果需要支持一種新的硬件設備,那么只需要實現一個新的后端

優化階段是一個通用的階段,它針對的是統一的LLVM IR不論是支持新的編程語言,還是支持新的硬件設備,都不需要對優化階段做修改

相比之下,GCC的前端和后端沒分得太開,前端后端耦合在一起,所以GCC為了支持一門新語言,或者為了支持一個新的目標平臺,就變得特別困難

LLVM現在被作為實現各種靜態和運行時編譯語言的通用基礎結構 (GCC家族,Java,.NET,python,Ruby,Scheme,Haskell,D等)

什么是Clang?

LLVM項目的一個子項目
基于LLVM架構的c/c++/Objective-C編譯器前端
官網:http://clang.llvm.org/

相比于GCC,Clang具有如下優點

  • 編譯速度快:在某些平臺上,Clang的編譯速度顯著的快過GCC(Debug模式下編譯OC速度比GCC快3倍)
  • 占用內存小:Clang生成的AST(語法書)所占用的內存時GCC五分之一
  • 模塊化設計:Clang采用基于庫的模塊化設計,易于IDE集成及其他用途的重用
  • 診斷信息可讀性強:在編譯過程中,Clang創建并保留了大量詳細的元數據(metadata),有利于調試和錯誤分析
  • 設計清晰簡單,容易理解,易于擴展增強

  • 廣義的LLVM
    整個LLVM架構

    狹義的LLVM
    LLVM后端(代碼優化,目標代碼生成等)

    詞法分析

    詞法分析,生成Token:

    $ clang -fmodules -E -Xclang -dump -tokens main.m

    舉例

    void test(int a ,int b){ int c=a+b-3; }


    拆分成一個一個token,把每個東西一個一個地分割開,右邊13:9代表第13行第九個字符

    語法分析

    語法分析:生成語法樹(AST,Abstract SyntaxTree):

    $ clang -fmodules -fsyntax -only -Xclang -ast-dump main.m

    舉例

    void test(int a ,int b){ int c=a+b-3; }


    LLVM IR

    LLVM IR 有3種形式(但本質是等價的,就好比水可以有氣體,液體,固體3種形態)
    1.text:便于閱讀的文本格式,類似于匯編語言,拓展名.II

    $ clang -S -emit -llvm main.m

    舉例:

    void test(int a ,int b){ int c=a+b-3; }

    2.memory:內存格式
    3.bitcode:二進制格式,拓展名.bc

    $ clang -c -emit -llvm main.m

    IR基本語法:
    注釋以分號;開頭
    全局標識符以@開頭,局部標識符以%開頭
    alloca:在當前函數中棧幀中分配內存
    i32:32bit,4個字節的意思
    align:內存對齊
    store:寫入數據
    load:讀取數據

    官方語法參考:https://llvm.org/docs/LangRef.html

    源碼下載

    下載LLVM

    $ git clone https://git.llvm.org/git/llvm.git/

    大小648.2M,僅供參考

    下載clang

    $ cd llvm/tools $ git clone https://git.llvm.org/git/clang.git/

    大小240.6M,僅供參考

    源碼編譯
    安裝cmake和ninja(先安裝brew,https://brew.sh/)

    $ brew install cmake $ brew install ninja

    ninja如果安裝失敗,可以直接從github獲取release版放入[/user/local/bin]中
    https://github.com/ninja-build/ninja/releases

    在LLVM源碼同級目錄下新建一個[llvm_build]目錄(最終會在[llvm_build]目錄下生成[build.ninja])

    $ cd llvm_build $ cmake -G Ninja ../llvm -DCMAKE_INSTALL_PREFIX=LLVM的安裝路徑

    舉例:

    更多cmake相關選項,可以參考:https://llvm.org/docs/CMake.html

    依次執行編譯,安裝指令

    $ ninja

    編譯完畢后,llvm_build 目錄大概21.05G

    $ ninja install

    安裝完畢后,安裝目錄大概11.92G

    應用與實踐:
    官方參考:https://clang.llvm.org/docs/Tooling.html
    應用:語法樹分析,語言轉換

    Clang插件開發
    官方參考
    https://clang.llvm.org/docs/ClangPlugins.html
    https://clang.llvm.org/docs/ExternalClangExamples.html
    https://clang.llvm.org/docs/RVAFrontendAction.html

    應用:代碼檢查(命名規范,代碼規范)等

    Pass開發(進行中間代碼優化)
    官方參考:https://llvm.org/docs/WritingAnLLVMPass.html
    應用:代碼優化,代碼混淆等

    開發新的編程語言
    https://llvm-tutorial-cn.readthedocs.io/en/latest/index.html
    https://kaleidoscope-llvm-tutorial-zh-cn.readthedocs.io/zh_CN/latest/

    總結

    以上是生活随笔為你收集整理的LLVM架构详述的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。