<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          GCC-維基百科

          作者: 時(shí)間:2010-05-13 來源:網(wǎng)絡(luò) 收藏

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

          本文引用地址:http://www.ex-cimer.com/article/257969.htm

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

          目錄 [隱藏]
          1 概觀
          2 目前支持的語言
          2.1 內(nèi)嵌OpenMP支持
          3 支持的處理器架構(gòu)
          4 結(jié)構(gòu)
          4.1 前端界面
          4.2 中介界面
          4.3 后端界面
          5 替GCC程序除錯(cuò)
          6 參考書目及注釋
          7 參閱
          8 更多閱讀
          9 外部鏈接

          概觀


          GCC是由理查德·馬修·斯托曼在1985年開始的。他首先擴(kuò)增一個(gè)舊有的編譯器,使它能編譯C,這個(gè)編譯器一開始是以Pastel語言所寫的。Pastel是一個(gè)不可移植的Pascal語言特殊版,這個(gè)編譯器也只能編譯Pastel語言。為了讓有一個(gè)編譯器,后來此編譯器由斯托曼和Len Tower在1987年[1]以C語言重寫[2]并成為GNU專案的編譯器。GCC的建立者由基金會(huì)直接管理[3]。

          在1997年,一群不滿GCC緩慢且封閉的創(chuàng)作環(huán)境者,組織了一個(gè)名為EGCS《Experimental/Enhanced GNU Compiler System》的專案,此專案匯整了數(shù)項(xiàng)實(shí)驗(yàn)性的分支進(jìn)入某個(gè)GCC專案的分支中。EGCS比起GCC的建構(gòu)環(huán)境更有活力,且EGCS最終也在1999年四月成為GCC的官方版本。

          GCC目前由世界各地不同的數(shù)個(gè)程序設(shè)計(jì)師小組維護(hù)。它是移植到中央處理器架構(gòu)以及操作系統(tǒng)最多的編譯器。

          由于GCC已成為GNU系統(tǒng)的官方編譯器(包括GNU/Linux家族),它也成為編譯與建立其他操作系統(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ì)可得到正確無誤的輸出程序。

          目前支持的語言


          以2006年5月24日釋出的4.1.1版為準(zhǔn),本編譯器版本可處理下列語言:

          Ada 《GNAT》
          C 《GCC》
          C++(G++)
          Fortran 《Fortran 77: G77,F(xiàn)ortran 90: GFORTRAN》
          Java 《編譯器:GCJ;解釋器:GIJ》
          Objective-C 《GOBJC》
          Objective-C++

          先前版本納入的CHILL前端由于缺乏維護(hù)而被廢棄。

          Fortran前端在4.0版之前是G77,此前端僅支持Fortran 77。在本版本中,G77被廢棄而采用更新的GFortran,因?yàn)榇饲岸酥С諪ortran 95。

          下列前端依然存在:

          Modula-2
          Modula-3
          Pascal
          PL/I
          D語言
          Mercury
          VHDL

          [編輯] 內(nèi)嵌OpenMP支持
          OpenMP是一種跨語言的對(duì)稱多處理器(SMP)多線程并行程序的編程工具,也非常適合當(dāng)今越來越流行的單CPU多核硬件環(huán)境,因此從gcc4.2開始,OpenMP成為其內(nèi)嵌支持的并行編程規(guī)范,可以直接編譯內(nèi)嵌OpenMP語句的C/C++/Fortran95的源代碼。gcc4.2之前如果想在C/C++/Fortran中嵌入OpenMP語句的話,需要額外安裝庫和預(yù)處理器才能識(shí)別和正確處理這些語句。

          gcc 4.2.0開始支持OpenMP v2.5
          gcc 4.4.0開始支持OpenMP v2.5及v3.0
          參見GNU的GOMP計(jì)劃


          支持的處理器架構(gòu)


          GCC目前支持下列處理器架構(gòu)(以4.1版為準(zhǔn)):

          Alpha
          ARM
          Atmel AVR
          Blackfin
          H8/300
          IA-32(x86)與x86-64
          IA-64例如:Itanium
          MorphoSys家族
          Motorola 68000
          Motorola 88000
          MIPS
          PA-RISC
          PDP-11
          PowerPC
          System/370,System/390
          SuperH
          HC12
          SPARC
          VAX
          Renesas R8C/M16C/M32C家族

          較不知名的處理器架構(gòu)也在官方釋出版本中支持:

          A29K
          ARC
          C4x
          CRIS
          D30V
          DSP16xx
          FR-30
          FR-V
          Intel i960
          IP2000
          M32R
          68HC11
          MCORE
          MMIX
          MN10200
          MN10300
          NS32K
          ROMP
          Stormy16
          V850
          Xtensa

          由FSF個(gè)別維護(hù)的GCC處理器架構(gòu):

          D10V
          MicroBlaze
          PDP-10
          MSP430
          Z8000

          當(dāng)GCC需要移植到一個(gè)新平臺(tái)上,通常使用此平臺(tái)固有的語言來撰寫其初始階段。


          結(jié)構(gòu)


          GCC的外部界面長得像一個(gè)標(biāo)準(zhǔn)的Unix編譯器。用戶在命令行下鍵入gcc之程序名,以及一些命令參數(shù),以便決定每個(gè)輸入文件使用的個(gè)別語言編譯器,并為輸出代碼使用適合此硬件平臺(tái)的匯編語言編譯器,并且選擇性地運(yùn)行鏈接器以制造可運(yùn)行的程序。

          每個(gè)語言編譯器都是獨(dú)立程序,此程序可處理輸入的源代碼,并輸出匯編語言碼。全部的語言編譯器都擁有共通的中介架構(gòu):一個(gè)前端解析符合此語言的源代碼,并產(chǎn)生一抽象語法樹,以及一翻譯此語法樹成為GCC的寄存器轉(zhuǎn)換語言《RTL》的后端。編譯器優(yōu)化與靜態(tài)代碼解析技術(shù)(例如FORTIFY_SOURCE[1],一個(gè)試圖發(fā)現(xiàn)緩存溢出《buffer overflow》的編譯器)在此階段應(yīng)用于代碼上。最后,適用于此硬件架構(gòu)的匯編語言代碼以Jack Davidson與Chris Fraser發(fā)明的算法產(chǎn)出。

          幾乎全部的GCC都由C寫成,除了Ada前端大部分以Ada寫成。


          前端界面


          前端的功能在于產(chǎn)生一個(gè)可讓后端處理之語法樹。此語法解析器是手寫之遞歸語法解析器。

          直到最近,程序的語法樹結(jié)構(gòu)尚無法與欲產(chǎn)出的處理器架構(gòu)脫鉤。而語法樹的規(guī)則有時(shí)在不同的語言前端也不一樣,有些前端會(huì)提供它們特別的語法樹規(guī)則。

          在2005年,兩種與語言脫鉤的新型態(tài)語法樹納入GCC中。它們稱為GENERIC與GIMPLE。語法解析變成產(chǎn)生與語言相關(guān)的暫時(shí)語法樹,再將它們轉(zhuǎn)成GENERIC。之后再使用gimplifier技術(shù)降低GENERIC的復(fù)雜結(jié)構(gòu),成為一較簡單的靜態(tài)唯一形式(Static Single Assignment form,SSA)基礎(chǔ)的GIMPLE形式。此形式是一個(gè)與語言和處理器架構(gòu)脫鉤的全局優(yōu)化通用語言,適用于大多數(shù)的現(xiàn)代函數(shù)編程語言。


          中介界面


          一般編譯器作者會(huì)將語法樹的優(yōu)化放在前端,但其實(shí)此步驟并不看語言的種類而有不同,且不需要用到語法解析器。因此GCC作者們將此步驟歸入通稱為中介階段的部分里。此類的優(yōu)化包括消解死碼、消解重復(fù)計(jì)算與全局?jǐn)?shù)值重編碼等。許多優(yōu)化技巧也正在實(shí)現(xiàn)中。


          后端界面


          GCC后端的行為因不同的前處理器宏和特定架構(gòu)的功能而不同,例如不同的字符尺寸、調(diào)用方式與大小尾序等。后端界面的前半部利用這些消息決定其RTL的生成形式,因此雖然GCC的RTL理論上不受處理器影響,但在此階段其抽象指令已被轉(zhuǎn)換成目標(biāo)架構(gòu)的格式。

          GCC的優(yōu)化技巧依其釋出版本而有很大不同,但都包含了標(biāo)準(zhǔn)的優(yōu)化算法,例如循環(huán)優(yōu)化、線程跳躍、共通程序子句消減、指令調(diào)度等等。而RTL的優(yōu)化由于可用的情形較少,且缺乏較高級(jí)的信息,因此比較起近來增加的GIMPLE語法樹形式[2],便顯得比較不重要。

          后端經(jīng)由一重讀取步驟后,利用描述目標(biāo)處理器的指令集時(shí)所取得的信息,將抽象寄存器替換成處理器的真實(shí)寄存器。此階段非常復(fù)雜,因?yàn)樗仨氷P(guān)照所有GCC可移植平臺(tái)的處理器指令集的規(guī)格與技術(shù)細(xì)節(jié)。

          后端的最后步驟相當(dāng)公式化,僅僅將前一階段得到的匯編語言碼借由簡單的副函數(shù)轉(zhuǎn)換其寄存器與存儲(chǔ)器位置成相對(duì)應(yīng)的機(jī)器代碼。


          替GCC程序除錯(cuò)


          為GCC除錯(cuò)的首選工具當(dāng)然是GNU除錯(cuò)器。其他特殊用途的除錯(cuò)工具是Valgrind,用以發(fā)現(xiàn)存儲(chǔ)器泄漏 (Memory leak)。而GNU測量器(gprof)可以得知程序中某些函數(shù)花費(fèi)多少時(shí)間,以及其調(diào)用頻率;此功能需要用戶在編譯時(shí)選定測量《profiling》選項(xiàng)。



          關(guān)鍵詞: GCC GNU 自由軟件

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();