深度理解C語言的編譯機制和語言標準,萬物皆可C!

編程機制

編寫程序時必須遵循確切步驟主要是取決於你的計算機環境。由於 C語言是能夠移植的,因此它在許多環境中可用,其中包括 UNIX,Linux,Windows等等 。編程

不過,讓咱們首先來看一看許多環境所共有的一些方面。你徹底沒必要知道運行一個 C 程序後面的事情,但瞭解一點是一個很好的背景知識。它還能夠幫助你理解爲何編寫一個 C 程序必須通過一些特定步驟。編程語言

用 C 語言編寫一個程序時,你將編寫的內容保存在一個被稱爲源代碼文件的文本文件中。編輯器

大多數 的系統,都須要該文件的名稱以 .c 結尾。例如,hello world.c 。名稱中小點前的部分被稱爲基本名,小點後的部分被稱爲擴展名。所以,hello world 是一個基本名,c 是一個擴展名。組合在一塊兒的 hello world.c 是文件名。模塊化


 

這樣,在咱們提到名稱時內容就能夠更具體,咱們假定有一個名爲 hello world.c 的源文件,其源代碼以下面所示。函數

#include工具

int main ()學習

{spa

printf("hello world! ");操作系統

return 0;命令行

}


 

目標代碼文件、可執行文件和庫

C語言編程的基本策略是使用程序將源代碼文件轉換爲可執行文件,此文件包含能夠運行機器語言代碼。

它分兩步完成這一工做:編譯和連接。

編譯器將源代碼轉換爲中間代碼,連接器將此中間代碼與其餘代碼相結合生成可執行文件。C 使用被劃分爲兩部分的這一方法使程序便於模塊化。

你可分別編譯各個模塊,而後使用連接器將編譯過的模塊結合起來。這樣,若是須要改變一個模塊,則沒必要從新編譯全部其餘的模塊。同時,連接器將你的程序與預編譯的庫代碼結合起來。

中間文件的形式有多種選擇。最通常的選擇,同時也是咱們這裏講述的實現方式所採起的選擇,是將源代碼轉換爲機器語言代碼,將結果放置在一個目標代碼文件中。

雖然目標文件包含機器語言代碼,但該文件還不能運行。目標文件包含源代碼的轉換結果,但它還不是一個完整的程序。

目標代碼文件中所缺乏的第一個元素是一種叫作啓動代碼(start-up code)的東西,此代碼至關於你的程序和操做系統之間的接口。

例如,你能夠在DOS或Linux下運行一個 IBM PC兼容機,在兩種狀況中硬件是相同的,因此會使用一樣的目標代碼,但DOS與Linux要使用不一樣的啓動代碼,由於這兩種系統處理程序的方式是不一樣的。

所缺乏的第二個元素是庫例程的代碼。幾乎全部C程序都利用標準C庫中所包含的例程(稱爲函數)。

例如,前面的 concrete.c 使用了函數 printf()。目標代碼文件不包含這一函數的代碼,它只包含聲明使用 printf()函數的指令。實際代碼存儲在另外一個稱爲「庫」的文件中。庫文件中包含許多函數的目標代碼。

連接器的做用是將【目標代碼】、【系統的標準啓動代碼】和【庫代碼】這3個元素結合在一塊兒,並將它們存放在單個文件,便可執行文件中。對庫代碼來講,連接器只從庫中提取你所使用的函數所須要的代碼,以下圖中的簡單示例:

簡而言之,目標文件和可執行文件都是由機器語言指令組成的。但目標文件只包含你所編寫的代碼轉換成的機器語言,而可執行文件還包含你所使用的庫例程以及啓動代碼的機器代碼。


 

Windows系統的集成開發環境

由於 C 編譯器不是標準 Windows 包的一部分,因此須要得到並安裝一個 C 編譯器。

許多廠商都會提供基於 Windows的集成開發環境(IDE) 。

全部編譯器都具備用來裝配C程序的快速,集成的開發環境。關鍵的一點是,它們都具備內置的編輯器,可用來編寫C程序。

這類開發環境通常都提供了讓你能夠命名和保存源代碼文件的菜單,以及讓你能夠不離開IDE就能編譯和運行程序的菜單。若是編譯器發現任何錯誤,會返回到編輯器中,並且編輯器能夠標出有問題的行,並將它們與相應的錯誤消息匹配起來,例如VC6.0、QT、Visual Studio(簡稱vs)。

Windows IDE最初可能讓人有一點望而生畏,由於它們提供多種目標,也就是說,提供了多種可以讓程序在其中運行的環境。

例如,它們可能提供16位Windows程序,32位Windows程序,動態連接庫文件(DLL)等等讓你選擇。許多目標都須要引入Windows圖形界面的支持。爲了管理這些選項,一般須要建立一個項目,以便隨後向其中添加將要使用的源代碼文件名。

通常來講,首先使用文件菜單來建立一個新的項目。重要的是選取正確的項目形式。本書中的例子是通常性的例子,設計目的是在一個簡單的命令行環境中運行。

由於 Widnows IDE通常可處理 C 和 C++,因此你應該指明你須要一個C程序。在某些產品,可使用項目類型來指明但願使用 C。

而在其餘一些產品,如 Microsoft Visual C++中,可使用.c文件擴展名來指明但願使用 C 而不是 C++。然而,大多數 C 程序也能夠做爲 C++程序運行。


 

可能你們在寫完一個程序以後會遇到一個問題:顯示程序執行的窗口在程序終止時忽然消失,也就是程序運行後窗口一閃而過。

若是遇到這種狀況,那麼可使程序暫停,直到按下 Enter鍵。要作到這一點,請在程序的末尾,剛好在 return 語句以前,添加下面的一行:

getchar();

該行讀取一次按鍵,所以程序將暫停直到按下 Enter 鍵時。有時,根據程序函數的須要,可能已經有一個等待按鍵的指令。在這種狀況下,須要使用 getchar()兩次:

getchar();

getchar();

例如,若是程序最後作的事情是請你輸入你的體重,那麼就應當鍵入你的體重並按 Enter 鍵以輸入數據。

程序將讀取體重,第1個getchar()將讀取 Enter鍵,第2個getchar()將致使程序暫停,直到再次按下 Enter鍵。若是如今你對此還不太理解,那麼在學習更多關於 C 輸入的知識後你就明白了。

雖然各類IDE都有許多共同的原則,但在細節方面會因產品而異,而在一個產品系列中,又會因版本而異。你必需要通過一些實踐,才能知道編譯器的正確工做方式。


 

語言標準

目前,有許多 C 實現方式可用。理想狀況下,編寫 C 程序時,假如該程序末使用機器特定的編程技能,則它在任何實現方式中的運行應該是相同的。要在實踐中作到這一點,不一樣的實現方式須要遵照一個公認的標準。

首先說明一點,C語言並無官方的標準。

不過,Brian Kernighan 和 Dennis Ritchie 編寫的 The C Programming Language 第1版(1978)成爲你們接受的標準,一般稱爲 K&R C 或經典 C。

第1個 ANSI/ISO C 標準

隨着 C語言的發展和更加普遍地用於更多種類的系統上,使用 C 的羣體意識到它須要一個更加全面,新穎和嚴格的標準。

爲了知足這一要求,美國國家標準代組織(ANSI)在1983年設立了一個委員會以發展一個新的標準,該標準於1989年正式採用。

這個新標準(ANSI C)定義了語言和一個標準 C 庫。國標標準化組織於1990年採用一個 C 標準 (ISO C )。

ISO C 和 ANSI C 實質上是同一個標準。ANSI/ISO標準最終版本一般被稱爲 C89 (由於 ANSI於1989年批准了該標準) 或 C90(由於 ISO 於1990年批准了該標準)。然而,由於 ANSI版本是首先出現的,因此人們一般使用ANSI C這一術語。


 

C99 標準

1994年,修訂標準的工做開始了,這一努力的結果是產生了 C99標準。

一個聯合 ANSI/ISO委員會簽署了 C90標準的最初原則,包括保持言語短小而簡單。他們的意圖不是爲語言添加新的特性,而是爲了知足新的目標。

新目標之一是支持國際化編程。

例如,提供了處理國際字符集的方法。第二個目標是「整理現有的慣例以解決明顯的缺點」。所以,在遇到須要將 C 移植到 64 位處理器時,委員會根據在真實生活中處理問題的人的經驗來添加標準。第三個目標是針對科學和工程項目的重要數字計算改進 C 的適應能力。

國際化,修正其不足和改進計算的實用性這三點是主要的面向改變的目標。造成在關於更改的計劃在性質上更加保守,例如,讓與 C90 和 C++ 的不兼容性達到最小,讓語言在概念上保持簡單。肩帶來講就是但願 C++成爲重要的和強有力的語言。

結果是 C99 的修改保持了 C 的本質特性,C 繼續是一種簡短,清楚,高效的語言。

書中指出了 C99中的許多修改。由於目前大多數編譯器沒有徹底實現全部 C99的修改,因此你能夠會發現一些修改在你的系統上不可用。或者你可能會發現,只有修改編譯器的設置之後,纔可以看到一些 C99 的特性。


 

總結

C 是一種強大,簡潔的編程語言。之因此流行是由於它提供了有用的編程工具和對硬件良好的控制,還由於 C 程序在從一個系統向另外一個系統移植方面比大多數程序更容易。C 是一種須要編譯的語言。C 編譯器和連接器是將 C 語言源代碼轉換成可執行代碼的程序。

用 C 編程可能很費力,困難並讓你感到灰心,但這一工做也可能讓你着迷,興奮和感到滿意。


 

最後,無論你是轉行也好,初學也罷,進階也可,若是你想學編程~

【值得關注】個人 C/C++編程學習交流俱樂部!【點擊進入】

問題答疑,學習交流,技術探討,還有超多編程資源大全,零基礎的視頻也超棒~

相關文章
相關標籤/搜索