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

當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 技術(shù)解析
[導(dǎo)讀]c編譯器每天都在被使用,但對(duì)c編譯器十分了解的人卻不多,而對(duì)c編譯器編譯過(guò)程有所認(rèn)知的朋友更是少之又少。在上篇文章中,小編對(duì)c編譯器的工作過(guò)程有所講解。本文中,為繼續(xù)增進(jìn)大家對(duì)c編譯器的講解,將對(duì)編譯器工作過(guò)程的余下步驟予以闡述。如果你對(duì)本文即將探討的內(nèi)容存在一定興趣,不妨繼續(xù)往下閱讀。

c編譯器每天都在被使用,但對(duì)c編譯器十分了解的人卻不多,而對(duì)c編譯器編譯過(guò)程有所認(rèn)知的朋友更是少之又少。在上篇文章中,小編對(duì)c編譯器的工作過(guò)程有所講解。本文中,為繼續(xù)增進(jìn)大家對(duì)c編譯器的講解,將對(duì)編譯器工作過(guò)程的余下步驟予以闡述。如果你對(duì)本文即將探討的內(nèi)容存在一定興趣,不妨繼續(xù)往下閱讀。

本文承接上一篇文章而談,將直接探討編譯工作過(guò)程的第四步,如果對(duì)前三步有疑惑的朋友,可以參閱前文。

1.第四步 頭文件的預(yù)編譯(precompilation)

不同的源碼文件,可能引用同一個(gè)頭文件(比如stdio.h)。編譯的時(shí)候,頭文件也必須一起編譯。為了節(jié)省時(shí)間,編譯器會(huì)在編譯源碼之前,先編譯頭文件。這保證了頭文件只需編譯一次,不必每次用到的時(shí)候,都重新編譯了。

不過(guò),并不是頭文件的所有內(nèi)容,都會(huì)被預(yù)編譯。用來(lái)聲明宏的#define命令,就不會(huì)被預(yù)編譯。

2.第五步 預(yù)處理(Preprocessing)

預(yù)編譯完成后,編譯器就開(kāi)始替換掉源碼中bash的頭文件和宏。以本文開(kāi)頭的那段源碼為例,它包含頭文件stdio.h,替換后的樣子如下。

為了便于閱讀,上面代碼只截取了頭文件中與源碼相關(guān)的那部分,即fputs和FILE的聲明,省略了stdio.h的其他部分(因?yàn)樗鼈兎浅iL(zhǎng))。另外,上面代碼的頭文件沒(méi)有經(jīng)過(guò)預(yù)編譯,而實(shí)際上,插入源碼的是預(yù)編譯后的結(jié)果。編譯器在這一步還會(huì)移除注釋。

這一步稱(chēng)為“預(yù)處理”(Preprocessing),因?yàn)橥瓿芍螅鸵_(kāi)始真正的處理了。

3.第六步 編譯(CompilaTIon)

預(yù)處理之后,編譯器就開(kāi)始生成機(jī)器碼。對(duì)于某些編譯器來(lái)說(shuō),還存在一個(gè)中間步驟,會(huì)先把源碼轉(zhuǎn)為匯編碼(assembly),然后再把匯編碼轉(zhuǎn)為機(jī)器碼。

下面是本文開(kāi)頭的那段源碼轉(zhuǎn)成的匯編碼。

這種轉(zhuǎn)碼后的文件稱(chēng)為對(duì)象文件(object file)。

4.第七步 連接(Linking)

對(duì)象文件還不能運(yùn)行,必須進(jìn)一步轉(zhuǎn)成可執(zhí)行文件。如果你仔細(xì)看上一步的轉(zhuǎn)碼結(jié)果,會(huì)發(fā)現(xiàn)其中引用了stdout函數(shù)和fwrite函數(shù)。也就是說(shuō),程序要正常運(yùn)行,除了上面的代碼以外,還必須有stdout和fwrite這兩個(gè)函數(shù)的代碼,它們是由C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)提供的。

編譯器的下一步工作,就是把外部函數(shù)的代碼(通常是后綴名為.lib和.a的文件),添加到可執(zhí)行文件中。這就叫做連接(linking)。這種通過(guò)拷貝,將外部函數(shù)庫(kù)添加到可執(zhí)行文件的方式,叫做靜態(tài)連接(static linking),后文會(huì)提到還有動(dòng)態(tài)連接(dynamic linking)。

make命令的作用,就是從第四步頭文件預(yù)編譯開(kāi)始,一直到做完這一步。

5.第八步 安裝(Installation)

上一步的連接是在內(nèi)存中進(jìn)行的,即編譯器在內(nèi)存中生成了可執(zhí)行文件。下一步,必須將可執(zhí)行文件保存到用戶事先指定的安裝目錄。

表面上,這一步很簡(jiǎn)單,就是將可執(zhí)行文件(連帶相關(guān)的數(shù)據(jù)文件)拷貝過(guò)去就行了。但是實(shí)際上,這一步還必須完成創(chuàng)建目錄、保存文件、設(shè)置權(quán)限等步驟。這整個(gè)的保存過(guò)程就稱(chēng)為“安裝”(Installation)。

6.第九步 操作系統(tǒng)連接

可執(zhí)行文件安裝后,必須以某種方式通知操作系統(tǒng),讓其知道可以使用這個(gè)程序了。比如,我們安裝了一個(gè)文本閱讀程序,往往希望雙擊txt文件,該程序就會(huì)自動(dòng)運(yùn)行。

這就要求在操作系統(tǒng)中,登記這個(gè)程序的元數(shù)據(jù):文件名、文件描述、關(guān)聯(lián)后綴名等等。Linux系統(tǒng)中,這些信息通常保存在/usr/share/applications目錄下的.desktop文件中。另外,在Windows操作系統(tǒng)中,還需要在Start啟動(dòng)菜單中,建立一個(gè)快捷方式。

這些事情就叫做“操作系統(tǒng)連接”。make install命令,就用來(lái)完成“安裝”和“操作系統(tǒng)連接”這兩步。

7.第十步 生成安裝包

寫(xiě)到這里,源碼編譯的整個(gè)過(guò)程就基本完成了。但是只有很少一部分用戶,愿意耐著性子,從頭到尾做一遍這個(gè)過(guò)程。事實(shí)上,如果你只有源碼可以交給用戶,他們會(huì)認(rèn)定你是一個(gè)不友好的家伙。大部分用戶要的是一個(gè)二進(jìn)制的可執(zhí)行程序,立刻就能運(yùn)行。這就要求開(kāi)發(fā)者,將上一步生成的可執(zhí)行文件,做成可以分發(fā)的安裝包。

所以,編譯器還必須有生成安裝包的功能。通常是將可執(zhí)行文件(連帶相關(guān)的數(shù)據(jù)文件),以某種目錄結(jié)構(gòu),保存成壓縮文件包,交給用戶。

8.第十一步 動(dòng)態(tài)連接(Dynamic linking)

正常情況下,到這一步,程序已經(jīng)可以運(yùn)行了。至于運(yùn)行期間(runtime)發(fā)生的事情,與編譯器一概無(wú)關(guān)。但是,開(kāi)發(fā)者可以在編譯階段選擇可執(zhí)行文件連接外部函數(shù)庫(kù)的方式,到底是靜態(tài)連接(編譯時(shí)連接),還是動(dòng)態(tài)連接(運(yùn)行時(shí)連接)。所以,最后還要提一下,什么叫做動(dòng)態(tài)連接。

前面已經(jīng)說(shuō)過(guò),靜態(tài)連接就是把外部函數(shù)庫(kù),拷貝到可執(zhí)行文件中。這樣做的好處是,適用范圍比較廣,不用擔(dān)心用戶機(jī)器缺少某個(gè)庫(kù)文件;缺點(diǎn)是安裝包會(huì)比較大,而且多個(gè)應(yīng)用程序之間,無(wú)法共享庫(kù)文件。動(dòng)態(tài)連接的做法正好相反,外部函數(shù)庫(kù)不進(jìn)入安裝包,只在運(yùn)行時(shí)動(dòng)態(tài)引用。好處是安裝包會(huì)比較小,多個(gè)應(yīng)用程序可以共享庫(kù)文件;缺點(diǎn)是用戶必須事先安裝好庫(kù)文件,而且版本和安裝位置都必須符合要求,否則就不能正常運(yùn)行。

以上便是此次小編帶來(lái)的“c編譯器”相關(guān)內(nèi)容,通過(guò)本文,希望大家對(duì)編譯器工作過(guò)程的這幾個(gè)步驟具備一定的認(rèn)知。如果你喜歡本文,不妨持續(xù)關(guān)注我們網(wǎng)站哦,小編將于后期帶來(lái)更多精彩內(nèi)容。最后,十分感謝大家的閱讀,have a nice day!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuā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)題卻十分常見(jià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)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

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

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(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ì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

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

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

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(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)閉