共找到4條詞條名為GCC的結果 展開

GCC

編程語言編譯器

GCC(GNU Compiler Collection,GNU編譯器套裝),是一套由 GNU 開發的編程語言編譯器。它是一套以 GPL 及 LGPL 許可證所發行的自由軟體,也是 GNU計劃的關鍵部分,亦是自由的類Unix及蘋果電腦 Mac OS X 操作系統的標準編譯器。

正文


GNU編譯器套裝
GCC
GCC
開發者 The GNU Project
最新穩定版 4.1.2 / 2月14日, 2007年
操作系統 跨平台
類型 編譯器
許可協議 GPL
網站 gcc.gnu.org
GCC 原名為 GNU C 語言編譯器,因為它原本只能處理 C語言。GCC 很快地擴展,變得可處理 C++。之後也變得可處理 Fortran、Pascal、Objective-C、Java, 以及 Ada與其他語言。

概觀


GCC是由理查德·馬修·斯托曼在1985年開始的。他首先擴增一個舊有的編譯器,使它能編譯C,這個編譯器一開始是以Pastel語言所寫的。Pastel是一個不可移植的Pascal語言特殊版,這個編譯器也只能編譯Pastel語言。為了讓自由軟體有一個編譯器,後來此編譯器由斯托曼和Len Tower在1987年以C語言重寫並成為GNU專案的編譯器。GCC的建立者由自由軟體基金會直接管理。
在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

支援的處理器架構


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,一個試圖發現緩衝區溢位〈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語法樹形式,便顯得比較不重要。
後端經由一重讀取步驟后,利用描述目標處理器的指令集時所取得的資訊,將抽象暫存器替換成處理器的真實暫存器。此階段非常複雜,因為它必須關照所有GCC可移植平台的處理器指令集的規格與技術細節。
後端的最後步驟相當公式化,僅僅將前一階段得到的組合語言碼藉由簡單的副函式轉換其暫存器與內存位置成相對應的機械碼。

替 GCC 程序除錯


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

GCC編譯器的使用


首先檢查是否在你的機器上安裝了GCC,使用命令:
可用rpm -q gcc 檢查。
如果沒有安裝,請依序檢查並安裝下面各RPM
libbinutils
binutils
make
glibc-devel
gcc-cpp
gcc
看下面的例子:test.c
#include
main()
{ char *str="I like Linux! I advices you jion in the Linux World";
printf("%s ",str);
exit(0);
}
使用gcc編譯。輸入gcc -c test.c得到目標文件test.o.-c命令表示對文件進行編譯和彙編。但並不連接。如果再健入gcc -o ../bin/test test.o,那麼將得到名為test的可執行文件。其實這兩不可以一氣呵成,gcc ../bin/test test.c.如果程序沒有錯誤救生成了可執行文件。也許你會覺得基於命令行的編譯器比不上如VC之類的集成開發環境,的確gcc的界面要改進,但是你一旦熟練了就會感到。gcc的效率如此之高。可以告訴大家的是Linux底下強大的C/C++集成開發環境Kdevelope和Vc一樣強大,使用了Gcc編譯器。
GNU C編譯器 即gcc是一個功能強大的ANSI C兼容編譯器,你會操作其他操作系統下的一種C編譯器,能很快掌握GCC,我也是學了不久的GCC.
1、使用Gcc,Gcc是基於命令行的,使用時通常後跟一些選項和文件名。Gcc的基本用法如下: gcc [options] [filenames] 命令行選項制定操作將對命令行上的每個給出的文件執行。
2、GCC的常用選項
編譯選項:gcc有超過100個的編譯選項可用。具體的可以使用命令man gcc察看
優化選項:用GCC編譯C/C++代碼時,它會試著用最少的時間完成編譯並且編譯后的代碼易於調試。易於調試意味著編譯后的代碼與源代碼有同樣的執行順序,編譯后的代碼沒有經過優化。有很多的選想可以告訴GCc在耗費更多編譯時間和犧牲易調試性的基礎上產生更小更快的可執行文件。這些選項中最典型的就是-O和-O2。-O選項告訴gcc對源代碼進行基本優化。-O2選項告訴Gcc產生儘可能小的和儘可能快的代碼。還有一些很特殊的選項可以通過man gcc察看。
調試和剖析選項:GCC支持數種調試剖析選項。在這些選項中最常用的是-g和-pg.-g選項告訴gcc產生能被GNU調試器(如gdb)使用的調試信息,以便調試用戶的程序。-pg選項告訴gcc在用戶的程序中加入額外的代碼,執行時,產生gprof用的剖析信息以顯示程序的耗時情況。
3、使用gdb
使用方法:在命令行中健入gdb並按回車就可以運行gdb了,啟動gdb后,能在命令行上制定很多的選項,也可以下面的方式來運行gdb: gdb filename 用這種方式運行gdb時,能直接指定想要調試的程序。在命令行上健入gdb -h得到一個有關gdb的選項的說明簡單列表。
編譯代碼以供調試,為了使gdb工作,必須使程序在編譯時包含調試信息,調試信息包含程序里的每個變數的類型,在可執行文件里的地址映射以及源代碼的行號。gdb利用這些信息使源代碼和機器碼相關聯。
關於gcc的大體就寫這麼多吧,根多的信息可以查找幫助,記得學習Linux的一大武器man或者info命令,下次在介紹一下使用c/C++編寫大型程序的makefile文件和make命令。