程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言筆記——簡介與編譯過程初探

C語言筆記——簡介與編譯過程初探

編輯:關於C語言

序言

 

從今天起,詳細說說C語言。這一年多,在大多數語言和技術之間轉了一大圈,終於看清楚了事實,決心靜下心來好好學學C語言。初學者會認為C語言是個入門用的東西,沒有必要深入研究。但對計算機領域再稍加了解之後,就會發現C語言的重要性,而且它並非是個簡單的東西。

我想很多朋友跟我一樣是個金庸迷,猶記得《天龍八部》中,喬峰大鬧聚賢莊,一套“太祖長拳”擊敗少林數高僧,我還清楚的記得那回的名字:雖千萬人吾往矣!何等氣魄。江湖盡人皆知“太祖長拳”,是最基礎的武功,每個人也都能使幾下,但群雄看到喬峰的功力之後,才暗暗佩服原來“太祖長拳”也能所向披靡。

所以,把C語言比作“太祖長拳”再合適不過了,它是各種語言的基礎,是Unix的編寫語言,可以說是計算機技術領域的一塊重要基石。很多人認為C語言簡單,其實我更想說C語言簡潔但不是簡單。有時候我會下載Linux內核源碼或者其他大型開源軟件源碼來看看,發現其中的C語言讓國際上這些大“宗師”們用的變換莫測,你會驚歎這些人可以用C寫出功能如此強大的軟件,甚至是操作系統。

C語言博大精深,人人都想成為“喬峰”,但路還是要一步一步走,我覺得學編程最重要的一點就是不要被表象所迷惑,一定要想辦法看清本質,不然會很痛苦,迷失在各種變化中而失去對它的興趣。最近還看好了另外兩門語言,一個是C++,一個是Python,尤其是Python,極力向大家推薦。

 

C起源

 

說到C就不得不提Unix,正是Unix催生了C,也是因為有了C,Unix(和後來的Linux)才有今天。最早創造Unix的人是貝爾實驗室的湯姆森(Ken Thompson),Unix和C全誕生在這個實驗室。但在沒有C語言之前,Unix是用匯編寫的,無法獨立於硬件,也就是說,想把Unix移植到另一個型號或廠家的CPU上,就要把Unix重寫一遍,這樣很不現實。湯姆森的同事,也是Unix早期開發者之一,也就是C語言之父,丹尼斯 裡奇(Dennis Ritchie,見下圖)編寫了C語言。之後,因為C語言是獨立於硬件的,這幫貝爾實驗室的天才們又用C語言重寫了一遍Unix,而這個以C語言重寫的Unix經過不斷的改進和衍生,一直到了今天。如今裡奇已經仙逝,湯姆森也已年近古稀,但Unix和C的精神卻一直在各大技術社區流淌,生生不息。例如現在的Linus和Stallman,他們依然繼承著前任的精神,在各自的領域裡堅守著,並且影響了一代又一代的programmer。

C標准

 

      重要更正:由博友garbageMan提示,目前最新標准為C11,2011年修訂。具體內容可查閱相關文檔。

  C語言一共存在三個標准,分別制定於89年、95年、99年,所以分別簡稱為C89、C95、C99,而與之對應,89年之前的C語言成為傳統C。關於C語言標准的演變,以下抄錄《C語言參考手冊》中的內容:

 

從傳統C到C89:

1、添加了真正的標准函數庫。

2、新的預處理命令和特性。

3、函數原型,允許程序員在函數聲明中指定參數的類型。

4、增加了一些新的關鍵字,包括const、volatile和signed。

5、寬字符、寬字符串和多字節字符。

6、在轉換規則、聲明和類型檢測方面的許多小改動和澄清。

從C89到C95:

1、3個新的標准庫頭文件:iso646.h、wctype.h和wchar.h。

2、幾個新的標記和宏,用於替換有些國家的字符集中不存在的操作符和標點符號。

3、printf/scanf函數家族的一些新的格式代碼。

4、大量用於多字節符的新函數以及一些類型的常量。

從C95到C99

1、復數運算

2、整數類型的擴展,包括更長的標准類型。

3、可變長度的數組。

4、對非英語字符集提供了更好的支持。

5、對浮點類型提供了更好的支持,包括所有類型的數學函數。

6、C++風格的注釋(//)

 

關於C++標准:

這裡先不做詳細討論,只引用《C參考》中的一句話:標准C++近乎是(但不完全是)標准C的超集。

關於Clean C:

用標准C和標准C++的公共子集編寫的C代碼叫做Clean C。

注:博主認為,任何一門語言(也不止局限於語言,例如類Unix系統的標准),弄清楚它的標准都很重要,這樣有助於了解一門技術的全貌。

 

C編譯過程

 

到了這篇文章的重頭戲了,很多朋友在學習C的過程中會忽略這一點。上來就開始不顧一切的編程,而不去剖析編譯的原理,這就明顯犯了避重就輕的錯誤,而不能看清楚事物的本質。所以,這裡首先要搞清楚整個程序編譯的過程。

我們先來看看gcc的幫助文檔裡面的闡述(如下圖):

注:關於靜態庫和共享庫的內容我會放到下一篇博客裡,因為解釋這整個過程足夠寫一篇的了。

文章中大部分概念都是我個人的收集、思考和總結,難免有些地方可能有出入,也歡迎各路朋友發現問題指點一二。

志同道合的朋友可以在微信中搜索公眾賬號:DarkSir 或 掃描博客公告欄中的二維碼

博客文章將同步更新到公眾微信賬號

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved