計(jì)算機(jī)語(yǔ)言:C語(yǔ)言基本概念
計(jì)算機(jī)語(yǔ)言與人類語(yǔ)言一樣,都是一種交流的工具。人類語(yǔ)言是人與人之間交流的工具,計(jì)算機(jī)語(yǔ)言是人與計(jì)算機(jī)之間交流的工具。所有語(yǔ)言的都有它的語(yǔ)法、語(yǔ)素和語(yǔ)用;都有它的語(yǔ)法規(guī)則,這樣才能被交流的雙方相互理解;計(jì)算機(jī)語(yǔ)言也不例外,我們編寫的計(jì)算機(jī)程序也必須遵守一定的語(yǔ)法規(guī)則,才能被編譯器所識(shí)別,最后翻譯成能被CPU理解執(zhí)行的機(jī)器語(yǔ)言,其中機(jī)器語(yǔ)言是CPU廠商設(shè)計(jì)的。
1. 計(jì)算機(jī)語(yǔ)言相關(guān)概念解釋
① 編譯程序:編譯程序又稱為編譯器,是一個(gè)語(yǔ)言翻譯程序,它把源語(yǔ)言翻譯成目標(biāo)語(yǔ)言。源語(yǔ)言主要指各種計(jì)算機(jī)語(yǔ)言,目標(biāo)語(yǔ)言主要指CPU能識(shí)別的機(jī)器碼。例如英語(yǔ)翻譯成漢語(yǔ)的過(guò)程中,翻譯官相當(dāng)于編譯器。
② 編譯:編譯源語(yǔ)言,生成目標(biāo)代碼并形成機(jī)器碼的過(guò)程,相當(dāng)于現(xiàn)實(shí)翻譯中的筆譯。C語(yǔ)言屬編譯型語(yǔ)言。
③ 解釋:邊把源語(yǔ)言解釋成機(jī)器碼邊執(zhí)行的過(guò)程,相當(dāng)于現(xiàn)實(shí)翻譯中的口譯。Shell腳本屬解釋型語(yǔ)言。
④ 編譯階段:編譯階段包括詞法分析、語(yǔ)法分析、語(yǔ)義分析、中間代碼生成、代碼優(yōu)化、目標(biāo)代碼生成六個(gè)階段,貫穿始終的功能模塊有表格管理和出錯(cuò)管理。
⑤ 為什么需要編譯程序:就象我們母語(yǔ)是漢語(yǔ),想與一個(gè)埃及人交流一樣,但我們不懂埃及語(yǔ),如果有一個(gè)自動(dòng)語(yǔ)言翻譯機(jī)(或翻譯官),雙方的交流才能變得流暢。由于CPU指令是二進(jìn)制指令,人們難以在此基礎(chǔ)上進(jìn)行有效編程,所以發(fā)明了各種各樣的計(jì)算機(jī)高級(jí)語(yǔ)言,然后通過(guò)編譯器把人們編寫的計(jì)算機(jī)高級(jí)語(yǔ)言程序翻譯成CPU能理解的二進(jìn)制指令。
⑥ 程序:通常指的是人們編寫的計(jì)算機(jī)語(yǔ)言源代碼和編譯后的執(zhí)行碼,其中源代碼稱為源程序,執(zhí)行碼稱為執(zhí)行程序,程序是靜態(tài)的。程序相當(dāng)于一個(gè)企業(yè)行政部門出臺(tái)的行政管理文件。
⑦ 進(jìn)程:程序的一次執(zhí)行過(guò)程,進(jìn)程是動(dòng)態(tài)的。進(jìn)程相當(dāng)于企業(yè)各部門拿著行政管理文件的執(zhí)行過(guò)程。
⑧ CPU:CPU主要與內(nèi)存通信,其主要功能有解釋指令、存數(shù)據(jù)到內(nèi)存、從內(nèi)存取數(shù)據(jù)、數(shù)據(jù)計(jì)算和中斷處理,CPU最突出的功能為解釋指令和數(shù)據(jù)計(jì)算。CPU的工作是從內(nèi)存中取出指令并完成指令的自動(dòng)化執(zhí)行。
⑨ 內(nèi)存:內(nèi)存是存放電腦工作數(shù)據(jù)的空間,斷電后數(shù)據(jù)丟失。內(nèi)存的最小單位為字節(jié),內(nèi)存每一個(gè)最小單位空間都有其編號(hào)(即內(nèi)存地址),CPU是通過(guò)內(nèi)存地址訪問(wèn)內(nèi)存數(shù)據(jù)。在內(nèi)存看來(lái),內(nèi)存里存放的數(shù)據(jù)都是平等的,都是一串串二進(jìn)制字符,沒(méi)有類型,也沒(méi)有含義,是計(jì)算機(jī)程序把內(nèi)存的數(shù)據(jù)賦予特別的類型和意義。
⑩ 變量:一段內(nèi)存空間的抽象,變量類型決定了變量存放內(nèi)存空間的大小。計(jì)算機(jī)語(yǔ)言編譯成機(jī)器碼后,變量相對(duì)于內(nèi)存的操作就轉(zhuǎn)變?yōu)閷?duì)相應(yīng)內(nèi)存地址的存取操作。直接存取是一般變量,間接存取是指針變量。C語(yǔ)言變量原則為先定義,后使用。
? 機(jī)器程序:經(jīng)過(guò)編譯器編譯后形成CPU能理解的機(jī)器指令。在機(jī)器程序中,只有內(nèi)存地址,沒(méi)有變量概念;機(jī)器程序中所有變量失去意義,變量的操作都會(huì)轉(zhuǎn)換成對(duì)內(nèi)存地址的存取操作。機(jī)器程序有如下幾種類型的操作:CPU的計(jì)算操作、內(nèi)存空間的申請(qǐng)與釋放、CPU把寄存器數(shù)據(jù)存到內(nèi)存、取內(nèi)存數(shù)據(jù)到CPU寄存器、內(nèi)存數(shù)據(jù)從一片空間復(fù)制到另一片空間、中斷操作等。
? Linux系統(tǒng)編譯方法:gcc(或cc) a.c(源代碼名稱) -o a(執(zhí)行碼)。在這里a.c和a都是程序,其中a.c為源程序,a為可執(zhí)行程序。在界面上輸入 ./a,a就開(kāi)始了執(zhí)行之旅,其執(zhí)行過(guò)程稱為進(jìn)程。
2. C語(yǔ)言數(shù)據(jù)類型種類
圖4-1畫出了C語(yǔ)言數(shù)據(jù)類型種類,在C語(yǔ)言中只允許使用下面這些數(shù)據(jù)類型。
圖4-1 C語(yǔ)言數(shù)據(jù)類型種類
3. 32個(gè)關(guān)鍵字
C語(yǔ)言有如下32個(gè)關(guān)鍵字,這些關(guān)鍵字由系統(tǒng)定義,不能重新作為其他定義。
auto break case char const continue default do double else enum extern float for goto int long register return short signed sizeof static struct switch typedef unsigned union void volatile while
4. 9種控制語(yǔ)句
C語(yǔ)言控制語(yǔ)句的功能是完成程序流程的控制,C語(yǔ)言有如下9種控制語(yǔ)句。
① if( )-else(條件語(yǔ)句)
② for( )(循環(huán)語(yǔ)句)
③ while( )(循環(huán)語(yǔ)句)
④ do-while( )(循環(huán)語(yǔ)句)
⑤ continue(結(jié)束本次循環(huán)開(kāi)始下一次循環(huán)語(yǔ)句)
⑥ break(跳出switch或循環(huán)語(yǔ)句)
⑦ switch(多分支選擇語(yǔ)句)
⑧ goto(跳轉(zhuǎn)語(yǔ)句)
⑨ return(從函數(shù)返回語(yǔ)句)
5. C程序格式和結(jié)構(gòu)特點(diǎn)
C語(yǔ)言習(xí)慣用小寫字母,大小寫敏感;不使用行號(hào),無(wú)程序行概念;可使用空行和空格;常用鋸齒形書(shū)寫格式。
下面以一個(gè)實(shí)例說(shuō)明C語(yǔ)言結(jié)構(gòu)特點(diǎn)。
/* example1.1 The first C Program*/ 注釋
#include
main() 函數(shù)
{
printf(“Hello,World!”); 語(yǔ)句
}
C語(yǔ)言由函數(shù)、語(yǔ)句和注釋三個(gè)部分組成,這三部分的說(shuō)明和要求如下。
(1)函數(shù)與主函數(shù)
一個(gè)C語(yǔ)言源程序可以由一個(gè)或多個(gè)源文件組成。每個(gè)源文件可由一個(gè)或多個(gè)函數(shù)組成。一個(gè)源程序不論由多少個(gè)文件組成,都有一個(gè)且只能有一個(gè)main函數(shù),即主函數(shù)。
源程序中可以有預(yù)處理命令(include命令僅為其中的一種),預(yù)處理命令通常應(yīng)放在源文件頭。
每一個(gè)說(shuō)明,每一個(gè)語(yǔ)句都必須以分號(hào)結(jié)尾。但預(yù)處理命令,函數(shù)頭和花括號(hào)“}”之后不能加分號(hào)。
標(biāo)識(shí)符、關(guān)鍵字之間必須至少加一個(gè)空格以示間隔,若已有明顯的間隔符,也可不再加空格來(lái)間隔。
(2)程序語(yǔ)句
C程序由語(yǔ)句組成,用“;”作為語(yǔ)句終止符。
{}表示一個(gè)語(yǔ)句的整體。if、for、while包含多條語(yǔ)句時(shí)需要用{}括起來(lái)表示一個(gè)整體,單條語(yǔ)句則可直接用“;”表示語(yǔ)句終止。
(3)注釋
/* */為注釋,不能嵌套,注釋不產(chǎn)生編譯代碼。
6. C語(yǔ)言程序的開(kāi)發(fā)過(guò)程
編輯 編譯(預(yù)編譯、編譯、鏈接) 形成執(zhí)行碼 執(zhí)行
7. 書(shū)寫C語(yǔ)言程序時(shí)應(yīng)遵循的規(guī)則
一個(gè)說(shuō)明或一個(gè)語(yǔ)句應(yīng)該占一行。
用{}括起來(lái)的部分,通常表示了程序的某一層次結(jié)構(gòu)。{}一般與該結(jié)構(gòu)語(yǔ)句的第一個(gè)字母對(duì)齊,并單獨(dú)占一行。
使用縮進(jìn)方式編程,低一層次的語(yǔ)句比高一層次的語(yǔ)句縮進(jìn)若干空格后書(shū)寫,以便看起來(lái)更加清晰,增加程序的可讀性。
有足夠的注釋。有合適的空行。
8. C語(yǔ)言的字符集
字符是組成語(yǔ)言的最基本的元素。C語(yǔ)言字符集由字母、數(shù)字、空格、標(biāo)點(diǎn)和特殊字符組成。在字符串和注釋中還可以使用漢字或其他可表示的圖形符號(hào)。
(1)字母
小寫字母a~z共26個(gè),大寫字母A~Z共26個(gè)。
(2)數(shù)字
0~9共10個(gè)。
(3)空白符
空格符、制表符、換行符等統(tǒng)稱為空白符,空白符只在字符常量和字符串中起作用。在其他地方出現(xiàn)時(shí),只起間隔作用,編譯程序?qū)λ鼈兒雎圆挥?jì)。在程序中適當(dāng)?shù)牡胤绞褂每瞻追麑⒃黾映绦虻那逦院涂勺x性。
(4)標(biāo)點(diǎn)和特殊字符
包括“,”、“;”等標(biāo)點(diǎn)和“[”、“]”、“*”等特殊字符。
9. C語(yǔ)言詞匯
在C語(yǔ)言中使用的詞匯分為六類,分別為標(biāo)識(shí)符、關(guān)鍵字、運(yùn)算符、分隔符、常量和注釋符,具體說(shuō)明如下。
(1)標(biāo)識(shí)符
在程序中使用的常量名、變量名、函數(shù)名等統(tǒng)稱為標(biāo)識(shí)符。除庫(kù)函數(shù)的函數(shù)名由系統(tǒng)定義外,其余都由用戶自定義。C規(guī)定,標(biāo)識(shí)符只能是字母(A~Z,a~z)、數(shù)字(0~9)、下畫線(_)組成的字符串,并且其第一個(gè)字符必須是字母或下畫線。
a、x、x3、BOOK_1、sum5這5個(gè)標(biāo)識(shí)符是合法的標(biāo)識(shí)符。
以下標(biāo)識(shí)符是非法的:
3s 以數(shù)字開(kāi)頭。
s*T 出現(xiàn)非法字符*。
(2)關(guān)鍵字
關(guān)鍵字是由C語(yǔ)言規(guī)定的具有特定意義的字符串,通常也稱為保留字,用戶定義的標(biāo)識(shí)符不應(yīng)與關(guān)鍵字相同。C語(yǔ)言的關(guān)鍵字分為以下幾類:
① 類型說(shuō)明符
用于定義、說(shuō)明變量、函數(shù)或其他數(shù)據(jù)結(jié)構(gòu)的類型,如int、double等。
② 語(yǔ)句定義符
用于表示一個(gè)語(yǔ)句的功能,如if~else就是條件語(yǔ)句的語(yǔ)句定義符。
③ 預(yù)處理命令字
用于表示一個(gè)預(yù)處理命令,如include。
(3)運(yùn)算符
C語(yǔ)言中含有相當(dāng)豐富的運(yùn)算符。運(yùn)算符與變量,函數(shù)一起組成表達(dá)式,表示各種運(yùn)算功能。運(yùn)算符由一個(gè)或多個(gè)字符組成。
(4)分隔符
在C語(yǔ)言中采用的分隔符有逗號(hào)和空格兩種。逗號(hào)主要用在類型說(shuō)明和函數(shù)多個(gè)形參中分隔各個(gè)變量,空格多用于語(yǔ)句各單詞之間作間隔符。
(5)常量
C語(yǔ)言中使用的常量可分為數(shù)字常量、字符常量、字符串常量、符號(hào)常量、轉(zhuǎn)義字符等多種。
(6)注釋符
C語(yǔ)言的注釋符是以“/*”開(kāi)頭并以“*/”結(jié)尾的串,在“/*”和“*/”之間的即為注釋。程序編譯時(shí),不對(duì)注釋作任何處理,注釋可出現(xiàn)在程序中的任何位置,注釋是用來(lái)向用戶提示或解釋程序的意義。
10.C語(yǔ)言算法
C語(yǔ)言是結(jié)構(gòu)化設(shè)計(jì)語(yǔ)言,結(jié)構(gòu)化程序的靈魂是算法。瑞士Niklaus Wirth教授在20世紀(jì)60年代提出了“數(shù)據(jù)結(jié)構(gòu)+算法=程序”的公式。做任何事情都有一定的步驟,為解決一個(gè)問(wèn)題而采取的方法和步驟,就稱為算法。算法具有有窮性、確定性、有零個(gè)或多個(gè)輸入、有一個(gè)或多個(gè)輸出、有效性等特征。C語(yǔ)言算法是通過(guò)結(jié)構(gòu)化設(shè)計(jì)方法來(lái)實(shí)現(xiàn),其特點(diǎn)為自頂向下、逐步細(xì)化、模塊化設(shè)計(jì)和結(jié)構(gòu)化編碼。
11. C語(yǔ)言編譯過(guò)程
圖4-2畫出了C語(yǔ)言的編譯流程。
圖4-2 C語(yǔ)言編譯過(guò)程
12. 計(jì)算機(jī)語(yǔ)言說(shuō)明
數(shù)學(xué)是描述大自然的語(yǔ)言,會(huì)計(jì)是人們記錄商業(yè)活動(dòng)的語(yǔ)言,人類語(yǔ)言(英語(yǔ)、漢語(yǔ)、法語(yǔ)、西班牙語(yǔ)等)則是人與人之間交流的語(yǔ)言,計(jì)算機(jī)語(yǔ)言是人們和計(jì)算機(jī)(CPU)交流的語(yǔ)言。
由于CPU只能理解機(jī)器語(yǔ)言(CPU指令集),而人們對(duì)機(jī)器語(yǔ)言(一串二進(jìn)制數(shù))很難閱讀和調(diào)式,于是就產(chǎn)生了匯編語(yǔ)言。匯編語(yǔ)言的特點(diǎn)是利用助記符代替相應(yīng)的機(jī)器語(yǔ)言二進(jìn)制指令,如利用“ADD”助記符代替二進(jìn)制指令“1000001100000110”,匯編語(yǔ)言較機(jī)器語(yǔ)言更有利于人們編程,人們編寫的匯編源程序再經(jīng)匯編編譯器翻譯成機(jī)器語(yǔ)言程序(執(zhí)行碼),執(zhí)行碼就是CPU能理解的二進(jìn)制指令。
由于匯編語(yǔ)言是面向機(jī)器的低級(jí)語(yǔ)言,與CPU的指令集息息相關(guān),是按CPU的“思考”方式編寫而成的計(jì)算機(jī)語(yǔ)言。匯編語(yǔ)言與人類思考方法相差較大,于是產(chǎn)生了面向過(guò)程的語(yǔ)言(PASCLE、C等)和面向?qū)ο蟮恼Z(yǔ)言(C++、JAVA等)。但是計(jì)算機(jī)只能理解機(jī)器語(yǔ)言(CPU指令集),人們編寫的C語(yǔ)言、C++語(yǔ)言、JAVA語(yǔ)言源程序要翻譯成機(jī)器語(yǔ)言CPU才能夠執(zhí)行,執(zhí)行翻譯工作的是編譯程序。就這樣是一門新的計(jì)算機(jī)學(xué)科(編譯原理)產(chǎn)生了,編譯原理介紹了編譯程序的實(shí)現(xiàn)方法。masm是匯編的編譯程序,gcc是Linux下C語(yǔ)言和C++語(yǔ)言的編譯程序,JVC是JAVA的編譯程序。
萬(wàn)物皆流,萬(wàn)物歸宗。計(jì)算機(jī)源程序,無(wú)論是高級(jí)語(yǔ)言C、C++、JAVA源程序,還是匯編語(yǔ)言源程序,最終都要翻譯成機(jī)器語(yǔ)言,CPU才能夠執(zhí)行。





