1. 程式人生 > >C語言(一):初始C語言

C語言(一):初始C語言

實踐 概念 個數 部分 貝爾 指令集 觸摸 物理學 解釋器

  學習筆記:

  •    C的歷史和特性
  • 編寫程序的步驟
  • 編譯器和鏈接器的一些知識
  • C的標準

   1.1 C語言之起源

  1972年,在美國的貝爾實驗室內的丹尼斯·裏奇(Dennis Ritch)和肯·湯姆遜(Ken Thompson)在開發Unix操作系統時發明了C語言,然而,在C語言的設計之中它並不是一個獨立的思路設計,它是在基於B語言的基礎上來進行設計的,至於B語言的起源,可以參考B語言的起源,C語言的設計初衷是為了給程序員使用的一個編程工具,其主要目標是成為有用的語言。

      技術分享

    1.2 選擇C語言編程的理由

  在過去40年裏,C語言成為最流行、最重要的編程語言之一,在10大最受歡迎編程語言排行榜中,經常與Java語言進行第一第二的排名爭搶,不是第一就是第二,它的成長主要歸納於對於使用過它的人對該語言都很滿意,過去的20年裏,雖然許多人都從C語言轉向其他編程語言(如:C++ Objective-C Java等),但是C語言卻依舊憑借本身的實力在眾多語言中脫穎而出。

     1.3 C語言的特性(優點)

  •   C語言是一門流行的語言,融合了計算機科學理論和實踐的控制特性。C語言的設計概念讓用戶能輕松的完成自頂向下的規劃、結構化編程和模塊化設計。因此,用C語言寫的程序更簡單易懂、更可靠。
  • C語言是一門高效的語言,在設計上,它充分的利用了當前計算機的優勢,因此對於C語言程序的設計更加的緊湊,而且運行速度很快,實際上,C語言具有通常是匯編語言才具有的微調控制能力(匯編語言是為特殊的中央處理單元設計的一系列內部指令,使用助記符來表示;不同的CPU系列使用不同的匯編語言。
  • C是可移植的語言,這意味著,在一種操作系統中編寫的C語言程序稍作修改或不修改就能在其他操作系統中運行;打個比方,你在Windows操作系統中用VC或者VS設計了一個helloworld的C語言程序,你也可以把它放到Linux或者Unix系統去執行,且不會報錯,不過,部分程序也只是需要更改主程序頭文件中的少許項即可,大部分語言都希望成為可移植的語言,C語言是可移植性語言的佼佼者。
  • C語言功能強大且靈活(在計算機領域或者黑客 or 滲透領域經常使用這兩個名詞),例如:功能強大且靈活的Unix系統,大部分都是由C語言編寫的;其他語言(如:FORTRANPerlPythonPascalLISPLogoBASIC)內部的解釋器和編譯器大部分都是由C語言來編寫的。因此,在Unix中使用FORTRAN時,最終是由C程序生成最後的可執行程序。C語言可以用來解決物理學和工程學的問題,甚至用來編寫電影的特效加持。
  • C語言是為了滿足程序員的要求而設計的,程序員可以利用C語言來訪問計算機硬件、操控內存中的位。C語言有豐富多彩的運算符,能讓程序員快速簡介的表達自己的意圖。C語言雖然沒有Pascal嚴謹,但是卻比C++的限制多;這樣的靈活性即是優點也是缺點。優點是:許多任務用C語言來處理都特別的簡潔(如:轉換數據的格式);缺點是:你可能會犯一些莫名其妙的錯誤,這些錯誤不太可能會在其他語言中出現。C語言在提供更多自由的同時,也讓使用者承擔了更大的責任,另外,C語言還有自帶了很多函數的庫,需要用#include主函數進行調用才能讓函數運行。

1.4 C語言的應用範圍

  • 公司內部編程大多數采用的是C語言
  • 操作系統的開發也基本上是使用的C語言
  • 編程語言開發(如Python蟒蛇語言就是C語言設計的)
  • 圖形化程序開發(C語言開發圖形化程序更加高效快捷)
  • 人工智能設計(人工智能大多數用到的是匯編或者C語言進行的)
  • 汽車安全設計(內部的程序也基本上是C語言編寫的)
  • Linux內核(C語言編寫)
  • Unix操作系統(C語言編寫)
  • Windows操作系統(C語言編寫,大部分似乎是由C++或者匯編語言編寫,但也有少部分是用C語言來編寫的)
  • 計算機遊戲開發
  • PC端應用程序
  • 機器人工廠
  • 星球大戰電影特效
  • 嵌入式系統開發
  • 盧卡斯公司

     1.5 計算機工作原理

   現代的微型計算機主要是由多種內部構架組成:中央處理單元(CPU)承擔了大部分的運算工作。隨機存儲內存(RAM)是存儲程序和文件的工作區;而永久內存存儲設備(過去主要指一些機械硬盤,現在還包括固態硬盤比如一些SSD等)即便關閉計算機後,存儲後的數據或者文件也不會丟失,另外,還有一些外設(鍵盤、鼠標、觸摸屏、監視器)提供人與計算機之間的交互。CPU主要負責處理程序。

   CPU的工作非常簡單,它從內存中獲取並執行一條指令,然後再從內存中獲取並執行下一條指令,諸如此類(一個GHz的CPU一秒鐘能重復這樣的操作約十億次,因此,CPU能以驚人的速度來重復進行枯燥乏味的工作,CPU有一個自己的工作區-由若幹個寄存器組成,每個寄存器都可以存儲一個數字。一個寄存器儲存下一條指令的內存地址,CPU使用該地址來獲取和更新下一條指令。在獲取指令後,CPU在另一個寄存器中儲存該指令,並更新第一個寄存器儲存下一條指令的地址。CPU能理解的指令有限,(這些指令的集合叫做指令集。)而且,這些指令相當具體,其中的許多指令都是用於請求計算機把一個數字從一個位置移動到另一個位置。

    儲存在計算機中的所有內容都是數字。計算機以數字形式儲存數字和字符(如,在文本文檔中使用的字符。)每個字符都有一個數字碼。計算機載入寄存器的指令也以數字型式儲存,指令集的每條指令都有一個數字碼(即:機器語言)來表示。

   簡而言之,計算機的工作原理是:如果你希望計算機做某些事,就必須為其特殊的指令列表(程序),確切的告訴計算機要做的事以及如何做,你必須用計算機能直截了當明白的語言(機器語言)來創建程序。這是一項:繁瑣、乏味、費力的任務。計算機要完成諸如兩數相加這樣簡單的事,就得分類成類似以下的步驟。

  • 從內存位置2000上把一個數字拷貝到寄存器1
  • 從內存位置2004上把另一個數字拷貝到寄存器2
  • 把寄存器2中的內容與寄存器1的內容相加,把結果寄存在寄存器1中
  • 把寄存器1中的內容拷貝到內存位置2008

  1.6 高級計算機語言和編譯器

   高級編程語言(如:C)以許多的方式簡化了編程工作,首先,不必用數字碼表示指令,也不用考慮CPU在完成任務時具體需要那些步驟。

   total = mine +yours;

   我們用上面的變量來舉例,只需要看一下這個例子就知道編程語言想要做什麽,而如果看成機器語言寫成的等價指令(多條以數字碼形式表現的指令)則費勁得多。但是,對於計算機語言而言卻恰恰相反。在計算機看來,高級指令就是一堆無法理解的無用數據。所以,編譯器在這裏就派上了用場。編譯器的作用是把高級語言的程序指令翻譯成了計算機內部所能理解的機器語言指令集的程序(二進制),程序員進行高級思維活動,而編譯器則負責處理冗長乏味的細節工作。

      1.7 語言標準

   C語言的發展之初,並沒有所謂的C語言標準,在1978年,布萊恩·柯林漢(Brian Kernighan)和丹尼斯·裏奇(Dennis Ritchie)合著的The C Programming Language(C語言程序設計)第一版是公認的C標準,通常稱之為K&RC或經典C。與大多數語言不同的是,C語言比其他語言更依賴庫,因此需要一個標準庫,實際上,由於缺乏官方標準,Unix實現提供的庫已經成為了標準庫。

     1.8 C語言的一些標準 

  • ANSI/ISO C標準
  • C99標準
  • C11標準

     1.9 使用C語言的7個步驟

  • 定義程序的目標
  • 設計程序
  • 編寫代碼
  • 編譯
  • 運行程序
  • 測試和調試程序
  • 維護和修改程序

     2.0 編程機制

  生成程序的具體過程因計算機環境而異。C是可移植性語言,因此可以在許多環境中使用,包括:UnixLinuxMS-DOS(一些人仍在使用)、WindowsMacintosh OS,有些產品會隨著時間的推移發生演變或取代;用C語言編寫程序時,編寫的內容被儲存在文本文件中,該文件被稱為源代碼文件(source code file)。大部分C系統,包括之前提到的,都要求以.c結尾(如:wordcount.c和hello.c),在文件中,點號前面的被稱之為基本名(basename),點號後面的為擴展名(extension)。因此,文件名應該滿足特定計算機操作系統的特殊要求,如:在MS-DOS環境下比較老舊,它要求基本名不能超過8個字符。因此,剛才提到的wordcount就是無效的DOS文件名;有些Unix系統則允許使用更長的文件擴展名不超過14個字符,而有些Unix系統則允許使用更長的文件名,最多255個字符,Linux、Windows和Macintosh OS都允許使用長文件名。

  C語言編程的基本策略是,用程序把源代碼文件轉換為可執行文件,典型的C實現通過編譯鏈接兩個步驟來完成這一過程。編譯器把源代碼轉換成中間代碼,鏈接器把中間代碼和其他代碼合並,生成可執行文件。C使用這種分而治之的方法方便對程序進行模塊化,可以獨立單獨編譯的模塊,稍後再用鏈接器合並已編譯的模塊,通過這種方式,如果只更改某個模塊,不必因此重新編譯其他模塊,另外,鏈接器還將你編寫的程序和預編譯的庫代碼合並。

簡而言之,目標代碼可執行文件都是由機器語言指令組成的。然而,目標文件中只包含編譯器為你編寫的代碼翻譯的機器語言代碼,可執行文件中還包含你編寫的程序中使用的庫函數和啟動代碼的機器代碼。

     

C語言(一):初始C語言