1、1,第一章,計算機概論與C語言簡介,2,在本章中,我們將回顧一些計算機概論的基本知識,藉由這些基本知識,進而學習電腦的程式設計。除此之外,我們也將針對C語言的編譯器及執行環境做一些說明,加強讀者在往後章節中練習範例時所需要的基本知識。,3,大綱,1.1 電腦硬體 1.1.1 算數邏輯單元(Arithmetic and Logic Unit) 1.1.2 控制單元(Control Unit) 1.1.3 記憶體單元(Memory unit and Storage Unit) 1.1.4 輸入單元(Input unit) 1.1.5 輸出單元(Output unit) 1.2 電腦軟體 1.3 程
2、式語言 1.3.1 機器語言 1.3.2 低階語言 1.3.3 高階語言 1.4 C語言簡介,4,大綱(續),1.5 程式開發流程與編譯器 1.5.1 C語言程式的開發流程 1.5.2 編譯器(Compiler)【補充】 1.5.3 整合開發環境(IDE;Integrated Development Environment) 1.6 編譯器與程式開發實例 1.6.1 GCC編譯器 1.6.2 Dev-C+整合開發環境 1.6.3 Borland C+ Builder 1.7 本章回顧及下章預覽,5,1.1 電腦硬體,電腦硬體就是您可以看到的電腦設備(拆開外殼),不過若光是這樣形容電腦硬體未免過
3、於簡單。實際上,若從功能面加以區分,可將電腦硬體分為5大單元(如下圖),5個單元分別負責不同的工作。【註】: 算數邏輯單元與控制單元 合稱中央處理單元(就是 常聽到的CPU),中央處理 單元和主記憶體則為電腦 的核心部分,其餘的周邊 設備(輸入單元與輸出 單元)必須與之連結, 透過中央處理單元的控制 ,使周邊設備正常運作。,6,算數邏輯單元(簡稱ALU)是執行程式中各類運算的實體單位。這些運算則可以分為兩大類:算數運算與邏輯運算。算數運算包含加、減、乘、除等等的數值運算,而邏輯運算則包含AND、OR、NOT、移位等位元位元組的邏輯運算。,1.1.1 算數邏輯單元,7,1.1.2 控制單元,控制
4、單元(簡稱CU)的功能為控制流程及協調輸入、輸出、記憶、算數邏輯等4大單元的運作。控制單元中包含(1)記錄指令運作順序的微程式(microprogram)、(2)取得下一指令的邏輯電路 (3)驅動元件的解碼器(decoder)及(4)眾多選擇器(multiplexer)。 當指令進入CPU之後,控制元件會先進行指令解碼(Decode),並按照指令種類執行對應的微程式,發出不同的訊號完成該指令所需要完成的各項功能,最後執行邏輯電路以便取得下一個指令。,8,1.1.3 記憶體單元,記憶體單元分為主記憶體(main memory)與輔助記憶體(secondary memory),主要功能是用來儲存資
5、料(程式也是一種資料),任何要被執行的程式都必須放置於主記憶體中,CPU才能存取該程式,對於新型的作業系統而言,會將部分的輔助記憶體當作是虛擬的主記憶體以便解決程式過多或過大而無法完全載入主記憶體的問題。,9,1.1.3 記憶體單元,主記憶體(又稱為內部記憶體),目前以半導體元件制成,特性為存取速度快、成本高。主記憶體依照存取特性又可以分為隨機存取記憶體(Random Access Memory;簡稱RAM)及唯讀記憶體(Read Only Memory;簡稱ROM)。 RAM的成本較低,但是無法於電力消失時保存資料,故為揮發性記憶體的一種。ROM成本較高,但卻可以在無電力的狀況下保存資料,傳
6、統的ROM只能寫入資料一次,因此通常只會把啟動電腦所需要的小程式儲存在ROM裡面,例如BIOS就是使用ROM做為記憶體。 【註】:目前ROM已經發開成可以重複寫入資料,例如:EPROM、EEPROM等。其中的P為Programmable的縮寫,稱為可程式化的ROM,清除原本資料的方式則與RAM有所不同,例如使用紫外線清除資料以及較高電壓清除資料。但成本仍比一般的RAM高出許多。 輔助記憶體(又稱為外部記憶體),目前以磁性物體或光學材料組成,例如:硬碟機、軟碟片、光碟片。輔助記憶體的存取速度相對於主記憶體慢了數十倍以上,但製作成本則比主記憶體低了數十倍以上,因此適合儲存大量的資料。,10,1.1
7、.4 輸入單元,輸入單元是具有輸入功能的週邊設備,例如鍵盤、滑鼠、搖桿等等。使用者可以藉由這些輸入裝置與電腦取得溝通的管道。,11,輸出單元恰與輸入單元相反,所有具有輸出功能的設備皆屬輸出單元的元件,主要功能是將程式執行的結果(文字、聲音、影像)輸出或顯示。常見的輸出裝置有螢幕、印表機等等。某些週邊設備同時具有輸入與輸出的功能,例如:觸控式螢幕、會震動的搖桿等等。【註】:對於Linux/Unix作業系統而言,任何除了CPU與主記憶體之外的設備都可將之視為週邊輸出入設備,因此,硬碟機也被視為輸出入的裝置(device),如果您對Linux指令熟悉的話,可以很簡單的把原本應該輸出到螢幕的文字,轉換
8、為輸出到檔案。,1.1.5 輸出單元,12,電腦軟體分為資料與程式兩大類,事實上不論是哪一類,都是以0、1的二位元表示法儲存在電腦設備中(例如:儲存於硬碟機中)。而程式又可以分為系統程式(System Program)與應用程式(Application Program)。系統程式一般為較接近硬體底層的低階程式,例如:作業系統(Operating System)、編譯程式(Compiler)、組譯程式(Assembler),連結程式(Linker)等都屬於系統程式。應用程式則是架構在系統程式之上,依據某種特殊需求而開發出來的軟體,例如:Office、帳務系統、電腦遊戲等等。,1.2 電腦軟體,系
9、統程式與應用程式關係圖,系統程式與應用程式階層圖,13,1.3 程式語言,語言的用途是做為人與人溝通的橋樑,例如:和美國人交談就要用英文溝通。同樣地,人若要和電腦溝通的話,就必須使用電腦懂的語言,這種語言稱為程式語言(Programming Language)。而一般我們用來與人溝通的語言則稱為自然語言(Natural Language)。 程式語言依據與自然語言的相似度又可以分為3種:機器語言、低階語言及高階語言。其中高階語言與人類所使用的自然語言最為相近,而機器語言則和人類所使用的語言南轅北轍。,14,1.3 程式語言,圖1-6 程式語言分類,15,機器語言(Machine Languag
10、e)是電腦硬體唯一看得懂的語言,換句話說,機器語言就是一連串的0、1二進位數字組合,因此又稱為機器碼。一般人通常看不懂這些0、1所代表的特殊涵義,其實對於電腦而言,這些0、1 的組合數字,可能代表某種資料,也可能代表某個指令。由於大多數的人無法了解或記憶這一連串0、1數字所代表的涵義,因而發展了低階語言與高階語言。 【註】:資料或程式確實是用二進位表示,但有的時候為了縮短這一連串的二進位數字表示,某些書籍或軟體會將機器語言使用16進制來加以表達。例如:0100100149H。,1.3.1 機器語言,16,1.3.2 低階語言,低階語言(Low-level Language)是一種接近於機器語言
11、的表示方法,不過卻使用人類比較容易記憶的單字形式來對應一連串的0、1組合。最典型的低階語言就是組合語言(Assembly Language)。在組合語言中,使用運算子與運算元來表示一連串的0、1組合,而這些運算子則使用類似英文的縮寫以利人類的記憶與理解,例如:使用INC來代表Increment(累加指令)。,17,1.3.2 低階語言,在上表中,很明顯的可以看出,組合語言的指令與機器語言的指令是一對一的對應關係,但是卻比機器語言容易記憶,除此之外,其他組合語言的設計都與機器語言的設計相同,我們可以從下表中更明確地看出兩者的相同與相異處:,8051組合語言指令與機器語言指令的對應,x86組合語言
12、與機器語言的對應,18,由上述的兩個表格中,我們可以得知幾件事,(1)組合語言比機器語言更接近人類所使用的自然語言。(2)不同的CPU所使用的組合語言也不相同。(3)任何一個完整的組合語言指令恰好對應一組機器語言的0、1串列。 組合語言與機器語言一對一的特性,使得組合語言可以完全掌控電腦的硬體結構,如此一來,在執行效率上自然也就完全交由程式設計師決定。不過,由於不同的CPU必須使用不同的組合語言並且必須對於該CPU的組織結構有充分認知,因此,這種低階語言仍舊無法被絕大多數的人所接受,因而發展了更接近於人類自然語言的高階語言。 【註】:組譯程式(Assembler)是一種用來將組合語言轉換為機器
13、語言的一套程式,相較於其他系統程式而言,組譯程式屬於一種比較容易開發的系統程式。,1.3.2 低階語言,19,組合語言雖然比機器語言更接近於自然語言,但組合語言的程式設計師必須對於執行程式的處理器有更多的了解,並且每個處理器的組合語言並不相同,因此,一種比組合語言更接近自然語言且不因更換機器而改變語法的程式語言也被發展出來,此種語言就是高階語言。 高階語言(High-level Language)使用更接近人類思維的方式來設計程式,當程式設計完成之後,必須通過另外一些翻譯程式的翻譯後才能夠被電腦執行。高階語言的運算子通常具有比較強大的功能,因此,單一行的高階語言程式可能被翻譯成許多的機器碼以便
14、完成複雜的工作。 依據手續的不同,我們可以將高階語言區分成編譯式語言與直譯式語言。編譯式語言的翻譯程式稱為編譯器(compiler),而直譯語言的翻譯程式稱為直譯器(interpreter)。由於編譯器與直譯器比起組譯器的功能更為強大及複雜,因此,高階語言通常具有較高的硬體獨立性(machine independent),也就是具有可攜性(portable)。換句話說,當您在A機器上所撰寫的高階語言程式,如果想要拿到B機器上執行時,通常不需要修改程式或只需要小幅度的修改,因為您只需要更換另外一套在B機器上執行的編譯器或直譯器就可以將程式重新翻譯並在B機器上正確執行。,1.3.3 高階語言,20
15、,編譯式語言 編譯器採用整批作業(Batch)方式來處理程式翻譯的工作,換句話說,當我們將程式設計完畢並交由編譯器翻譯之後,編譯器會將翻譯結果存成一個目的檔(object file),而這個目的檔可經由連結其他目的檔及程式庫之後形成可執行檔(execute file),並由電腦直接執行。常見的編譯式語言有C、C+(編譯器為gcc、g+、VC+、BCB)、Pascal、Object Pascal(編譯器為Delphi、Kylix)等等。 編譯式語言使用模組化技巧,也就是把某些具有特殊功能的片段程式獨立成一個個的函式,並將之集合成一個函式庫檔案,如此一來,就可以讓需要使用該功能的程式透過連結的方式
16、加以結合,縮短撰寫程式的時間。例如:ANSI-C的math函式庫中就包含許多求三角函數的函式,所以我們並不需要自行撰寫求三角函數的詳細步驟,只要在需要求三角函數值時,引用Math函式庫即可。一個基本編譯式語言的程式處理流程如下圖。,1.3.3 高階語言,21,1.3.3 高階語言,編譯式語言的程式處理流程,22,1.3.3 高階語言,直譯式語言 直譯器與編譯器處理程式的步驟不同,當我們使用直譯式語言撰寫程式完畢並使用直譯器來翻譯程式時,並不會產生目的檔或可執行檔。直譯器會將程式一行一行的讀入,逐行翻譯並送交由電腦執行,因此,每一次要執行編譯式語言程式時,都必須啟動直譯器來重新翻譯程式。也正因為
17、如此,所以當程式中有錯誤發生時,前面沒有錯誤的程式仍會被執行,並且停留在錯誤的那一行程式,因此較適合用於程式開發過程,這一點則與編譯式語言完全不同。所以 ,直譯器具有監督執行狀況的效果。常見的JavaScript、VBScript、Python等都屬於直譯式語言。,直譯式語言的程式處理流程,23,1.3.3 高階語言,【註】: 近年來,由於整合式開發環境(Integrated Development Environment,簡稱IDE)的發展,使得編譯式語言也同樣可以具有監督程式逐行執行的能力,因此,也改善了編譯程式開發除錯的困難。【謬誤與探討】: 在前面提過C語言是編譯式語言,但事實真的是如
18、此嗎?其實這是有爭議的。許多老師及作者在課本(包含本書某些部分)或授課過程中,都會將C、C+等稱為編譯式語言,但事實上,在眾多程式語言的原文聖經等級書籍中,從未看到此類敘述。這是由於程式語言原本就沒有這種分類,編譯器與直譯器只不過是實現程式的工具。例如一般我們會使用C的編譯器來編譯C程式,但事實上,歷史也曾經出現過許多特定用途的C直譯器(Interpreter),例如Stanford大學的Thetis C Interpreter以及極高階語言的CH(superset of C interpreter)。若有興趣者,可至下列網站查詢。 ttp:/cse.stanford.edu/ http:/i
19、el.ucdavis.edu/CH/,24,1.4 C語言簡介,C語言與C+語言有著奧妙的關係,因此有人說,C+是C語言的延伸,也有人說,C+是一種全新的語言。這兩種說法都算正確,因為C+是使用基本的C語言語法,但C+更重要的是一種全新的物件導向觀念。在本節中,我們將分別介紹這兩種語言的特色與歷史背景。 C語言是在70年代,由貝爾實驗室的Ken Thompson與Dennis Ritchie共同發展的一套電腦語言,該版本稱為K & R C。之後美國國家標準協會(ANSI)於1983年將C語言標準化,制訂出一套標準的C語言,稱為ANSI-C(於1988年完成制定),該版本則為各種C語言編譯器統一
20、支援的版本,其語法請見附錄E。 有了標準之後,C語言便具有可攜性。除此之外,由於C語言不但具有指標可以直接存取記憶體的資料,並且又是高階語言中最低階的一種程式語言,例如,C語言可以在某些環境下操控硬體資源,甚至於是直接嵌入組合語言(不過當您使用這些指令的時候,將會降低C語言原本的可攜性)。以上種種,使得C語言成為一個非常成功的語言,並且在之後加入物件導向形成C+語言,因此,直到目前為止,C及C+仍是最多程式設計師所使用的程式語言。,25,C語言的發展歷史有其特殊背景,C語言原本不叫做C語言,而是另一種程式語言B語言,Ken Thompson與Dennis Ritchie兩人為了設計UNIX作業
21、系統,因此將B語言加以延伸為C語言,由於具有容易開發、效率高及可操控硬體等特性,因此同樣是由貝爾實驗室所發展的UNIX系統,系統核心的大部分程式碼都是使用C來撰寫,並且在UNIX作業系統中的公用程式及C語言的編譯器也是由C所撰寫的。 【Q】:為何C的編譯器程式可以用C來撰寫呢?那用來撰寫編譯器的C程式又必須用什麼東西來編譯呢?答案當然也是編譯器囉,但這個編譯器又是用什麼語言撰寫而成的呢?這類問題,時常是初學程式語言讀者心中的一大疑問。(一種程式語言的第一個編譯器是如何寫成的呢?) 【A】:其實最基本的C編譯器確實是由組合語言來撰寫的,但是這個基本編譯器只提供了幾個簡單的C指令(例如:10個指令
22、),然後我們就可以利用這10個指令來撰寫提供更多指令的C編譯器,如此週而復始,編譯器所提供的C語言指令就越來越多,直到符合所有ANSI-C所定義的指令為止,如此一來,除了最基本的編譯器是由組合語言完成的之外,其餘發展中各階段的編譯器就是使用該高階語言撰寫的,這種技巧,在編譯器的發展理論中常常可以看到。,1.4 C語言簡介,26,命令式型態程式語言(Imperative Paradigm Programming Language) 命令式型態的程式語言是透過一連串指定敘述(assign statement)組合而成,指定敘述是表示式(expression),將一些子運算式加以組合,只要依序執行這
23、些敘述就可以得到結果,C語言是一種命令式型態的程式語言,其他諸如BASIC、Pascal、FORTRAN、COBOL等也都屬於此類程式語言。上述是一個C語言表示式,說明了C語言屬於命令式型態的程式語言。而上述的運算式,若以數學式子來表示,則為xt+1 = xt + 1,其中t代表時間。 命令式型態的語言通常提供了幾種基本的控制流程結構,包含循序流程結構、選擇流程結構、迴圈流程結構等等,我們將在本書中陸續介紹這幾種流程控制。,1.4 C語言簡介,x=x+1;,27,結構化程式語言(Structural Programming Language) C語言是一種結構化程式語言,也就是採用結構化分析設
24、計的方法,將問題由上向下,由大到小切割成許多子問題,分別尋得子問題的解答,最後再結合起來解決所要解決的問題。這種方法,也可以稱為模組化設計。解決子問題的方法被分成一個個的模組,在C語言中則稱為函式。在C的程式設計中,程式設計師必須設計並組合這些函式來解決問題。 除此之外,一個結構化的程式語言還有另一項重要的特性,也就是使用for、while等條件式迴圈來取代goto無條件跳躍指令。C語言是結構化的程式語言,雖然它仍提供了goto敘述(在C語言中,指令被稱之為敘述),但卻建議使用者萬不得已不要使用goto敘述。,1.4 C語言簡介,28,C+物件導向程式語言(OOPL;Object-Orient
25、ed Programming Language) C語言在發展超大型程式時遇到了一些維護上的困難,因此後來貝爾實驗室的Bjarne Stroustrup博士將C語言加上物件導向設計(OOD;Object-Oriented Design)而成為C+語言。簡單的說,C語言可以視為C+語言的子集,而更明確的說,C+是基於C的語法並加上物件導向觀念所構成的一種新的程式語言,因此我們可以將C+與C以集合關係加以表示如下圖。,1.4 C語言簡介,29,從上圖可知,C語言是C+語言中,除了OOP概念以外的部分。所以一般常聽到的C+程式設計,其實也已經包含了C程式設計。由於C+語言推廣非常順利,並且包含了所有
26、的C語言語法,因此,目前幾乎沒有純C語言的編譯器了,而大多數程式設計師都會使用C+編譯器來編譯C語言程式。 明顯地,C+語言比C語言複雜一些,因此,可以完成更大型的程式。但由於C語言的效率以及更接近硬體的特性,因此,在某些強烈要求效率的場合中(例如:撰寫作業系統及驅動程式),我們仍會使用純C語言(有時與組合語言配合)而不使用C+語言來設計程式。,1.4 C語言簡介,30,1.5 程式開發流程與編譯器,開發C語言程式完成後,必須經過編譯才能夠被執行,在附錄中,我們列出了許多可以編譯C語言的編譯器,除此之外,在本節中,我們也將針對C語言編譯器的基本觀念加以說明,建立一些關於C語言編譯器的基本觀念。
27、,31,1.5.1 C語言程式的開發流程,開發任何編譯式語言程式都有一定的流程(如右圖),開發C語言的應用程式也同樣可以透過下圖流程加以完成。,圖1-10 程式開發流程,32,1.5.1 C語言程式的開發流程,Step1: 編輯與設計程式,您可以使用任何的純文字編輯器來編輯C/C+程式(例如:Windows的筆記本、Linux的Vim或pico等等),然後存成副檔名為.c與.cpp的原始程式檔,其中純C語言程式可存檔為.c,而包含C+語法或函式庫的程式則存檔為.cpp。 Step2: 使用編譯器來編譯原始程式(例如:GCC的gcc/g+),編譯結果將是一個目的檔案(object file)。
28、Step3: 使用連結器將目的程式及其他目的程式與程式庫共同連結成一個可執行檔,目前大多數的編譯器都具有連結器的功能。 Step4: 不論您是在編譯過程或連結過程中發生錯誤或甚至是程式本身的邏輯出現錯誤而無法達到程式需求時,都必須進入偵錯階段,重新檢查並修正原始程式中的錯誤。如此週而復始,直到程式完成您的需求為止。,33,1.5.2 編譯器(Compiler)【補充】,傳統編譯器的功能是將原始程式轉換為目的碼(如下圖為C語言編譯器的工作),目的碼中則包含了機器指令、資料值及相關位址。就程式設計師而言,設計高階語言程式比較不需要考慮程式執行的機器平台,只要在不同的硬體結構,使用不同的編譯器產生適
29、合於該平台的目的碼即可。,圖1-11 C語言編譯器的工作,34,1.5.2 編譯器(Compiler)【補充】,編譯器的工作主要分為下列5個階段,並透過符號表記錄程式中相關的名稱。,圖1-12 編譯器的處理流程,35,1.5.2 編譯器(Compiler)【補充】,(1) 掃描程式(scanner): 掃描程式會掃描原始程式內容,根據程式語言的文法,將關鍵字、保留字、識別字、運算子、變數名稱、資料值等符號分析出來,而這些符號則稱之為句元(token)。因此,本階段的動作又稱為詞彙分析(lexical analysis)。 句元一般以正規表示式(regular expression)加以定義,並
30、且可以使用有限狀態機(finite state machine;簡稱FSM)加以實作。換句話說,掃描程式的主要工作是實作這些代表句元的有限狀態機,以將程式中的每一個句元分離出來。表13-1是一個變數名稱的正規表示式,它規定了只能使用AZ的英文字母做為變數名稱的第一個字元,後面則可以接上0個以上的AZ字元或09字元。,ID = A-ZA-Z0-9*,表1-3 變數名稱的正規表示式,36,1.5.2 編譯器(Compiler)【補充】,圖1-13 掃描程式的工作,37,1.5.2 編譯器(Compiler)【補充】,(2) 剖析程式(parser): 剖析程式會依據程式語言的語法規則判定這些句元的
31、排列是否合乎語法,故此階段動作又稱為語法分析(syntax analysis)。 程式語言的語法規則稱之為文法(grammar),一般使用BNF(Backus-Naur Form)或EBNF(Extensible BNF)來表示,如下表是部分C語言的文法。,compound-statement: declaration-listopt statement-listopt declaration-list: declaration declaration-list declaration statement-list: statement statement-list statement,表1-
32、4 C語言的部分文法,38,1.5.2 編譯器(Compiler)【補充】,(3) 語意分析程式(semantic routine): 語意分析程式會將語法無誤的程式轉換為中間碼(intermediate representation;簡稱IR)。語意分析程式先產生中間碼給最佳化處理器做進一步的處理,而中間碼的格式與組合語言已經非常接近。【語法與語意的不同】 語法是程式語言的文法格式,而語意則是程式的實際意義。舉例來說,假設有一個C語言敘述c=a+b;,剖析程式只是判斷該敘述是否合乎C的語法定義,結果當然是合法的C程式敘述。但實際上語意是否合法,則仍必須判定a,b,c變數是否已經宣告過以及資料
33、型態是否正確。,圖1-14 中間碼範例,39,1.5.2 編譯器(Compiler)【補充】,(4) 最佳化處理程式(optimization processor): 它會將中間碼進行最佳化,最佳化則包含對目的碼的大小以及執行效率兩種。並且又可以分為與機器無關的最佳化以及與機器有關的最佳化兩大類。(5) 目的碼產生器(code generator): 它會將中間碼轉換為目的碼。對於只處理一次的編譯器(one-pass compiler)而言,由於不會產生中間碼,因此,實際上是將語意分析程式及產生目的碼程式合併在一起的。而對於可產生多種目的碼格式(re-targetable compiler)的
34、跨平台編譯器(cross compiler)而言,則會透過機器描述檔的協助,將中間碼轉換成所需要的機器目的碼。,40,1.5.2 編譯器(Compiler)【補充】,前置處理程式(Pre-Processor) 編譯的過程中,並非一開始就做實際程式碼的轉換,而是必須先經過某些前置處理,前置處理的工作包含了去除註解、載入標頭檔、展開巨集等等。負責前置處理工作的就稱之為前置處理程式,它通常已經包含在編譯器之中(一般常見的C語言編譯器已經包含前置處理程式)。,圖1-15 前置處理及巨集展開,41,1.5.3 整合開發環境(IDE),傳統的編譯程式開發流程有些繁複,程式設計師必須先用文書編輯器撰寫原始程
35、式檔,然後再交由編譯器、連結器將原始程式檔編譯為具有除錯功能的可執行檔,最後經過除錯無誤後,才重新編譯連結為最終的可執行檔。不過這個流程通常不會一次就完成,因為程式可能發生語法、語意等錯誤,而必須在編輯器、編譯器、除錯器間切換許多次,才能夠得到最後正確的原始程式與執行檔。 整合開發環境(Integrated Development Environment;簡稱IDE)是一套整合性軟體,它將編輯器、編譯器、連結器、除錯器、執行程式等功能整合在同一套軟體之內,以方便程式設計師開發程式之用。 目前大多數的視窗程式整合開發環境除了提供上述功能之外,還提供了許多的視窗套件供程式設計師使用(這些套件也都被
36、整合在IDE之中)。例如:Borland公司所推出的Builder C+ Builder就是一套包含許多元件的視窗程式整合開發環境。,42,1.5.3 整合開發環境(IDE),圖1-16 Borland所推出的C+ Builder提供了C+編譯器的 完善功能及該公司所開發的各種視窗元件,43,1.5.3 整合開發環境(IDE),【編譯器與整合開發環境】 由於整合開發環境已經包含了編譯器的功能,因此我們常常會用整合開發環境的名稱作為編譯器的名稱,例如Borland C+ Builder是一個整合開發環境,但我們也可以稱它為一種編譯器,因為它同樣具有編譯器的功能。但反之則較為不當,例如GCC只具有
37、編譯器的功能,而未將編輯器等其他功能納入,因此,我們只會稱GCC為一種編譯器,而不會稱GCC為整合開發環境。 【C語言與C+語言的編譯器】 除了少數的古老編譯器(例如Turbo C)之外,大部分的程式設計師都使用C+編譯器來編譯C語言程式,因為,C+本身已經包含了所有的C語言程式語法。在本書的附錄中,我們介紹了非常多種類的C+編譯器,在本章中,我們只簡單示範GCC編譯器、Dev C+及Borland C+ Builder 6整合開發環境。,44,1.5.3 整合開發環境(IDE),命令列式應用程式與視窗應用程式 開發應用程式分為兩大類,分別是命令列式的應用程式(Console Applicat
38、ion)以及視窗應用程式(Windows Application)。命令列式的應用程式只能夠在命令列環境中來執行,例如Unix/Linux的各種Shell以及Dos作業系統或Dos工作視窗。而Microsoft Windows則為視窗程式的執行環境。 開發這兩個不同種類的應用程式必須透過不同的編譯器來完成,並且開發視窗程式還必須透過視窗作業系統所提供的各種API(Application Programming Interface;應用程式介面)來完成某些構成視窗的重要功能。開發命令列式的C語言編譯器有GCC、Turbo C、Turbo C+、Borland C+等等,而開發視窗程式的編譯器有V
39、isual C+、Borland C+ Builder等等。並且,能夠開發視窗作業程式的編譯器也可以開發命令列式的應用程式。本書將只針對開發命令列式的應用程式來加以說明。,45,1.6 編譯器與程式開發實例,在本節中,我們將介紹如何使用GCC來編譯C語言程式以及透過Dev-C+、Borland C+ Builder開發程式的實例,其餘各種編譯器及整合開發環境的使用方法,請讀者自行參閱附錄的介紹。,46,1.6.1 GCC編譯器,GCC是由FSF免費軟體協會所發展的一套C與C+的編譯器。早期gcc只能編譯C語言,而g+則是用來編譯C+語言(另外還有g77是用來編譯Fortran語言),但後來GN
40、U將多種語言的編譯器統稱為GCC(GNU Compiler Collection),並且成為Unix/Linux作業系統中最常被使用的編譯器。GCC從1987年推出0.9/1.0版本後,仍舊不斷發展中,目前最新的版本為3.x版,其中比較著名的版本則為2.7、2.95及3.0版。,圖1-17 GCC編譯器,47,1.6.1 GCC編譯器,48,1.6.1 GCC編譯器,範例1-1:在Unix/Linux中發展C語言程式。 Step1:啟動Vim並編輯ch1_01.c。Step2:輸入右圖程式內容。Step3:離開Vim並存檔。 (按下【Esc】鍵, 然後輸入【:wq】。),gis89807cis
41、sol11:/ch01$vim ch1_01.c,49,1.6.1 GCC編譯器,Step4:執行編譯及連結。Step5:執行a.out執行檔。,gis89807cissol11:/ch01$gcc ch1_01.c,gis89807cissol11:/ch01$./a.out 1*1= 1 1*2= 2 1*3= 3 1*4= 4 1*5= 5 1*6= 6 1*7= 7 1*8= 8 1*9= 9 2*1= 2 2*2= 4 2*3= 6 2*4= 8 2*5= 10 2*6= 12 2*7= 14 2*8= 16 2*9= 18 3*1= 3 3*2= 6 3*3= 9 3*4= 12
42、3*5= 15 3*6= 18 3*7= 21 3*8= 24 3*9= 27 4*1= 4 4*2= 8 4*3= 12 4*4= 16 4*5= 20 4*6= 24 4*7= 28 4*8= 32 4*9= 36 5*1= 5 5*2= 10 5*3= 15 5*4= 20 5*5= 25 5*6= 30 5*7= 35 5*8= 40 5*9= 45 6*1= 6 6*2= 12 6*3= 18 6*4= 24 6*5= 30 6*6= 36 6*7= 42 6*8= 48 6*9= 54 7*1= 7 7*2= 14 7*3= 21 7*4= 28 7*5= 35 7*6= 42 7
43、*7= 49 7*8= 56 7*9= 63 8*1= 8 8*2= 16 8*3= 24 8*4= 32 8*5= 40 8*6= 48 8*7= 56 8*8= 64 8*9= 72 9*1= 9 9*2= 18 9*3= 27 9*4= 36 9*5= 45 9*6= 54 9*7= 63 9*8= 72 9*9= 81 gis89807cissol11:/ch01$,50,1.6.1 GCC編譯器,【註】: gcc可以用來編譯C語言,但必須將程式存檔為小寫.c副檔名,若將程式存檔為大寫.C副檔名,則會被gcc當作是C+程式來加以編譯,雖然gcc也可以用來編譯C+語言,但是卻必須另外修正
44、其他許多連結之處。由於C+已經包含C語言的所有語法,因此,我們也可以直接使用g+來編譯C程式,但此時請將檔名儲存為C+程式,也就是將程式副檔名指定為.cpp(請將Step1的vim ch1_01.c改為vim ch1_01.cpp、Step4的gcc ch1_01.c改為g+ ch1_01.cpp)。 【註】: gcc與g+可以將編譯與連結分開完成,並且可以指定輸出檔案的檔名(不一定必須是a.out)。這些關於gcc與g+的其他設定都是透過參數設定來加以完成,讀者可以參閱附錄A操作。,51,1.6.2 Dev-C+整合開發環境,Dev-C+是一個免費軟體(Free Software),您可以在
45、下列網址中下載這套軟體,本書所使用的版本為較穩定的4.0版。 http:/ Dev-C+是一個C/C+語言的整合開發環境,它使用GCC編譯器,並且支援GTK+的圖形介面(GUI)以及OpenGL樣板(Template),同時也能夠開發視窗應用程式(Windows Application),不過在本書中,我們將只介紹如何使用Dev-C+開發C語言命令列式應用程式(Console Application)。,52,1.6.2 Dev-C+整合開發環境,範例1-2:在Windows中使用Dev-C+發展C語言程式。 Step1:安裝Dev-C+後,執行【開始程式集(所有程式)Dev-C+Dev-C+
46、】指令。,53,1.6.2 Dev-C+整合開發環境,Step2:執行【FileNew Project】指令,開啟一個新的程式專案。,54,1.6.2 Dev-C+整合開發環境,Step3:指定程式專案為C語言、命令列式應用程式(Console Application)專案。 Step4:輸入專案名稱為p1_02。,55,1.6.2 Dev-C+整合開發環境,Step5:指定專案檔的存放目錄(例如將範例存放到C:C_lauagech01)。,56,1.6.2 Dev-C+整合開發環境,Step6:此時將開啟C語言程式檔,其中已經包含了一些C語言程式,這是Dev-C+自動幫您加上去的程式內容,以
47、便節省您的時間。,57,1.6.2 Dev-C+整合開發環境,Step7:請輸入下圖中的額外程式,然後按下存檔快捷鈕。,58,1.6.2 Dev-C+整合開發環境,Step8:輸入C語言原始程式檔名,例如ch1_02或ch1_02.c。,59,1.6.2 Dev-C+整合開發環境,Step9:按下編譯快捷鈕,編譯剛剛輸入的程式。,60,1.6.2 Dev-C+整合開發環境,Step10:程式編譯完畢,按下執行快捷鈕 ,執行程式。,61,1.6.2 Dev-C+整合開發環境,Step11:由於我們撰寫的是命令列應用程式,所以此時Dev-C+會開啟一個Dos視窗,並執行剛才所編譯完成的程式。(由於
48、我們在Step7輸入了system(“pause“),因此程式到該行敘述時,會等待我們按下任一鍵才繼續執行。),62,1.6.2 Dev-C+整合開發環境,Step12:在Dos視窗中,按下任意鍵之後,將會回到Dev-C+視窗中,如果您想要回到編輯畫面,則可以按下繼續快捷鈕 。,63,1.6.3 Borland C+ Builder,Borland C+ Builder(簡稱BCB或C+ Builder)是Borland繼成功發展Delphi視窗整合開發環境後,將原本支援Object Pascal語法的Delphi改變為支援C/C+語法的C+ Builder視窗整合開發環境。BCB在C+視窗程
49、式設計中雖然不如Visual C+來得熱門,但卻更容易上手,並且版本更新速度也跟隨著Delphi而越來越快。 本書在書附光碟中將附上最新版的C+ Builder,以下我們透過一個範例來說明如何在BCB中開發C語言程式(若讀者欲更進一步學習BCB的元件,可參閱筆者所著之C+ Builder 完全攻略)。,64,1.6.3 Borland C+ Builder,範例1-3:在Windows中使用Boland C+ Builder。 Step1:安裝BCB後,執行【開始程式集(所有程式)Borland C+ Builder 6C+ Builder 6】指令。,65,1.6.3 Borland C+ Builder,Step2:開啟C+ Builder後會出現預設的視窗程式介面,由於我們要發展的是命令列式應用程式(Console Application),因此先執行【FileClose All】指令,關閉所有預設的檔案。,