clang編譯器簡介

2020-10-08 異步社區

什麼是clang編譯器?

clang是LLVM編譯器工具集的一個用於編譯C、C++、Objective-C的前端。LLVM項目的目標是提供一個GNU編譯器套裝(gcc)的替代品,由蘋果公司的贊助開發,其原始碼授權採用的是類BSD的伊利諾伊大學厄巴納-香檳分校開源碼許可。

clang編譯器的優勢與劣勢

相比於gcc,clang具有如下優點:

  • 編譯速度更快:在某些平臺上,clang的編譯速度要明顯快於gcc。
  • 佔用內存更小:clang生成的AST所佔用的內存通常是gcc的五分之一左右。
  • 模塊化的設計:clang採用基於庫的模塊化設計,更易於IDE的集成及其他用途的重用。
  • 診斷信息可讀性強:在編譯過程中,clang會創建並保留大量詳細的元數據 (metadata),這將更有利於調試和錯誤報告。
  • 設計更清晰簡單,容易理解,易於擴展加強。與代碼基礎較為古老的gcc相比,學習曲線會顯得更為平緩。

當前 Clang 還處在不斷完善過程中,相比於gcc, clang在以下方面還需要加強:

  • 需要支持更多語言:gcc除了支持 C/C++/Objective-C, 還支持Fortran/Pascal/Java/Ada/Go等其他語言。clang 目前基本上只支持C/C++/Objective-C/Objective-C++這四種語言。
  • 需要加強對C++的支持:clang對C++的支持依然落後於gcc,clang 還需要加強對C++ 提供全方位支持。
  • 需要支持更多平臺:由於gcc流行的時間比較長,已經被廣泛使用,對各種平臺的支持也很完備。clang目前支持的平臺有 Linux/Windows/Mac OS。

安裝LLVM + clang

二進位安裝

  • Windows環境: 可以從http://llvm.org/releases/下載相應的安裝包進行安裝。目前最新版本為3.8。
  • cygwin下的apt-cyg:apt-cyg install clang
  • Linux下的yum:sudo yum install clang
  • Linux下的apt-get(有時候需要自己配置一下相關的軟體源):sudo apt-get install clang-3.4 clang-3.4-doc libclang-common-3.4-dev libclang-3.4-devlibclang1-3.4 libclang1-3.4-dbg libllvm-3.4-ocaml-dev libllvm3.4 libllvm3.4-dbg lldb-3.4 llvm-3.4 llvm-3.4-dev llvm-3.4-doc llvm-3.4-examples llvm-3.4-runtime clang-modernize-3.4 clang-format-3.4 python-clang-3.4 lldb-3.4-dev

源碼安裝

  • 第一步,下載llvm代碼:git clone git@github.com:llvm-mirror/llvm.git
  • 第二步,進入llvm/tools目錄並下載clang代碼cd llvm/tools git clone git@github.com:llvm-mirror/clang.git
  • 第三步,進入llvm/projects目錄並下載compiler-rt代碼:cd ../projects git clone git@github.com:llvm-mirror/compiler-rt.git
  • 第四步,在llvm所在目錄新建與llvm同一級的目錄build,並在其中構建llvm和clang:cd ../.. mkdir build cd build ../llvm/configure --enable-optimized --enable-assertions make make install

使用clang編譯C程序

clang的用法與gcc基本相同,我們可以寫一個腳本來驗證一下編譯器是否已經安裝完成:

import osimport sysimport shutilif not len(sys.argv) in range(2, 3): print("Usage: hello_c.py <compiler>") exit(1)code = "#include <stdio.h>\n int main(void) { printf(\"hello world!\\n\"); return 0;} "if(not os.path.exists("example")): os.mkdir("example")file = open(r"example/hello.c",'w')file.writelines(code)file.close()cmd = sys.argv[1] + r" example/hello.c -o example/test.exe"os.system(cmd)os.system(r"example/test.exe")if(os.path.exists("example")): shutil.rmtree("example")

然後,我們只需要在shell中輸入python hello_c.py clang即可,如果看到輸出一行「hello world」說明編譯器已經可以正常工作。

相關焦點

  • 編譯器Clang會代替GCC嗎?
    GCC(特別是其中的C語言編譯器)也常被認為是跨平臺編譯器的事實標準。1985年由理察·馬修·斯託曼開始發展,現在由自由軟體基金會負責維護工作。GCC原本用C開發,後來因為LLVM、Clang的崛起,它更快地將開發語言轉換為C++。
  • 基於C++ 語言庫的GCC和Clang編譯器基準測試報告(ETL)
    我將測試以下編譯器: GCC-4.9.4 GCC-5.4.0 GCC-6.3.0 GCC-7.1.0 clang-3.9.1 clang-4.0.1 zapcc-1.0 (商業版,基於 clang-5.0 主分支) 所有這些都是直接使用 Portage(Gentoo 軟體包管理器
  • LLVM/Clang 3.4 final 代碼發布
    LLVM 核心庫提供了與編譯器相關的支持,可以作為多種語言編譯器的後臺來使用。能夠進行程序語言的編譯期優化、連結優化、在線編譯優化、代碼生成。LLVM的項目是一個模塊化和可重複使用的編譯器和工具技術的集合。LLVM是伊利諾伊大學的一個研究項目,提供一個現代化的,基於SSA的編譯策略能夠同時支持靜態和動態的任意程式語言的編譯目標。
  • 在Visual Studio中使用clang-tidy進行代碼分析
    關於clang-tidy在最新的VS2019 v16.4 Preview 1中,我們為C++代碼分析功能帶來了重量級更新,其中包括:clang-tidy原生支持。這裡所說的clang-tidy,實際上是LLVM團隊開發的一個基於Clang的」linter」工具。它帶來了多項代碼改進: 語言的現代化及標準符合性,靜態分析和自動格式化等。
  • linux下Clang和gcc的區別
    Clang 比 GCC 編譯器的優勢:編譯速度更快編譯產出更小出錯提示更友 好,比如 clang 在編譯過程可以直接指出相對簡單的出錯位置以及它內置有靜態分析工具,可以對代碼進行靜態分析 (clang—analyze) 。這也是 gcc 做不到的 。專注,因為 clang 只需要完成詞法和語法分析,代碼優化和機器代碼的生成工作由 llvm 完成。所以和全部由自己包下的 gcc 比起來, clang 可以更專注地做好一件事。
  • clang/llvm 已經完全實現 OpenMP 3.1 支持
    OpenMP 3.1 在 clang/llvm 編譯器上的功能完全實現!OpenMP 3.1標準於2011年獲得批准,它支持幾乎所有的跨核和多處理器系統,並且有良好的性能與可移植性。OpenMP支持的程式語言包括 C 語言、C++和 Fortran;而支持OpenMP 的編譯器包括 Sun  Compiler,GNU Compiler 和 Intel  Compiler 等。OpenMP 提供了對並行算法的高層的抽象描述,程式設計師通過在原始碼中加入專用的 pragma 來指明自己的意圖,由此編譯器可以自動 將程序進行並行化,並在必要之處加入同步互斥以及通信。
  • 華為方舟編譯器深入解讀:已有45款第三方應用
    本次方舟編譯器開源的是編譯器框架部分源碼,包括編譯器中間表示(IR)和語言編譯實現,同時搭配編譯器其他二進位組件,實現Java程序到aarch64彙編指令的編譯過程。開發者可基於開原始碼+二進位,編譯構建出編譯器工具鏈,嘗試對Java程序進行編譯。
  • SEGGER編譯器會是一個新的「Clang」嗎?
    然後,還有我們知道Keil、 IAR等IDE都集成了特定的編譯器。 一、關於SEGGER編譯器 可能很多人都知道SEGGER有一個集成開發工具,叫做Embedded Studio,這個工具使用的編譯器就是Clang / LLVM和GCC C/C++編譯器。 SEGGER編譯器其實是一個很神秘的東西,至今尚未公開正式版。
  • 詳解三大編譯器:gcc、llvm 和 clang
    編譯器一般構成  傳統的編譯器通常分為三個部分,前端(frontEnd),優化器(Optimizer)和後端(backEnd)。  GCC  GCC(GNU Compiler Collection,GNU編譯器套裝),是一套由 GNU 開發的程式語言編譯器。GCC 原名為 GNU C 語言編譯器,因為它原本只能處理 C語言。GCC 快速演進,變得可處理 C++、Fortran、Pascal、Objective-C、Java, 以及 Ada 等他語言。
  • C/C++主流編譯器推薦
    C/C++主流編譯器(非IDE集成開發環境)推薦GCCGCC(GNU Compiler Collection,GNU編譯器集合)包括C,C ++,WindowsCPU支持:Intel x86官網:/LLVM + ClangLLVM(Low Level Virtual Machine)是模塊化和可重用的編譯器及工具鏈技術的集合
  • Keil MDK 編譯器 AC5 和 AC6 優化選項重要內容和區別
    Arm Compiler 6工具鏈包括: armclang:基於LLVM和Clang技術的編譯器和集成彙編器。 armasm:armasm語法彙編代碼的舊版彙編程序。將armclang集成彙編程序用於所有新的彙編文件。
  • 團隊協作-代碼格式化工具clang-format
    的用法2.1 clang-format style參數簡介自帶代碼格式目前支持:LLVM, Google, Chromium, Mozilla, WebKitclang-format -i --style=Google <file>
  • Clang可以編譯Chromium了
    Nico Weber在Clang的maillist裡發布了條可喜消息,clang已經能成功編譯chromium。Clang是LLVM的前端,前不久實現了C語言的自舉,最近又成功編譯了chromium,而且沒有運行問題,可喜可賀。編譯使用的版本clang r116145,平臺MacBook Pro 4G內存,I5處理器.
  • Windows 版本的 Chrome 停用微軟的編譯器 改用 Clang
    PingWest品玩3月6日報導,根據LLVM項目博客的消息,Google 的 Chrome 在 Windows 平臺開始使用 Clang 編譯器,而之前它使用的是微軟的 Microsoft C++編譯器。
  • 緩存型 C++ 編譯器 Zapcc 開源,號稱比 Clang 更快
    還記得 Zapcc 編譯器嗎?一個旨在減少編譯時間的編譯器,現在已正式開源。
  • 官宣:VS2019 Clang/LLVM對MSbuild工程的支持
    開發團隊在其博文中也比較務實:」在大部分情況下,我們推薦我們的用戶使用MSVC編譯器,我們也致力於提供」宇宙最強」IDE,但是,我們的用戶可能為了編寫跨平臺代碼而選擇Clang,尤其是那些編寫已經依賴Clang或者GCC擴展的代碼的用戶」。
  • FreeBSD 10 將使用 Clang 編譯器替換 GCC
    來自 phoronix 的消息稱,根據 FreeBSD 2012 第一季度的狀態報告 顯示,來自 LLVM 的 Clang 編譯器將成為 FreeBSD 10 的默認 C/C++ 編譯器,廢棄使用
  • FreeBSD 10將使用Clang編譯器替換GCC
    來自 phoronix 的消息稱,根據 FreeBSD 2012 第一季度的狀態報告 顯示,來自 LLVM 的 Clang 編譯器將成為 FreeBSD 10 的默認 C/C++ 編譯器,廢棄使用 GPL 授權協議的 GCC,而 Clang 的授權協議是 BSD。
  • 棄用微軟 C++ 編譯器,Win 版 Chrome 改用 Clang
    這也意味著,所有平臺的 Chrome 現已全部使用相同的編譯器,包括 macOS、iOS、Linux、Chrome OS、Android 和 Windows 。此前,Windows 版的 Chrome 使用的是微軟的 Microsoft C++ 編譯器。
  • C編譯器小家族之C編譯器各顯神通
    C/C++編譯器有哪些?主流C/C++編譯器|編譯環境簡介MSVCMSVC是微軟Windows平臺Visual Studio自帶的C/C++編譯器。優點:對Windows平臺支持好,編譯快。缺點:對C++的新標準支持得少。