語言是人類交流的工具,是人們溝通的主要表達方式。不同的民族有不同的語言,每種語言有自己的語法規則和詞彙,只有在規定的語法規則和詞彙範圍內,人們才可以相互理解之間的對話和語句文字要表達的內容。超出這個範圍,就會出現語言理解困難現象,例如:不同語言之間的人對話就會發生理解問題,就需要翻譯人員的協助才能完成正常交流。
程式語言是人類與計算機的交流工具,為了讓計算機能夠準確無誤地完成任務,人們需要使用計算機能夠讀懂的語言與之交流,編制任務指令交給計算機,計算機才能夠按部就班地執行指令,完成人們交給的任務,編寫計算機指令的語言就是程式語言。
程式語言和人類語言一樣,不是先天就有的,是隨著科技和計算機技術的發展,人們為了更好地控制計算機,幫助人們完成更多任務,提高編程和工作效率而不斷對語言進行創新、完善和改進而來的。最初的程式語言是機器語言,也是計算機唯一能直接讀懂的語言。計算機只能識別二進位代碼,所以機器指令也是由二進位代碼組成的,所謂的機器語言,就是直接用二進位代碼編寫計算機的指令序列(程序)。
假設編寫一個計算直線方程的程序,給出方程的斜率、變量係數和變量X的值,求Y值,將計算結果存儲到以Y為地址的存儲單元中。
直線方程為 Y = AX + B,其中A、X、B已經分別存儲到A、X、B存儲單元,機器指令可以直接尋址到該存儲單元。A單元的存儲地址為26H,X的存儲地址為34H,B的存儲地址為36H,Y的存儲地址為56H,其中26H、34H、36H、56H均為16進位,該算法流程圖見1-13圖。
根據流程圖編寫的機器指令序列(參考了IBM-PC指令集,可能有出入,主要是為了說明程式語言的演變過程):
(1)1011 AX 26H
存取指令,讀取指定地址26H的存儲內容到AX寄存器;
(2)1001 34H
乘法指令,將34H存儲地址的內容與AX寄存器內容相乘;
(3)1011 26H AX
存取指令,將AX寄存器內容存儲到26H地址的存儲單元;
(4)1011 AX 36H
存取指令,讀取指定地址36H的存儲內容到AX寄存器;
(5)0011 AX 26H
加法指令,將AX寄存器內容和26H地址存儲內容相加;
(6)1011 56H AX
存取指令,將AX寄存器內容存儲到56H地址的存儲單元。
上面就是用機器語言編寫的計算直線方程的計算機指令序列,是不是特別難記、難懂,完全是看天書的感覺。為了提高編程的工作效率,在1949年,人們將助記符和機器代碼關聯起來,並編寫了轉換程序,轉換程序可以把助記符轉換為機器代碼,這就是彙編語言。
根據流程圖編寫的彙編程序指令序列(參考了IBM-PC指令集,可能有出入,主要是為了說明程式語言的演變過程)。
(1) MOV AX A
存取指令,讀取A地址的存儲內容到AX寄存器;
(2) IMUL X
乘法指令,將X存儲地址的內容與AX寄存器內容相乘;
(3) MOV A AX
存取指令,將AX寄存器內容存儲到A地址的存儲單元;
(4) MOV AX B
存取指令,將B地址的存儲內容讀取到AX寄存器;
(5) ADD AX A
加法指令,將AX寄存器內容和A地址存儲內容相加;
(6) MOV Y AX
加法指令,將AX寄存器內容存儲到Y地址的存儲單元;
用助記符代替了機器碼,編程是不是相對簡單了一些,轉換程序可以幫助編程人員從繁重的機器碼編寫勞動中解脫出來,轉換程序也稱之為彙編編譯程序,其工作原理如下圖所示:
彙編代碼完成後,需要運行編譯程序,將彙編代碼轉換為機器代碼,由於不同CPU架構的計算機,其提供的指令集不同,支持運行的機器代碼也不同,因此,要運行在不同CPU架構的計算機上,就需要運行支持該CPU架構的彙編編譯程序。例如IBM-PC機採用了Intel X86系列處理器,單片機一般採用ARM架構的系列處理器,如果要讓編寫的彙編程序運行在IBM-PC機上,就需要調用支持IBM-PC指令集的彙編編譯程序,如果要讓編寫的彙編程序運行在ARM架構的計算機上,就需要調用支持ARM指令集的彙編編譯程序。
彙編語言相對機器語言來說,編程效率和可讀性都有了較大提高。但編寫程序還是過於繁瑣,並且彙編語言對應一條條指令集,當指令集改變時,就得修改相應彙編語言,導致其可移植性和維護性很差,不能跨平臺使用。為了解決這個問題,計算機工程師們繼續創新和改進程式語言,隨著計算機技術和科技的發展,計算機對語言的處理能力進一步提高,計算機工程師試圖用人們能夠容易識別和易懂的語言去編寫程序,在20世紀50年代,出現了第一批高級語言,包括FORTRAN 、LISP、COBOL等語言,隨後相繼出現了C語言、C#、Java、PHP、Perl等高級語言。
高級語言的優點是其語法和結構更類似漢字或者普通英文,並且由於遠離對硬體的直接操作,使得一般人經過學習之後都可以掌握編程技術。
● 根據計算直線方程流程圖編寫的C語言程序
void line(double a,double x,double y)
{
a = ax;
y = a + b;
}
● 根據計算直線方程流程圖編寫的Java程序
public class LineQuation
{
void line(double a,double x,double y)
{
a = ax;
y = a + b;
}
}
Java語言和C語言都屬於高級語言,其語法和規則有相同之處,但也有很大的不同,Java是面向對象的語言,C語言是函數式語言,Java是編譯兼解釋性語言,C語言是編譯性語言,關於語言的特性面會有陸續介紹。
我們寫程序用的是高級語言,要讓我們寫好的程序能夠在計算機上運行,就必須要把高級語言轉換成計算機能夠理解的機器語言,該轉換程序稱為該語言的編譯程序,例如C語言的轉換程序可以稱之為C語言編譯程序,C語言編寫的程序編譯為Windows程序的工作過如下圖所示:
編寫完成的C語言原始碼,首先經過編譯預處理器規範代碼和預編譯,然後通過編譯器轉換為彙編代碼,再由彙編器轉換為機器代碼,最後由連結器將有關的機器代碼文件進行相互連結,構建Windows程序。
程式語言是人們與計算機的交流工具,各種程式語言語法規則雖有不同,但其核心思想都是人們通過程式語言來控制計算機,讓計算機幫助人們解決各類問題。學習程式語言的目的是掌握利用計算機解決問題的能力,包括分析問題、算法設計、數據架構等能力,有了這些能力,只要學會一種程式語言,其它語言都可以無師自通。後面的學習過程,也重點講述分析問題、解決問題的能力。
(1)請簡要敘述高級語言、彙編語言、機器語言的區別。
(2)請描述C語言的編譯過程。
(3)彙編程序編譯的機器代碼為什麼不能運行在不同CPU架構的計算機上?