導航:首頁 > 源碼編譯 > 編譯器的前端包括什麼

編譯器的前端包括什麼

發布時間:2024-04-23 20:58:41

linux中常用編譯器是什麼

Linux 下可用的編譯器有 GCC、EGCS 和 PGCC,其中最常用的編譯器便是 GCC。

GCC 起初是 GNU 推出的 C語言編
譯器,用於類 Unix 系統下的編程,所以名為 GNU C Compiler 。隨著眾多自由開發者的加入,GCC
發展迅速,如今已成為一個支持眾多語言的編譯器了,其中包括 C、C++、Ada、Object C 和 Java 等,以至於 GCC 開始被擴展為
GNU Compiler Collection ,也就是「GNU 編譯器集合」的意思。

GCC用法:

1、GCC基本用法及其選項

gcc 或 g++ 的用法跟參數含義幾乎一樣,他們最基本的用法是:

2、只編譯子程序(-c)

3、產生目標文件(-o)

4、附加調試信息(-g)

5、多文件編譯

6、連接庫文件。

② 什麼是編譯器

編譯器

編譯器是一種特殊的程序,它可以把以特定編程語言寫成的程序變為機器可以運行的機器碼。我們把一個程序寫好,這時我們利用的環境是文本編輯器。這時我程序把程序稱為源程序。在此以後程序員可以運行相應的編譯器,通過指定需要編譯的文件的名稱就可以把相應的源文件(通過一個復雜的過程)轉化為機器碼了。

[編輯]編譯器工作方法
首先編譯器進行語法分析,也就是要把那些字元串分離出來。然後進行語義分析,就是把各個由語法分析分析出的語法單元的意義搞清楚。最後生成的是目標文件,我們也稱為obj文件。再經過鏈接器的鏈接就可以生成最後的可執行代碼了。有些時候我們需要把多個文件產生的目標文件進行鏈接,產生最後的代碼。我們把一過程稱為交叉鏈接。

一個現代編譯器的主要工作流程如下:

* 源程序(source code)→預處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標程序(object code)→連接器(鏈接器,Linker)→可執行程序(executables)

工作原理

編譯是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器言)。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。

典型的編譯器輸出是由包含入口點的名字和地址以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的可執行程序。

編譯器種類

編譯器可以生成用來在與編譯器本身所在的計算機和操作系統(平台)相同的環境下運行的目標代碼,這種編譯器又叫做「本地」編譯器。另外,編譯器也可以生成用來在其它平台上運行的目標代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬體平台時非常有用。「源碼到源碼編譯器」是指用一種高級語言作為輸入,輸出也是高級語言的編譯器。例如: 自動並行化編譯器經常採用一種高級語言作為輸入,轉換其中的代碼,並用並行代碼注釋對它進行注釋(如OpenMP)或者用語言構造進行注釋(如FORTRAN的DOALL指令)。

預處理器(preprocessor)

作用是通過代入預定義等程序段將源程序補充完整。

編譯器前端(frontend)

前端主要負責解析(parse)輸入的源程序,由詞法分析器和語法分析器協同工作。詞法分析器負責把源程序中的『單詞』(Token)找出來,語法分析器把這些分散的單詞按預先定義好的語法組裝成有意義的表達式,語句 ,函數等等。 例如「a = b + c;」前端詞法分析器看到的是「a, =, b , +, c;」,語法分析器按定義的語法,先把他們組裝成表達式「b + c」,再組裝成「a = b + c」的語句。 前端還負責語義(semantic checking)的檢查,例如檢測參與運算的變數是否是同一類型的,簡單的錯誤處理。最終的結果常常是一個抽象的語法樹(abstract syntax tree,或 AST),這樣後端可以在此基礎上進一步優化,處理。

編譯器後端(backend)

編譯器後端主要負責分析,優化中間代碼(Intermediate representation)以及生成機器代碼(Code Generation)。

一般說來所有的編譯器分析,優化,變型都可以分成兩大類: 函數內(intraproceral)還是函數之間(interproceral)進行。很明顯,函數間的分析,優化更准確,但需要更長的時間來完成。

編譯器分析(compiler analysis)的對象是前端生成並傳遞過來的中間代碼,現代的優化型編譯器(optimizing compiler)常常用好幾種層次的中間代碼來表示程序,高層的中間代碼(high level IR)接近輸入的源程序的格式,與輸入語言相關(language dependent),包含更多的全局性的信息,和源程序的結構;中層的中間代碼(middle level IR)與輸入語言無關,低層的中間代碼(Low level IR)與機器語言類似。 不同的分析,優化發生在最適合的那一層中間代碼上。

常見的編譯分析有函數調用樹(call tree),控制流程圖(Control flow graph),以及在此基礎上的變數定義-使用,使用-定義鏈(define-use/use-define or u-d/d-u chain),變數別名分析(alias analysis),指針分析(pointer analysis),數據依賴分析(data dependence analysis)等等。

上述的程序分析結果是編譯器優化(compiler optimization)和程序變形(compiler transformation)的前提條件。常見的優化和變新有:函數內嵌(inlining),無用代碼刪除(Dead code elimination),標准化循環結構(loop normalization),循環體展開(loop unrolling),循環體合並,分裂(loop fusion,loop fission),數組填充(array padding),等等。優化和變形的目的是減少代碼的長度,提高內存(memory),緩存(cache)的使用率,減少讀寫磁碟,訪問網路數據的頻率。更高級的優化甚至可以把序列化的代碼(serial code)變成並行運算,多線程的代碼(parallelized,multi-threaded code)。

機器代碼的生成是優化變型後的中間代碼轉換成機器指令的過程。現代編譯器主要採用生成匯編代碼(assembly code)的策略,而不直接生成二進制的目標代碼(binary object code)。即使在代碼生成階段,高級編譯器仍然要做很多分析,優化,變形的工作。例如如何分配寄存器(register allocatioin),如何選擇合適的機器指令(instruction selection),如何合並幾句代碼成一句等等。

③ 在c語言中「可執行程序」是什麼意思

C語言中的可執行程序就是將用文本信息表示的程序翻譯成計算機認識的二進制代碼串。

首先,我們先用C語言把源代碼寫好,然後交給C語言編譯器。C語言編譯器內部分為前端和後端。

(1)編譯器前端

前端負責將C語言代碼進行詞法和語法上的解析,然後可以生成中間代碼。

中間代碼這部分不是必須的,但是它能夠為程序的跨平台移植帶來諸多好處。比如,同樣的一份C語言源代碼在一台計算機上編譯完之後,生成一套中間代碼。

然後針對不同的目標平台(比如要將這一套代碼分別編譯成 ARM 處理器的二進制機器碼、MIPS 處理器的二進制機器碼以及 x86 處理器的二進制機器碼),只需要編寫相應目標平台的編譯器後端即可。

所以,這么做就可以把編譯器的前端與後端剝離開來(這在軟體工程上又可稱為解耦合),不同處理器廠商可以針對自家的處理器特性,對中間代碼生成到目標二進制代碼的過程再度進行優化。

(2)編譯器後端

接下來,由C語言編譯器後端生成源文件相應的目標文件。

目標文件在 Windows 系統上往往是.obj文件,而在 Unix/Linux 系統上往往是.o文件,C語言的源文件在所有平台上都統一用.c文件表示。

(3)鏈接器

最後,對於各個獨立的目標文件,通過連接器將它們合並成一個最終可執行文件。

(3)編譯器的前端包括什麼擴展閱讀:

起初,C語言沒有官方標准。1978年由美國電話電報公司(AT&T)貝爾實驗室正式發表了C語言。布萊恩·柯林漢(Brian Kernighan) 和 丹尼斯·里奇(Dennis Ritchie) 出版了一本書,名叫《The C Programming Language》。

這本書被 C語言開發者們稱為K&R,很多年來被當作 C語言的非正式的標准說明。人們稱這個版本的 C語言為K&R C。

K&R C主要介紹了以下特色:

結構體(struct)類型

長整數(long int)類型

無符號整數(unsigned int)類型

把運算符=+和=-改為+=和-=。因為=+和=-會使得編譯器不知道使用者要處理i = -10還是i =- 10,使得處理上產生混淆。

即使在後來ANSI C標准被提出的許多年後,K&R C仍然是許多編譯器的最 准要求,許多老舊的編譯器仍然運行K&R C的標准。

1970到80年代,C語言被廣泛應用,從大型主機到小型微機,也衍生了C語言的很多不同版本。

1983年,美國國家標准協會(ANSI)成立了一個委員會X3J11,來制定 C語言標准。

1989年,美國國家標准協會(ANSI)通過了C語言標准,被稱為ANSI X3.159-1989 "Programming Language C"。因為這個標準是1989年通過的,所以一般簡稱C89標准。有些人也簡稱ANSI C,因為這個標準是美國國家標准協會(ANSI)發布的。

1990年,國際標准化組織(ISO)和國際電工委員會(IEC)把C89標準定為C語言的國際標准,命名為ISO/IEC 9899:1990 - Programming languages -- C 。因為此標準是在1990年發布的,所以有些人把簡稱作C90標准。不過大多數人依然稱之為C89標准,因為此標准與ANSI C89標准完全等同。

1994年,國際標准化組織(ISO)和國際電工委員會(IEC)發布了C89標准修訂版,名叫ISO/IEC 9899:1990/Cor 1:1994 ,有些人簡稱為C94標准。

1995年,國際標准化組織(ISO)和國際電工委員會(IEC)再次發布了C89標准修訂版,名叫ISO/IEC 9899:1990/Amd 1:1995 - C Integrity ,有些人簡稱為C95標准。

C99標准

1999年1月,國際標准化組織(ISO)和國際電工委員會(IEC)發布了C語言的新標准,名叫ISO/IEC 9899:1999 - Programming languages -- C ,簡稱C99標准。這是C語言的第二個官方標准。

參考資料:網路-c語言

④ gcc鏄浠涔堬紵

1銆乬cc

GCC錛圙NU Compiler Collection錛孏NU緙栬瘧鍣ㄥ椾歡錛夋槸鐢盙NU寮鍙戠殑緙栫▼璇璦璇戝櫒銆侴NU緙栬瘧鍣ㄥ椾歡鍖呮嫭C銆丆++銆 Objective-C銆 Fortran銆丣ava銆丄da鍜孏o璇璦鍓嶇錛屼篃鍖呮嫭浜嗚繖浜涜璦鐨勫簱錛堝俵ibstdc++錛宭ibgcj絳夈傦級

GCC鐨勫垵琛鋒槸涓篏NU鎿嶄綔緋葷粺涓撻棬緙栧啓鐨勪竴嬈劇紪璇戝櫒銆侴NU緋葷粺鏄褰誨簳鐨勮嚜鐢辮蔣浠躲傛ゅ勶紝鈥滆嚜鐢扁濈殑鍚涔夋槸瀹冨皧閲嶇敤鎴風殑鑷鐢便

2銆乴lvm+Clang

LLVM鏄鏋勬灦緙栬瘧鍣(compiler)鐨勬嗘灦緋葷粺錛屼互C++緙栧啓鑰屾垚錛岀敤浜庝紭鍖栦互浠繪剰紼嬪簭璇璦緙栧啓鐨勭▼搴忕殑緙栬瘧鏃墮棿(compile-time)銆侀摼鎺ユ椂闂(link-time)銆佽繍琛屾椂闂(run-time)浠ュ強絀洪棽鏃墮棿(idle-time)錛屽瑰紑鍙戣呬繚鎸佸紑鏀撅紝騫跺吋瀹瑰凡鏈夎剼鏈銆

LLVM璁″垝鍚鍔ㄤ簬2000騫達紝鏈鍒濈敱University of Illinois at Urbana-Champaign鐨凜hris Lattner涓繪寔寮灞曘2006騫碈hris Lattner鍔犵洘Apple Inc.騫惰嚧鍔涗簬LLVM鍦ˋpple寮鍙戜綋緋諱腑鐨勫簲鐢ㄣ侫pple涔熸槸LLVM璁″垝鐨勪富瑕佽祫鍔╄呫

3銆乄atcom C/C++

Watcom C/C++ 緙栬瘧鍣ㄣ乄atch Fortran 緙栬瘧鍣 緇忓凡鍦ㄤ笉鍏跺厛鍓嶆墍灞炲叕鍙窼ybase鍞鍗, 鑰岃 SciTech 杞浠跺叕鍙 浣滀負 Open Watcom 寮婧愬寘 鍙戣屻傜被浼間簬鍏朵粬鐨 寮婧愮紪璇戝櫒(渚嬪 [GCC])欏圭洰錛學atcom C浠g爜灝忚屼究鎼猴紝 鍏剁紪璇戝櫒鍚庣(浠g爜鐢熸垚鍣)鐨勭洰鏍囩爜鍙鍙樸

璇ョ紪璇戝櫒鍙鍦―OS銆丱S/2銆乄indows絳夋搷浣滅郴緇熶笂榪愯岋紝騫剁敓鎴愬悇縐嶅彲榪愯岀殑(涓嶅繀鏄璇ユ搷浣滅郴緇熺殑)浠g爜銆傝ョ紪璇戝櫒鏀鎸丯ovell NetWare鐨 NLM 鐩鏍囩爜銆傜洰鍓嶆h繘琛 涓 Linux銆乵odern BSD (渚嬪侳reeBSD) 鎿嶄綔緋葷粺 閲嶅畾鐩鏍囩爜錛屼互渚垮湪 x86銆丳owerPC 鍙娿鍏跺畠澶勭悊鍣ㄤ笂榪愯屻

Open Watcom C/C++ 鐨1.4鐗堜簬2005騫12鏈堝彂琛岋紝閲囩敤 Linux x86 涓哄疄楠岀洰鏍, 鏀鎸丯T銆丱S/2絳塰ost騫沖彴鏇炬湁鏌愯寮冪疆鐨凲NX鐗堟湰錛屼絾鍏剁紪璇戞墍欏葷殑搴撳苟鏈寮婧愬彂琛屻傚綋鍓嶆渶榪戠殑紼沖畾鐗堟槸1.9鐗堬紝鍦2010騫6鏈堝彂琛屻

4銆丏igital Mars

DigitalMars鏄涓嬈鵑珮鎬ц兘鐨勭紪璇戝櫒錛屽姛鑳藉寘鍚錛屽揩閫熺紪璇/閾炬帴鏃躲佸己澶х殑浼樺寲鎶鏈銆丆ontract璁捐°佸畬鏁寸殑璧勬簮搴撱佹祻瑙圚TML鏂囨。錛屽弽奼囩紪銆佸簱銆佽祫婧愮紪璇戝櫒絳夈傚懡浠よ屽強GUI鐗堟湰銆佹暀紼嬨佷唬鐮佺ず渚嬨佸湪綰挎洿鏂般佹爣鍑嗘ā鏉垮簱絳夌瓑銆

5銆丮SVC緋誨垪

涓嶸isual Studio闆嗘垚鍙戝竷錛屽井杞鑷宸辯殑緙栬瘧鍣錛孷S鏄涓涓鍩烘湰瀹屾暣鐨勫紑鍙戝伐鍏烽泦錛屽畠鍖呮嫭浜嗘暣涓杞浠剁敓鍛藉懆鏈熶腑鎵闇瑕佺殑澶ч儴鍒嗗伐鍏鳳紝濡俇ML宸ュ叿銆佷唬鐮佺℃帶宸ュ叿銆侀泦鎴愬紑鍙戠幆澧(IDE)絳夌瓑銆

鎵鍐欑殑鐩鏍囦唬鐮侀傜敤浜庡井杞鏀鎸佺殑鎵鏈夊鉤鍙幫紝鍖呮嫭Microsoft Windows銆乄indows Mobile銆乄indows CE銆.NET Framework銆.NET Compact Framework鍜孧icrosoft Silverlight 鍙奧indows Phone銆

⑤ 編譯原理中的句柄是什麼意思

是操作系統用來管理不同的對象,給他們一個編號而已

比如窗口、線程、圖標等都會對應一個句柄,這樣可以方便標識與管理

句柄其實也就是一個整數值,而且是唯一的

⑥ 交叉編譯器的分類

編譯器可以生成用來在與編譯器本身所在的計算機和操作系統(平台)相同的環境下運行的目標代碼,這種編譯器又叫做「本地」編譯器。另外,編譯器也可以生成用來在其它平台上運行的目標代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬體平台時非常有用。「源碼到源碼編譯器」是指用一種高階語言作為輸入,輸出也是高階語言的編譯器。例如: 自動並行化編譯器經常採用一種高階語言作為輸入,轉換其中的代碼,並用並行代碼注釋對它進行注釋(如OpenMP)或者用語言構造進行注釋(如FORTRAN的DOALL指令)。
預處理器(preprocessor)
作用是通過代入預定義等程序段將源程序補充完整。
編譯器前端(frontend)
前端主要負責解析(parse)輸入的源代碼,由語法分析器和語意分析器協同工作。語法分析器負責把源代碼中的『單詞』(Token)找出來,語意分析器把這些分散的單詞按預先定義好的語法組裝成有意義的表達式,語句 ,函數等等。 例如「a = b + c;」前端語法分析器看到的是「a, =, b , +, c;」,語意分析器按定義的語法,先把他們組裝成表達式「b + c」,再組裝成「a = b + c」的語句。 前端還負責語義(semantic checking)的檢查,例如檢測參與運算的變數是否是同一類型的,簡單的錯誤處理。最終的結果常常是一個抽象的語法樹(abstract syntax tree,或 AST),這樣後端可以在此基礎上進一步優化和處理。
編譯器後端(backend)
編譯器後端主要負責分析,優化中間代碼(Intermediate representation)以及生成機器代碼(Code Generation)。
一般說來所有的編譯器分析,優化,變型都可以分成兩大類:函數內(intraproceral)還是函數之間(interproceral)進行。很明顯,函數間的分析,優化更准確,但需要更長的時間來完成。

⑦ 編譯原理第三版清華大學

「編譯原理」是計算機專業非常重要的一門專業課,在計算機教學中有著舉足輕重的地位。

編譯原理中編譯系統是整個計算機系統中極其重要的系統軟體,它的作用是把計算機高級語言最終翻譯成等價的計算機指令,從而保證高級程序設計語言順利運行。所以,「編譯原理」是計算機科學中基本研究內容之一。

編譯器:編譯器是計算機程序中應用比較多的工具,在對編譯器進行前端設計時,一定要充分考慮影響因素,還要對詞法、語法、語義進行分析。

過程分析:將高級程序設吾言,如C、C++、Java等,翻譯成計算機可以執行的機器指令代碼流的過程,即是編譯的過程。編譯過程一般分為6個步驟,即詞法分析、語法分析、語義分析、中間代碼生成、中間代碼優化、目標代碼生成。

閱讀全文

與編譯器的前端包括什麼相關的資料

熱點內容
sha1加密演算法java 瀏覽:230
單片機ds1302程序 瀏覽:738
杜比壓縮開還是關怎樣判斷 瀏覽:366
對象類型轉換java編譯和運行 瀏覽:284
行政命令是什麼 瀏覽:371
android調用系統郵件 瀏覽:33
測溫軟體app是如何實現的 瀏覽:585
江蘇伺服器機房按需定製雲主機 瀏覽:639
c程序員筆試 瀏覽:694
excel怎麼引用統一文件夾 瀏覽:249
怎麼把微信抖音加密 瀏覽:304
android滑動進度條 瀏覽:834
javagmt轉換 瀏覽:826
linux查看snmp 瀏覽:24
ug80車床編程 瀏覽:518
怎麼加速python計算素數 瀏覽:242
腰椎第五節壓縮性骨折 瀏覽:92
程序員開會的句子 瀏覽:994
用哪個app寫編程 瀏覽:647
android通訊錄增刪改查 瀏覽:731