編譯器與操作系統有何關(guān)系?編譯器與CPU之間又有何情緣? 很多程序員可能有同樣的疑問(wèn),編譯器與操作系統之間有何關(guān)系,編譯器與CPU又有何關(guān)系,動(dòng)態(tài)鏈接器從哪查找共享庫等。 讓人困惑的原因有幾, 第一是編譯器的功能角色特殊,編譯器是生成程序的程序; 第二是編譯過(guò)程變得越來(lái)越復雜,一支編譯器支持多種程序語(yǔ)言、支持共享庫、編譯優(yōu)化,編譯與鏈接可分開(kāi)等; 第三,操作系統的介入。 今天我們試著(zhù)從操作系統介入編譯過(guò)程后對編譯器的影響,看看操作系統與編譯器有什么關(guān)系。 編譯程序 我們看看編譯器的一種傳統定義: 編譯程序是一支將抽象度較高的編程語(yǔ)言程序(也稱(chēng)源程序)【轉化】成抽象度較低的編程語(yǔ)言程序(也稱(chēng)目標程序)的【程序】[注]。抽象度的兩端分別是機器語(yǔ)義和人理解語(yǔ)義!咎幚砥黧w系】和【編程語(yǔ)言】是一支編譯程序的根本屬性。 注:以下僅使用【程序】一語(yǔ),“器”是一種形象的比喻,不夠嚴謹;而軟件(software)是產(chǎn)品性的程序,最好只用在商業(yè)語(yǔ)境中。 以上對編譯程序的定義描述在【現代意義下】對全面認識編譯程序是不夠的,因為它沒(méi)有涉及操作系統,沒(méi)有涉及現代的復雜的程序構建過(guò)程。有一定開(kāi)發(fā)經(jīng)驗的程序員都知道,程序的“編譯過(guò)程”包括編譯、鏈接(靜態(tài)鏈接與動(dòng)態(tài)鏈接)、調試,還可能包括組態(tài)配置和安裝兩步!熬幾g”一詞已經(jīng)不能很好描述這個(gè)過(guò)程。整個(gè)過(guò)程可稱(chēng)為【程序構建】,而編譯只是第一步,在這一點(diǎn)上,編譯程序在傳統意義上與現代意義上產(chǎn)生了不同。由于本文試圖討論編譯程序與操作系統的關(guān)系,為了避免產(chǎn)生歧義,本文的【編譯程序】包括編譯和靜態(tài)鏈接兩個(gè)部分,動(dòng)態(tài)鏈接部分有點(diǎn)特殊,后面會(huì )提到它的角色。 下面我們給出有關(guān)【操作系統與編譯程序關(guān)系】的三個(gè)問(wèn)題,并試圖回答它們: ·第一,編譯程序與操作系統的關(guān)系是什么? ·第二,編譯程序對操作系統有依賴(lài)么? ·第三,編譯程序與CPU的關(guān)系又是什么? ·第四,操作系統對C標準庫與C編譯程序的關(guān)系有什么影響? 為了更好的進(jìn)行下一步討論,先給出現代編譯程序比較完整的定義,并由定義引出問(wèn)題: 現代編譯程序是一支將某抽象度較高的編程語(yǔ)言程序【轉化】為運行在【某軟硬體系下】的抽象度較低的編程語(yǔ)言程序的【程序】。所謂硬件體系是指處理器體系,軟件體系指操作系統體系。 要回答前三個(gè)問(wèn)題,我們得厘清現代編譯程序定義中的【屬概念】——程序,并對操作系統有更深一層認識。 程序 程序的分類(lèi)是多種多樣的,比如常見(jiàn)的兩分法是【系統程序】和【應用程序】。這是一種粗粒度的按【計算任務(wù)】不同的分法。我們看程序的定義: 程序(program)是完成特定【計算任務(wù)】的【指令】序列,指令由相應的【圖靈機】讀取并操作。 由以上對程序的定義可知,還可根據——程序【指令的性質(zhì)】和讀取程序的【圖靈機】性質(zhì)——兩個(gè)標準再進(jìn)一步對程序分類(lèi)。比如,按指令序列是否連續可以分為獨立程序和共享程序(使用了共享庫);按指令的抽象度可分為高級語(yǔ)言程序和低級語(yǔ)言程序。按【圖靈機】的體系可分為X86程序和ARM程序,16位程序和32位程序等。 高級語(yǔ)言程序是不是【程序】?如果是,它的【圖靈機】是什么? 我們一般理解下的【程序】是指二進(jìn)制的可執行文件,那么高級語(yǔ)言的源程序是不是程序?從指令序列的定義看,【高級語(yǔ)言的源程序】是程序,因為【高級語(yǔ)言的源程序】與【二進(jìn)制的可執行文件】一樣,也是指令序列,只不過(guò)【高級語(yǔ)言的源程序】的【圖靈機】不是CPU,也不是編譯器或解釋器,而是程序員!靖呒壵Z(yǔ)言的源程序】的功能更多體現在程序員間的相互學(xué)習和交流。 除了以上基本分類(lèi)外,現代的程序還會(huì )受為其提供虛擬運行環(huán)境的操作系統影響,可以根據操作系統的體系屬性對程序再分類(lèi),例如win32程序,Linux程序。 操作系統 操作系統是什么類(lèi)程序? 操作系統是一類(lèi)比較獨立的系統程序,操作系統有支持各種【圖靈機】的體系類(lèi)型,比如16位DOS,32位Windows,X86的BSD,ARM的 linux等。而系統程序一般是指一支為應用程序直接提供半成品(為應用程序提供執行的虛擬環(huán)境)和協(xié)調多個(gè)應用程序并行運行的程序。所謂半成品是指,系統程序的一部分(指令序列)也是應用程序的一部分(指令序列),但這部分程序不專(zhuān)屬任何應用程序,它是共享的。例如各種新硬件的驅動(dòng)程序、C標準庫函數、POSIX庫函數等。而作一個(gè)協(xié)調程序,操作系統表現出與一般應用程序的程序性,如獨立調度的線(xiàn)程,只是它們運行在權力更高的狀態(tài)下。協(xié)調程序如線(xiàn)程調度程序。 非操作系統程序與操作系統的關(guān)系 這里的操作系統泛指像Linux這樣的現代32位操作系統,而【非操作系統程序】運行在操作系統之上,對操作系統存在可能的依賴(lài)的程序。 其實(shí)只要是運行在某操作系統之上的程序都會(huì )烙上該操作系統的印,對操作系統有依賴(lài),包括編譯程序。不過(guò)這些程序對操作系統的依賴(lài)程度和依賴(lài)的內容確實(shí)有很多區別。例如一支最簡(jiǎn)單的【Hello world程序】都會(huì )對【操作系統的C庫】產(chǎn)生依賴(lài),如果去掉【Hello world程序】的輸入輸出功能,只作加減或邏輯運算,【Hello world程序】依然會(huì )對操作系統有少量依賴(lài),因為【Hello world程序】由運行在該【操作系統上的編譯程序】編譯的,有特定的目標文件格式,并由該【操作系統的載入程序】載入內存運行[注]。這種只【在形式上】對OS存在依賴(lài)的“無(wú)用”程序可謂是最獨立于OS的程序。在此基礎之上,其它程序都對OS有不同程度的依賴(lài),依賴(lài)表現在對OS內的各種程序庫的依賴(lài),比如C標準庫,POSIX系統庫,線(xiàn)程庫、網(wǎng)絡(luò )庫和其它基于這些基礎庫的第三方應用代碼庫。 注:由此可見(jiàn)編譯程序與引導程序、SHELL程序一樣,是現代操作系統的基本部分。 問(wèn)題初步解決 編譯程序與操作系統的關(guān)系 有了以上的對程序以及操作系統本質(zhì)的一定了解后,我們知道編譯程序與操作系統有一定親緣性。但這種親緣性的一些表現會(huì )讓人迷惑。例如Linux發(fā)行版可以不安裝有編譯程序的,只有開(kāi)發(fā)工作站才需要編譯程序。而所有Linux發(fā)行版的應用程序都可能使用了共享庫,需要動(dòng)態(tài)鏈接這些系統共享庫。由此可見(jiàn),應該分開(kāi)【開(kāi)發(fā)期】與【運行期】來(lái)看待編譯程序與操作系統的關(guān)系。在開(kāi)發(fā)期,編譯程序運行操作系統之上,屬于【非操作系統程序】,對操作系統有依賴(lài);在運行期,編譯程序的子部分——動(dòng)態(tài)鏈接程序和加載程序屬于操作系統有機部分。 由以可得編譯程序與操作系統的關(guān)系有: ●第一,編譯程序的編譯部分和靜態(tài)鏈接部分是運行在操作系統上的系統程序; ●第二,編譯程序的動(dòng)態(tài)鏈接部分與操作系統的親緣性更強,所以完全可把動(dòng)態(tài)鏈接部分獨立出來(lái)[FIXME:動(dòng)態(tài)鏈接程序與操作系統具體關(guān)系未知]; ●第三,編譯程序的編譯輸出格式是操作系統相關(guān)的。 由此可見(jiàn),編譯程序是操作系統相關(guān)的,編譯程序也是操作系統的功能很重要組成部分,但編譯程序沒(méi)有被集成入操作系統內核內,所以編譯程序不算是操作系統的有機組成部分。 編譯程序對操作系統的依賴(lài) 由上面可得,編譯程序是運行操作系統之上【非操作系統程序】,對操作系統有依賴(lài)。編譯程序是一支【計算集中】更大的程序,它相對于應用程序對OS依賴(lài)會(huì )少一些,依賴(lài)有: ●形式依賴(lài)(由另一支同軟硬體系的編譯程序[行話(huà)本地編譯器],編譯得到或不同軟硬體系的編譯程序[行話(huà)交叉編譯器],交叉編譯得到) ●C庫依賴(lài),讀取高級語(yǔ)言源碼程序文件,寫(xiě)入低級語(yǔ)言的目標文件 編譯程序與CPU的關(guān)系 這個(gè)問(wèn)題在編譯程序的定義里已經(jīng)有答案了,一支編譯程序只編譯生成一種機器碼。我們說(shuō)編譯程序的【操作系統相關(guān)性】是后天進(jìn)化得到的,而編譯程序的【處理器相關(guān)性】是天生的。 操作系統對C標準庫與C編譯程序的關(guān)系的影響 操作系統對C庫沒(méi)有什么影響,C庫是一種通用代碼庫。是給用戶(hù)編程提供的接口,程序員只需要和這些接口打交道就可以了,而不需要知道具體怎么實(shí)現的。c庫中的有些功能是c庫代碼本身實(shí)現的,也有一些是利用操作系統實(shí)現的。 以下課程可免費試聽(tīng)C語(yǔ)言、電子、PCB、STM32、Linux、FPGA、JAVA、安卓等。 想學(xué)習的你和我聯(lián)系預約就可以免費聽(tīng)課了。 宋工企鵝號:3524-6590-88 Tel/WX:173--1795--1908 ![]() |