日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 嵌入式 > 技術(shù)讓夢(mèng)想更偉大
[導(dǎo)讀]關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容來(lái)源|技術(shù)讓夢(mèng)想更偉大整理?|?李肖遙很多時(shí)候,出現(xiàn)一些類似GNU,GCC,CLANG,LLVM等與編譯器有關(guān)的名詞的時(shí)候,都不太清楚它到底是干嘛的,理解這些東西后,對(duì)于xcode中很多配置型的需求修改起來(lái)都會(huì)得心應(yīng)手,因此有必要了解透徹他們直接的關(guān)...

關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容


來(lái)源 | 技術(shù)讓夢(mèng)想更偉大


整理 | 李肖遙



很多時(shí)候,出現(xiàn)一些類似GNU,GCC,CLANG,LLVM等與編譯器有關(guān)的名詞的時(shí)候,都不太清楚它到底是干嘛的,理解這些東西后,對(duì)于xcode中很多配置型的需求修改起來(lái)都會(huì)得心應(yīng)手,因此有必要了解透徹他們直接的關(guān)系與區(qū)別。


1,GNU

先看看wiki百科上的官方說(shuō)明:


“GNU,名稱來(lái)自Gnu's Not Unix"的縮寫,一個(gè)類UNIX的操作系統(tǒng),由GNU計(jì)劃推動(dòng),目標(biāo)在于創(chuàng)建一個(gè)完全兼容于UNIX的自由軟件環(huán)境?!?


由于當(dāng)時(shí)UNIX系統(tǒng)是商業(yè)軟件,是收費(fèi)的,而且有一部分源碼是沒(méi)有開放的,所以在1983年,理查德·斯托曼提出GNU計(jì)劃,希望發(fā)展出一套完整的開放源代碼操作系統(tǒng)來(lái)取代Unix,計(jì)劃中的操作系統(tǒng),名為GNU。


因此,GNU的出現(xiàn)的目的就是為了取代UNIX系統(tǒng)。


但是操作系統(tǒng)是包括很多軟件的,除了操作系統(tǒng)內(nèi)核之外,還要有編輯器,編譯器,shell等等一些軟件來(lái)支持。


1989年,GNU項(xiàng)目中的其他部份,如編輯器、編譯器、shell等都已經(jīng)完成,獨(dú)缺操作系統(tǒng)核心。1990年,自由軟件基金會(huì)開始正式發(fā)展Hurd,作為GNU項(xiàng)目中的操作系統(tǒng)。


注意:linux并不是GNU計(jì)劃的一部分。linux只是使用了許多GNU計(jì)劃軟件(包括GCC編譯器,文本編譯器等)。


1991年,Linux出現(xiàn),所有GNU項(xiàng)目中,運(yùn)行于用戶空間的軟件,都可以在Linux上使用。許多開發(fā)者轉(zhuǎn)向于Linux,Linux成為常見的GNU計(jì)劃軟件運(yùn)行平臺(tái)。理查德·斯托曼主張,Linux操作系統(tǒng)使用了許多GNU計(jì)劃軟件,應(yīng)正名為GNU/Linux,但沒(méi)有得到Linux社區(qū)的一致認(rèn)同,形成GNU/Linux命名爭(zhēng)議。


1992年,Linux與其他GNU軟件結(jié)合,完全自由的操作系統(tǒng)正式誕生。許多程序員參與了Linux的開發(fā)與修改,也經(jīng)常將Linux當(dāng)成開發(fā)GNU計(jì)劃軟件的平臺(tái)。該操作系統(tǒng)往往被稱為“GNU/Linux”或簡(jiǎn)稱Linux。但Linux本身不屬于GNU計(jì)劃的一部份,GNU計(jì)劃自己的內(nèi)核Hurd依然在開發(fā)中,但直到2013年為止,都還沒(méi)有穩(wěn)定版本發(fā)布。


GNU工程十幾年以來(lái)已經(jīng)成為一個(gè)對(duì)軟件開發(fā)主要的影響力量,創(chuàng)造了無(wú)數(shù)的重要的工具,例如:強(qiáng)健的編譯器,有力的文本編輯器,甚至一個(gè)全功能的操作系統(tǒng)。這個(gè)工程是從1984年麻省理工學(xué)院的程序員理查德·斯托曼的想法得來(lái)的,他想要?jiǎng)?chuàng)建一個(gè)自由的、和UNIX類似的操作環(huán)境。從那時(shí)開始,許多程序員聚集起來(lái)開始開發(fā)一個(gè)自由的、高質(zhì)量、易理解的軟件。


GNU計(jì)劃采用了部分當(dāng)時(shí)已經(jīng)可自由使用的軟件,例如TeX排版系統(tǒng)和X Window視窗系統(tǒng)等。不過(guò)GNU計(jì)劃也開發(fā)了大批其他的自由軟件,這些軟件也被移植到其他操作系統(tǒng)平臺(tái)上,例如Microsoft Windows、BSD家族、Solaris及Mac OS。


許多UNIX系統(tǒng)上也安裝了GNU軟件,因?yàn)镚NU軟件的質(zhì)量比之前UNIX的軟件還要好。


所以,GNU計(jì)劃中的許多軟件目前在所有的操作系統(tǒng)中都應(yīng)用廣泛(Unix,mac,linux,windows,bsd...),最出名的就是GCC了


總結(jié)

GNU計(jì)劃本來(lái)是為了開發(fā)一個(gè)自由系統(tǒng)來(lái)取代UNIX的,但是由于開發(fā)的內(nèi)核hurd一直不怎么樣,這個(gè)系統(tǒng)至今都沒(méi)出穩(wěn)定版本,然而GNU計(jì)劃中開發(fā)的其他一些自由軟件,比如GCC編譯器,卻非常的好,在移植到各大操作系統(tǒng)上一直廣泛使用至今。


注意一點(diǎn)

文中說(shuō)的自由軟件,千萬(wàn)別與免費(fèi)軟件混淆了,自由是說(shuō)你可以自由的使用,當(dāng)然前提是獲得了源碼才能自由的使用。


比如,你在一個(gè)應(yīng)用里面使用了gcc計(jì)劃的軟件,你賣自己的應(yīng)用多少錢你自己定。免費(fèi)的軟件不一定是開源的。


2,GCC

先看看wiki百科上的官方說(shuō)明:


“ GCC(GNU Compiler Collection,GNU編譯器套裝),是一套由GNU開發(fā)的編程語(yǔ)言編譯器。它是一套以GPL及LGPL許可證所發(fā)布的自由軟件,也是GNU項(xiàng)目的關(guān)鍵部分,亦是自由的類Unix及蘋果電腦Mac OS X 操作系統(tǒng)的標(biāo)準(zhǔn)編譯器。GCC(特別是其中的C語(yǔ)言編譯器)也常被認(rèn)為是跨平臺(tái)編譯器的事實(shí)標(biāo)準(zhǔn)。


GCC原名為GNU C語(yǔ)言編譯器(GNU C Compiler),因?yàn)樗局荒芴幚鞢語(yǔ)言。GCC很快地?cái)U(kuò)展,變得可處理C 。之后也變得可處理Fortran、Pascal、Objective-C、Java、Ada,以及Go與其他語(yǔ)言。


原本用C開發(fā),后來(lái)因?yàn)長(zhǎng)LVM、Clang的崛起,令GCC更快將開發(fā)語(yǔ)言轉(zhuǎn)換為C 。許多C的愛(ài)好者在對(duì)C 一知半解的情況下主觀認(rèn)定C 的性能一定會(huì)輸給C,但是Taylor給出了不同的意見,并表明C 不但性能不輸給C,而且能設(shè)計(jì)出更好,更容易維護(hù)的程序 ”


由于GCC已成為GNU系統(tǒng)的官方編譯器(包括GNU/Linux家族),它也成為編譯與創(chuàng)建其他操作系統(tǒng)的主要編譯器,包括BSD家族、Mac OS X、NeXTSTEP與BeOS。


GCC通常是跨平臺(tái)軟件的編譯器首選。有別于一般局限于特定系統(tǒng)與運(yùn)行環(huán)境的編譯器,GCC在所有平臺(tái)上都使用同一個(gè)前端處理程序,產(chǎn)生一樣的中介碼,因此此中介碼在各個(gè)其他平臺(tái)上使用GCC編譯,有很大的機(jī)會(huì)可得到正確無(wú)誤的輸出程序。


總結(jié)

mac之前的cocoa框架便是用GCC編譯的,所以ios與mac os都是默認(rèn)使用的GCC編譯器(現(xiàn)在是clang與llvm,下面會(huì)有介紹)


android的系統(tǒng)層因?yàn)槭莑inux內(nèi)核,自然也是GCC編譯的,但是android的app因?yàn)槭沁\(yùn)行在Dalvik虛擬機(jī),所以用的不是GCC。


windows的應(yīng)用,大部分都是使用的vs系列的編譯器,畢竟是windows自家的編譯器,用到GCC的不多。


3,Clang

先看看wiki百科上的官方說(shuō)明:http://zh.wikipedia.org/wiki/Clang


“ Clang 是一個(gè)C、C 、Objective-C和Objective-C 編程語(yǔ)言的編譯器前端。它采用了底層虛擬機(jī)(LLVM)作為其后端。


它的目標(biāo)是提供一個(gè)GNU編譯器套裝(GCC)的替代品。Clang項(xiàng)目包括Clang前端和Clang靜態(tài)分析器等。


這個(gè)軟件項(xiàng)目在2005年由蘋果電腦發(fā)起,是LLVM編譯器工具集的前端(front-end),目的是輸出代碼對(duì)應(yīng)的抽象語(yǔ)法樹(Abstract Syntax Tree, AST),并將代碼編譯成LLVM Bitcode。接著在后端(back-end)使用LLVM編譯成平臺(tái)相關(guān)的機(jī)器語(yǔ)言 。Clang支持C、C 、Objective C。


Clang本身性能優(yōu)異,其生成的AST所耗用掉的內(nèi)存僅僅是GCC的20%左右。FreeBSD 10將Clang/LLVM作為默認(rèn)編譯器.


測(cè)試證明Clang編譯Objective-C代碼時(shí)速度為GCC的3倍,還能針對(duì)用戶發(fā)生的編譯錯(cuò)誤準(zhǔn)確地給出建議。


總結(jié)

GCC目前作為跨平臺(tái)編譯器來(lái)說(shuō)它的兼容性無(wú)異是最強(qiáng)的,兼容最強(qiáng)肯定是以犧牲一定的性能為基礎(chǔ)的,蘋果為了提高性能,因此專門針對(duì)mac系統(tǒng)開發(fā)了專用的編譯器clang與llvm,clang用于編譯器前段,llvm用于后端。


3,LLVM

先看看wiki百科上的官方說(shuō)明:http://zh.wikipedia.org/wiki/LLVM


“ LLVM,它是一個(gè)編譯器的基礎(chǔ)建設(shè),以C 寫成。它是為了任意一種編程語(yǔ)言寫成的程序,利用虛擬技術(shù),創(chuàng)造出編譯時(shí)期,鏈結(jié)時(shí)期,運(yùn)行時(shí)期以及“閑置時(shí)期”的優(yōu)化。


在Xcode4之后,蘋果將Xcode的默認(rèn)編譯器變成了LLVM,為什么呢?


LLVM歷史

Apple(包括中后期的NeXT) 一直使用GCC作為官方的編譯器。GCC作為開源世界的編譯器標(biāo)準(zhǔn)一直做得不錯(cuò),但Apple對(duì)編譯工具會(huì)提出更高的要求。


一方面,是Apple對(duì)Objective-C語(yǔ)言(甚至后來(lái)對(duì)C語(yǔ)言)新增很多特性,但GCC開發(fā)者并不買Apple的帳——不給實(shí)現(xiàn),因此索性后來(lái)兩者分成兩條分支分別開發(fā),這也造成Apple的編譯器版本遠(yuǎn)落后于GCC的官方版本。另一方面,GCC的代碼耦合度太高,不好獨(dú)立,而且越是后期的版本,代碼質(zhì)量越差,但Apple想做的很多功能(比如更好的IDE支持)需要模塊化的方式來(lái)調(diào)用GCC,但GCC一直不給做,從根本上限制了LLVM-GCC的開發(fā)。所以,這種不和讓Apple一直在尋找一個(gè)高效的、模塊化的、協(xié)議更放松的開源替代品,于是Apple請(qǐng)來(lái)了編譯器高材生Chris Lattner, LLVM就這樣產(chǎn)生了。


Clang歷史

Apple吸收Chris Lattner的目的要比改進(jìn)GCC代碼優(yōu)化宏大得多——GCC系統(tǒng)龐大而笨重,而Apple大量使用的Objective-C在GCC中優(yōu)先級(jí)很低。此外GCC作為一個(gè)純粹的編譯系統(tǒng),與IDE配合得很差。加之許可證方面的要求,Apple無(wú)法使用LLVM 繼續(xù)改進(jìn)GCC的代碼質(zhì)量。于是,Apple決定從零開始寫 C、C 、Objective-C語(yǔ)言的前端 Clang,完全替代掉GCC。


正像名字所寫的那樣,Clang只支持C,C 和Objective-C三種C家族語(yǔ)言。2007年開始開發(fā),C編譯器最早完成,而由于Objective-C相對(duì)簡(jiǎn)單,只是C語(yǔ)言的一個(gè)簡(jiǎn)單擴(kuò)展,很多情況下甚至可以等價(jià)地改寫為C語(yǔ)言對(duì)Objective-C運(yùn)行庫(kù)的函數(shù)調(diào)用,因此在2009年時(shí),已經(jīng)完全可以用于生產(chǎn)環(huán)境。C 的支持也熱火朝天地進(jìn)行著。


更詳細(xì)的原因:

Xcode編譯器介紹:


http://www.cnblogs.com/ydhliphonedev/archive/2012/08/29/2661726.html


總結(jié):

因?yàn)镚CC的編譯器已經(jīng)慢慢無(wú)法滿足蘋果的需求,因此,蘋果開發(fā)了Clang與LLVM來(lái)完全取代GCC,Xcode4之后,蘋果的默認(rèn)編譯器已經(jīng)是LLVM了。Clang作為編譯器前端,LLVM作為編譯器后端。


在Xcode6.0中查看默認(rèn)編譯器:


4,編譯器相關(guān)知識(shí)

問(wèn)題:蘋果以clang作為編譯器前端,llvm作為編譯器后端,那么編譯器的前后端到底是什么東西呢?


我們先回到一個(gè)常識(shí)性的問(wèn)題,什么是編譯器呢?簡(jiǎn)單地說(shuō),編譯器可以看作是一個(gè)語(yǔ)言翻譯器。就像把中文翻譯成英語(yǔ)一樣,編譯器可以把高級(jí)語(yǔ)言翻譯成計(jì)算機(jī)能夠執(zhí)行的機(jī)器語(yǔ)言。這樣看來(lái),GCC可以算得上是一個(gè)精通多國(guó)語(yǔ)言的高級(jí)翻譯官了。


最簡(jiǎn)單的GCC使用指令如下所示:


gcc hello.c -o hello
GCC接受hello.c作為輸入,最后產(chǎn)生目標(biāo)可執(zhí)行代碼hello,這個(gè)簡(jiǎn)單的流程實(shí)際上經(jīng)歷了很多步驟。


雖然我們只用了一條命令就完成了編譯,但實(shí)際上gcc命令依次呼叫了cpp,gcc自己,gas以及l(fā)d來(lái)進(jìn)行完整的編譯流程,最后生成最終的可執(zhí)行文件hello。


學(xué)過(guò)編譯原理這門課程的同學(xué)對(duì)下面這副圖應(yīng)該很熟悉,這是經(jīng)典的編譯流程。


下面以GCC編譯器為例,GCC作為經(jīng)典的編譯器,自然也是遵循這個(gè)教科書流程(實(shí)際GCC的處理更復(fù)雜點(diǎn),但本質(zhì)上是一樣的)。


我們先簡(jiǎn)化一下上面這幅圖,以中間代碼為分界,前面的詞法分析、語(yǔ)法分析、語(yǔ)義分析我們把它稱之為前端處理,后面的優(yōu)化和目標(biāo)代碼生成我們稱之為后端處理。


試想一下,是否可以為不同的高級(jí)語(yǔ)言單獨(dú)寫一個(gè)前端,然后為不同的處理器架構(gòu)單獨(dú)寫一個(gè)后端呢?


GCC基本上也是這么實(shí)現(xiàn)的,不過(guò)不要誤會(huì),并沒(méi)有一個(gè)統(tǒng)一的gcc執(zhí)行程序能夠處理如此多的前端和后端,每個(gè)語(yǔ)言的編譯器都是一個(gè)獨(dú)立的程序(如C語(yǔ)言的編譯器是gcc,C 的編譯器是g ),而不同的后端也要對(duì)應(yīng)不同的可執(zhí)行程序。你可以下載單獨(dú)的一份GCC源代碼,通過(guò)不同的configure來(lái)生成自己需要的編譯器。


而且,編譯器的實(shí)現(xiàn)也比上圖要復(fù)雜的多,前端的主要功能是產(chǎn)生一個(gè)可供后端處理的語(yǔ)法樹,而語(yǔ)法樹結(jié)構(gòu)實(shí)際上很難與處理器架構(gòu)脫鉤,這些都是編譯器應(yīng)用中需要解決的問(wèn)題。


GCC強(qiáng)大的真正原因是什么?是因?yàn)樗С至吮姸嗟那岸撕秃蠖藛?這些都不過(guò)是一個(gè)表象而已。GCC是一款真正自由的編譯器,我們可以隨時(shí)把代碼拿過(guò)來(lái)修改以實(shí)現(xiàn)自己需要的功能。如果你的硬件平臺(tái)增加了一些指令,而普通的編譯器并不能產(chǎn)生這些指令怎么辦?在GCC后端添加這些指令吧。如果你覺(jué)得C語(yǔ)言用的不太順手,想給它添加一些功能怎么辦?修改GCC的前端吧。因?yàn)橛辛薌CC,我們才擁有這些自由,以及迅速實(shí)現(xiàn)自己想法的能力,而這些才是GCC強(qiáng)大背后的基礎(chǔ)。


????????????????  END  ????????????????




本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉