国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

詳解三大編譯器:gcc、llvm 和 clang

開發(fā) 開發(fā)工具 新聞
傳統(tǒng)的編譯器通常分為三個部分,前端(frontEnd),優(yōu)化器(Optimizer)和后端(backEnd)。

 編譯器一般構成

傳統(tǒng)的編譯器通常分為三個部分,前端(frontEnd),優(yōu)化器(Optimizer)和后端(backEnd)。在編譯過程中,前端主要負責詞法和語法分析,將源代碼轉化為抽象語法樹;優(yōu)化器則是在前端的基礎上,對得到的中間代碼進行優(yōu)化,使代碼更加高效;后端則是將已經(jīng)優(yōu)化的中間代碼轉化為針對各自平臺的機器代碼。

GCC

GCC(GNU Compiler Collection,GNU編譯器套裝),是一套由 GNU 開發(fā)的編程語言編譯器。GCC 原名為 GNU C 語言編譯器,因為它原本只能處理 C語言。GCC 快速演進,變得可處理 C++、Fortran、Pascal、Objective-C、Java, 以及 Ada 等他語言。

[[350132]]

LLVM

LLVM (Low Level Virtual Machine,底層虛擬機) 提供了與編譯器相關的支持,能夠進行程序語言的編譯期優(yōu)化、鏈接優(yōu)化、在線編譯優(yōu)化、代碼生成。簡而言之,可以作為多種編譯器的后臺來使用。

蘋果公司一直使用 GCC 作為官方的編譯器。GCC 作為一款開源的編譯器,一直做得不錯,但 Apple 對編譯工具會提出更高的要求。原因主要有以下兩點:

其一,是 Apple 對 Objective-C 語言(包括后來對C語言)新增很多特性,但 GCC 開發(fā)者并不買Apple的賬——不給實現(xiàn),因此索性后來兩者分成兩條分支分別開發(fā),這也造成 Apple 的編譯器版本遠落后于 GCC 的官方版本。其二,GCC 的代碼耦合度太高,很難獨立,而且越是后期的版本,代碼質量越差,但 Apple 想做的很多功能(比如更好的 IDE 支持),需要模塊化的方式來調用 GCC,但 GCC一直不給做。

編譯器大神 Chris Lattner 橫空出世

2000年,本科畢業(yè)的 Chris Lattner 像中國多數(shù)大學生一樣,按部就班地考了GRE,最終前往UIUC(伊利諾伊大學厄巴納香檳分校),開始了艱苦讀計算機碩士和博士的生涯。在這階段,他不僅周游美國各大景點,更是翻爛了《Compilers: Principles, Techniques, and Tools》,成了GPA滿分(4.0) 牛人,并不斷地研究探索關于編譯器的未知領域,發(fā)表了一篇又一篇的論文,。他在碩士畢業(yè)論文里提出了一套完整的在編譯時、鏈接時、運行時甚至是在閑置時優(yōu)化程序的編譯思想,直接奠定了LLVM 的基礎。LLVM 在他念博士時更加成熟,使用GCC 作為前端來對用戶程序進行語義分析產(chǎn)生IF(Intermidiate Format),然后 LLVM 使用分析結果完成代碼優(yōu)化和生成。這項研究讓他在2005年畢業(yè)時就成為了業(yè)界小有名氣的編譯器專家,他也因此早早地被Apple 盯上,最終成為其編譯器項目的骨干。

剛進入 Apple,Chris Lattner 就大展身手:首先在 OpenGL 小組做代碼優(yōu)化,把 LLVM運行時的編譯架在 OpenGL 棧上,這樣OpenGL 棧能夠產(chǎn)出更高效率的圖形代碼。如果顯卡足夠高級,這些代碼會直接扔入GPU 執(zhí)行。但對于一些不支持全部OpenGL特性的顯卡(比如當時的Intel GMA卡),LLVM 則能夠把這些指令優(yōu)化成高效的 CPU指令,使程序依然能夠正常運行。這個強大的 OpenGL 實現(xiàn)被用在了后來發(fā)布的Mac OS X 10.5上。同時,LLVM的鏈接優(yōu)化被直接加入到 Apple 的代碼鏈接器上,而 LLVM-GCC也被同步到使用 GCC4.0 代碼。

[[350133]]

 

LLVM2.0 - Clang

Apple 吸收Chris Lattner的目的要比改進GCC代碼更具野心 -- Apple 打算從零開始寫 C、C++、Objective-C語言的前端 Clang,完全替代掉GCC。

Clang 是LLVM的前端,可以用來編譯C,C++,ObjectiveC等語言。Clang則是以LLVM為后端的一款高效易用,并且與IDE 結合很好的編譯前端。

Clang 只支持C,C++和Objective-C三種語言。2007年開始開發(fā),C編譯器最早完成,而由于Objective-C 只是C語言的一個簡單擴展,相對簡單,很多情況下甚至可以等價地改寫為C語言對Objective-C運行庫的函數(shù)調用,因此在2009年時,已經(jīng)完全可以用于生產(chǎn)環(huán)境。C++ 在后來也得到了支持。

[[350134]]

 

GCC 和 Clang 對比

  • Clang特性

速度快:通過編譯 OS X 上幾乎包含了所有 C 頭文件的 carbon.h 的測試,包括預處理 (Preprocess),語法 (lex),解析 (parse),語義分析 (Semantic Analysis),抽象語法樹生成 (Abstract Syntax Tree) 的時間,Clang 比 GCC 快2倍多。

內(nèi)存占用小:Clang 內(nèi)存占用是源碼的 130%,Apple GCC 則超過 10 倍。

診斷信息可讀性強:其中錯誤的語法不但有源碼提示,還會在錯誤的調用和相關上下文的下方有~~~~~和^的提示,相比之下 GCC 的提示很天書。

兼容性好:Clang 從一開始就被設計為一個API,允許它被源代碼分析工具和 IDE 集成。GCC 被構建成一個單一的靜態(tài)編譯器,這使得它非常難以被作為 API 并集成到其他工具中。

Clang有靜態(tài)分析,GCC沒有。

Clang使用BSD許可證,GCC使用GPL許可證。

詳解三大編譯器:gcc、llvm 和 clang

 
  • GCC 優(yōu)勢

支持 JAVA/ADA/FORTRAN

GCC 支持更多平臺

GCC 更流行,廣泛使用,支持完備

GCC 基于 C,不需要 C++ 編譯器即可編譯

GCC、LLVM 和 Clang 如何選擇?

目前不推薦使用老的GCC4.2,因為蘋果不會維持它了,而且LLVM-GCC看起來會更好。在項目中途改編譯選項可是一個大變動,需要慎重。

對新的項目而言,LLVM-GCC 看起來應該是個安全的選擇,蘋果公司認為它夠穩(wěn)定夠成熟,所以才把它當做Xcode 4的預設選項。而且,既然選項使用的是GCC parser,向后兼容性應該沒問題。

LLVM-GCC是個安全的選項,但并不是指Clang/LLVM比較不安全,只是成熟度還沒那么高效了。

總結 - 再探LLVM

回顧GCC的歷史,雖然它取得了巨大的成功,但開發(fā)GCC的初衷是提供一款免費的開源編譯器,僅此而已。可后來隨著GCC支持了越來越多的語言,GCC架構的問題也逐漸暴露出來。但GCC到底有什么問題呢?LLVM的優(yōu)點也正是GCC的缺點。傳統(tǒng)編譯器工作的時候前端負責解析源代碼,檢查語法錯誤,并將其翻譯為抽象的語法樹(Abstract Syntax Tree)。優(yōu)化器對這一中間代碼進行優(yōu)化,試圖使代碼更高效。后端則負責將優(yōu)化器優(yōu)化后的中間代碼轉換為目標機器的代碼,這一過程后端會最大化的利用目標機器的特殊指令,以提高代碼的性能。事實上,不光靜態(tài)語言如此,動態(tài)語言也符合上面這個模型,例如Java。JVM也利用上面這個模型,將Java代碼翻譯為Java bytecode。這一模型的好處是,當我們要支持多種語言時,只需要添加多個前端就可以了。當需要支持多種目標機器時,只需要添加多個后端就可以了。對于中間的優(yōu)化器,我們可以使用通用的中間代碼。這種三段式的結構還有一個好處,開發(fā)前端的人只需要知道如何將源代碼轉換為優(yōu)化器能夠理解的中間代碼就可以了,他不需要知道優(yōu)化器的工作原理,也不需要了解目標機器的知識。這大大降低了編譯器的開發(fā)難度,使更多的開發(fā)人員可以參與進來。雖然這種三段式的編譯器有很多優(yōu)點,并且被寫到了教科書上,但是在實際中這一結構卻從來沒有被完美實現(xiàn)過。做的比較好的應該屬Java和.NET虛擬機。虛擬機可以將目標語言翻譯為bytecode,所以理論上講我們可以將任何語言翻譯為bytecode,然后輸入虛擬機中運行。但是這一動態(tài)語言的模型并不太適合C語言,所以硬將C語言翻譯為bytecode并實現(xiàn)垃圾回收機制的效率是非常低的。GCC也將三段式做的比較好,并且實現(xiàn)了很多前端,支持了很多語言。但是上述這些編譯器的致命缺陷是,他們是一個完整的可執(zhí)行文件,沒有給其它語言的開發(fā)者提供代碼重用的接口。即使GCC是開源的,但是源代碼重用的難度也比較大。

LLVM最初的定位是比較底層的虛擬機。它的出現(xiàn)正是為了解決編譯器代碼重用的問題,LLVM一上來就站在比較高的角度,制定了LLVM IR這一中間代碼表示語言。LLVM IR充分考慮了各種應用場景,例如在IDE中調用LLVM進行實時的代碼語法檢查,對靜態(tài)語言、動態(tài)語言的編譯、優(yōu)化等。從上面這個圖中我們發(fā)現(xiàn)LLVM與GCC在三段式架構上并沒有本質區(qū)別。LLVM與其它編譯器最大的差別是,它不僅僅是Compiler Collection,也是Libraries Collection。舉個例子,假如說我要寫一個X語言的優(yōu)化器,我自己實現(xiàn)了PassX算法,用以處理X語言與其它語言差別最大的地方。而LLVM優(yōu)化器提供的PassA和PassB算法則提供了X語言與其它語言共性的優(yōu)化算法。那么我可以選擇X優(yōu)化器在鏈接的時候把LLVM提供的算法鏈接進來。LLVM不僅僅是編譯器,也是一個SDK。Apple LLVM compiler 4.2是一個真正的LLVM編譯器,前端使用的是Clang,基于最新的LLVM 3.2編譯的。LLVM GCC 4.2編譯器的核心仍然是LLVM,但是前端使用的是GCC 4.2編譯器。從LLVM的下載頁面可以看出,LLVM從1.0到2.5使用的都是GCC作為前端,直到2.6開始才提供了Clang前端。

如果你下載 LLVM 的代碼,那么它就是一個IR到ARM/機器碼的編譯器。比如bin/opt就是對IR的優(yōu)化器,bin/llc就是IR->ASM的翻譯,bin/llvm-mc就是匯編器。如果你再從http://llvm.org下載Clang,那么就有了C->IR的翻譯以及完整的編譯器Driver。GDB是GNU的調試器。只要編譯器支持DWARF格式,就可以用GDB調試。

 

責任編輯:張燕妮 來源: 今日頭條
相關推薦

2018-04-13 10:56:14

編譯器工具開發(fā)者

2022-11-24 13:05:27

ClangiOS

2017-09-01 11:35:37

C++語言編譯器

2016-12-12 14:19:59

LLVMClangApple

2011-01-06 11:36:00

linuxGCC編譯器

2012-05-11 11:32:52

英偉達CUDA編譯器

2018-03-06 14:33:21

Windows微軟編譯器

2010-02-26 13:43:36

Linux gcc

2016-08-31 16:39:59

PythonRC++

2019-06-14 08:35:14

華為禁令開發(fā)

2020-12-07 09:20:59

編譯器工具代碼

2018-12-17 16:54:50

開發(fā)者技能 Firefox

2009-07-07 09:14:53

Milepost GC編譯器

2012-08-01 14:18:19

IBMdW

2021-01-14 15:49:10

Linux 5.12GCC編譯器

2021-12-27 11:11:30

LLVMSPIR-V后端

2012-07-18 11:31:50

ibmdw

2021-09-28 09:34:35

聯(lián)發(fā)科編譯器GCC

2019-04-09 09:09:01

編程語言PythonC++

2021-04-25 18:09:53

Fedora 35編譯器開發(fā)
點贊
收藏

51CTO技術棧公眾號

成人激情开心网| 亚洲视频综合网| av网站在线免费播放| 性做久久久久久免费观看 | 亚洲欧美日韩另类精品一区二区三区 | 午夜成人免费视频| 2024短剧网剧在线观看| 一本一本久久a久久精品综合小说| jizz18欧美18| 日本中文字幕亚洲| 欧美xxxxxxxxx| 欧美一级一区二区| 日韩视频一区| 99热这里只有成人精品国产| 国产精品自产拍在线观看| 日韩五码在线| 99视频在线免费| 欧美色图天堂网| 成人短视频软件网站大全app| 69视频在线免费观看| 国产欧美午夜| 蜜桃免费在线视频| 91精品国产91久久综合桃花| 亚洲综合影院| 欧美一二三区| 亚洲激情五月婷婷| 偷拍视频一区二区三区| 成人免费福利在线| av电影天堂一区二区在线观看| 久蕉在线视频| 97在线免费观看| 美女视频黄a大片欧美| 情se视频网在线观看| 日韩一区二区福利| 亚洲一区日韩| 粉嫩欧美一区二区三区| 久久久久北条麻妃免费看| aa亚洲婷婷| 360天大佬第二季在线观看| 色七七影院综合| 丝袜美腿亚洲色图| 男男激情在线| 热久久这里只有| 2020日本不卡一区二区视频| 在线观看午夜av| 成人黄色在线播放| 国产精品午夜春色av| 欧美色片在线观看| 亚洲va韩国va欧美va精四季| 欧美日韩激情美女| 亚洲激情播播| 无码人妻精品一区二区三区66| 日韩精品福利在线| 香蕉久久国产| 午夜在线免费观看视频| 国产日韩av高清| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 色播亚洲婷婷| 日本精品免费观看高清观看| 日韩精品导航| 免费高清在线观看免费| 亚洲欧美国内爽妇网| 水野朝阳av一区二区三区| 欧美高清xxxxxkkkkk| 97久久久久久| 国产婷婷色一区二区三区| 欧美黄色成人| 全黄性性激高免费视频| 国产丝袜一区视频在线观看| 日本欧美一区二区在线观看| 欧美性天天影视| 国产精品一区二区欧美| 色综合久久综合网97色综合| 久久在线电影| 国产在线中文字幕| 国产伦精品一区二区三毛| 色婷婷av一区二区| 国自产拍偷拍福利精品免费一 | 久久久久免费精品国产| 丁香婷婷综合五月| **欧美日韩在线观看| 精品日韩在线播放| 亚洲欧洲美洲在线综合| 国产成人高清在线| 国产精品xxx| 欧美 日韩精品| 国外色69视频在线观看| 国产精品蜜臀av| 亚洲精品国模| 最新中文字幕在线观看| 91日韩在线视频| 欧美日精品一区视频| 久久久久在线| 成人短视频app| 啊啊啊一区二区| 韩国三级电影久久久久久| 亚洲乱码国产乱码精品精可以看| 国内精品视频在线观看| 免费在线国产| 日韩视频在线观看国产| 国产一区二区三区在线观看视频| 91麻豆精品一区二区三区| 老牛精品亚洲成av人片| 九草视频在线观看| 久久久久久九九| 亚洲精品在线视频| 久久精品一区八戒影视| 欧美天堂影院| 九色网友自拍视频手机在线| 欧美一区二区高清在线观看| 亚洲人成网站777色婷婷| 久久九九国产精品| 欧美顶级大胆免费视频| 国产秀色在线www免费观看| 国产一二三四区在线观看| 欧美成人免费全部观看天天性色| 亚洲伦在线观看| 中文一区二区| 看片一区二区| 又黄又爽在线免费观看| 欧美凹凸一区二区三区视频| 亚洲欧美国产精品| 亚洲免费成人av| 亚洲激情欧美| 日韩有码欧美| 先锋av资源在线| 国产又大又长又粗又黄| 久久乐国产精品| 欧美三级视频在线| 不卡的av电影| 欧美成人亚洲| 久久精品xxxxx| 天堂av电影在线观看| 宅男噜噜99国产精品观看免费| 欧美精品在线看| 在线观看亚洲a| 97久久超碰国产精品| 欧美有码视频| 国产精品va视频| yiren22综合网成人| 日韩精品一区二区免费| 国产精品入口免费视| 亚洲国产成人在线播放| 亚洲免费大片在线观看| 久久99久久99| 欧美a级成人淫片免费看| 午夜精品成人av| 日本福利片在线| 自慰无码一区二区三区| 国产精品一区二区你懂得| 九九精品在线观看| 制服丝袜在线91| 国产精品少妇自拍| 青娱乐精品视频| 成人看的视频| av日韩在线免费观看| 免费网站看v片在线a| 先锋成人影音| 中文字幕在线中文| 国产精华一区| 欧美中文在线观看| 国产亚洲成av人片在线观看桃| 欧美性猛交xxxxx免费看| 99国产欧美另类久久久精品| 国产色综合网| 欧美日韩一区二区三区视频播放| 久久毛片亚洲| 在线观看美女网站大全免费| 四虎黄色影院| 国产美女在线一区| 日韩精品大片| 97人人模人人爽视频一区二区| 欧美黑人性视频| 亚洲精品视频网上网址在线观看 | 欧美精品在线一区| 日韩免费精品视频| 久久视频中文字幕| 亚洲成人久久电影| 欧美日韩亚洲丝袜制服| 亚洲一区二区视频在线| 久久综合色8888| 久久99精品一区二区三区三区| 好看的亚洲午夜视频在线| 少妇精品久久久一区二区| 97色婷婷成人综合在线观看| 爱啪视频在线观看视频免费| av小片在线| 午夜成人影视| ga∨成人网| 欧美r片在线| 免费成人看片| 国产精品igao| 人人妻人人添人人爽欧美一区| 亚洲一区精彩视频| 欧美不卡1区2区3区| 成人永久免费| 国产综合在线观看视频| 国产成人91久久精品| 欧美一级在线亚洲天堂| 992tv成人免费视频|