新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > GCC-維基百科

        GCC-維基百科

        作者: 時間:2010-05-13 來源:網絡 收藏

        Compiler Collection,編譯器套裝),是一套由開發的編程語言編譯器。它是一套以GPL及LGPL許可證所發行的,也是GNU計劃的關鍵部分,亦是自由的類Unix及蘋果電腦Mac OS X 操作系統的標準編譯器。(特別是其中的C語言編譯器)也常被認為是跨平臺編譯器的事實標準。

        本文引用地址:http://www.104case.com/article/257969.htm

        原名為GNU C語言編譯器(GNU C Compiler),因為它原本只能處理C語言。GCC很快地擴展,變得可處理C++。之后也變得可處理Fortran、Pascal、Objective-C、Java,以及Ada與其他語言。

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

        概觀


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

        在1997年,一群不滿GCC緩慢且封閉的創作環境者,組織了一個名為EGCS《Experimental/Enhanced GNU Compiler System》的專案,此專案匯整了數項實驗性的分支進入某個GCC專案的分支中。EGCS比起GCC的建構環境更有活力,且EGCS最終也在1999年四月成為GCC的官方版本。

        GCC目前由世界各地不同的數個程序設計師小組維護。它是移植到中央處理器架構以及操作系統最多的編譯器。

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

        GCC通常是跨平臺軟件的編譯器首選。有別于一般局限于特定系統與運行環境的編譯器,GCC在所有平臺上都使用同一個前端處理程序,產生一樣的中介碼,因此此中介碼在各個其他平臺上使用GCC編譯,有很大的機會可得到正確無誤的輸出程序。

        目前支持的語言


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

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

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

        Fortran前端在4.0版之前是G77,此前端僅支持Fortran 77。在本版本中,G77被廢棄而采用更新的GFortran,因為此前端支持Fortran 95。

        下列前端依然存在:

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

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

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


        支持的處理器架構


        GCC目前支持下列處理器架構(以4.1版為準):

        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家族

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

        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個別維護的GCC處理器架構:

        D10V
        MicroBlaze
        PDP-10
        MSP430
        Z8000

        當GCC需要移植到一個新平臺上,通常使用此平臺固有的語言來撰寫其初始階段。


        結構


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

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

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


        前端界面


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

        直到最近,程序的語法樹結構尚無法與欲產出的處理器架構脫鉤。而語法樹的規則有時在不同的語言前端也不一樣,有些前端會提供它們特別的語法樹規則。

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


        中介界面


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


        后端界面


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

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

        后端經由一重讀取步驟后,利用描述目標處理器的指令集時所取得的信息,將抽象寄存器替換成處理器的真實寄存器。此階段非常復雜,因為它必須關照所有GCC可移植平臺的處理器指令集的規格與技術細節。

        后端的最后步驟相當公式化,僅僅將前一階段得到的匯編語言碼借由簡單的副函數轉換其寄存器與存儲器位置成相對應的機器代碼。


        替GCC程序除錯


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



        關鍵詞: GCC GNU 自由軟件

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 景德镇市| 高淳县| 宝鸡市| 浦北县| 株洲县| 鄂伦春自治旗| 沙洋县| 庆安县| 潜山县| 榆中县| 梅州市| 渭南市| 永靖县| 古浪县| 满城县| 凤台县| 唐河县| 西平县| 东明县| 横峰县| 龙泉市| 曲沃县| 宁河县| 沁水县| 盐亭县| 政和县| 石景山区| 宁德市| 聂拉木县| 金乡县| 长子县| 色达县| 杨浦区| 秦安县| 塘沽区| 灵璧县| 井冈山市| 武功县| 紫阳县| 昌图县| 日照市|