細述程式語言的發展過程

安全劍客發表於2019-02-24
編寫計算機程式所用的語言是人與計算機之間交換的工具,按語言對機器的依賴程度分為機器語言、組合語言和高階語言。
機器語言(Machine Language)

機器語言是面向機器的語言,每一個由機器語言所編寫的程式只適用於某種特定型別的計算機,即指令程式碼通常隨CPU型號的不同而不同。它可以被計算機硬體直接識別,不需要翻譯。一句機器語言實際上就是一條機器指令,它由操作碼和地址碼組成。機器指令的形式是用0、1組成的二進位制程式碼串。

組合語言(Assemble Language)

組合語言是一種面向機器的程式設計語言,它是為特定的計算機或計算機系列設計的。組合語言採用一定的助記符號表示機器語言中指令和資料,即用助記符號代替了二進位制形式的機器指令。這種替代使得機器語言“符號化”,所以組合語言也是符號語言。每條組合語言的指令就對應了一條機器語言的程式碼,不同型號的計算機系統一般有不同的組合語言。

計算機硬體只能識別機器指令,執行機器指令,對於用助記符表示的彙編指令是不能執行的。組合語言編寫的程式要執行的話,必須用一個程式將組合語言翻譯成機器語言程式,用於翻譯的程式稱為彙編程式(彙編系統)。

彙編程式是將用符號表示的彙編指令碼翻譯成為與之對應的機器語言指令碼。用匯編語言編寫的程式稱為源程式,變換後得到的機器語言程式稱為目標程式。

高階語言

機器語言與組合語言受機器限制費工費時,並且缺乏通用性,為解決此問題,人們努力創造一種獨立於計算機的語言。從20世紀50年代中期開始到20世紀70年代陸續產生了許多高階演算法語言。這些演算法語言中的資料用十進位制來表示,語句用較為接近自然語言的英文字來表示。它們比較接近於人們習慣用的自然語言和數學表示式,因此稱為高階語言。高階語言具有較大的通用性,尤其是有些標準版本的高階演算法語言,在國際上都是通用的。用高階語言編寫的程式能使用在不同的計算機系統上。
但是,對於高階語言編寫的程式計算機是不能識別和執行的。要執行高階語言編寫的程式,首先要將高階語言編寫的程式翻譯成計算機能識別和執行的二進位制機器指令,然後供計算機執行。

一般將用高階語言編寫的程式稱為“源程式”,而把由源程式翻譯成的機器語言程式或組合語言程式稱為“目標程式”。把用來編寫源程式的高階語言或組合語言稱為源語言,而把和目標程式相對應的語言(組合語言或機器語言)稱為目標語言。

計算機將源程式翻譯成機器指令時,通常分兩種翻譯方式:一種為“編譯”方式,另一種為“解釋”方式。所謂編譯方式是把源程式翻譯成等價的目標程式,然後再執行此目標程式。而解釋方式是把源程式逐句翻譯,翻譯一句執行一句,邊翻譯邊執行。解釋程式不產生將被執行的目標程式,而是藉助於解釋程式直接執行源程式本身。一般將高階語言程式翻譯成組合語言或機器語言的程式稱為編譯程式。

一般來講高階語言和低階語言有一下特點
高階語言:實現效率高,執行效率低,對硬體的可控性弱,目的碼大,可維護性好,可移植性好
低階語言:實現效率低,執行效率高,對硬體的可控性強,目的碼小,可維護性差,可移植性差

我們都知道CPU執行的是二進位制指令,所有的語言編寫的程式最終都要翻譯成二進位制程式碼,但是為什麼實現會有以上眾多差異呢?下面以C語言為高階語言代表,組合語言為低階語言代表來解釋一下。越低階的語言,形式上越接近機器指令,組合語言就是與機器指令一一對應的。而越高階的語言,一條語句對應的指令數越多,其中原因就是高階語言對底層操作進行了抽象和封裝,使編寫程式的過程更符合人類的思維習慣,並且極大了簡化了人力勞動。也就是說你用高階語言寫一句,會被轉換成許多底層操作,大部分的工作交給了負責轉換的機器(即編譯器),從而人力得到了解放。因為機器就是用來為人類提供便利的,所以說高階語言的出現是計算機發展的必然結果。下面重點解釋為何低階語言的執行效率更高:

低階語言可以透過控制硬體訪問來最佳化效率

越低階的語言月接近底層,即控制硬體訪問的能力越強,對硬體資源的利用效率越高。比如說組合語言能夠訪問暫存器,而C語言就做不到。透過對暫存器等硬體的訪問,我們可以將程式的執行效率最佳化到最大,而像C這樣的高階語言用的最多的是堆疊這樣的記憶體結構,訪問速度自然不如暫存器了。

高階語言程式存在工作冗餘,有效率損失

各種語言需要透過編譯器翻譯成機器碼,不管編譯多麼智慧和強大,都是會產生冗餘。這裡的冗餘不是指指令的多少,而是有沒有做沒有必要的事情。 產生冗餘的多少關鍵要看語言跟機器指令之間的耦合度。耦合度越大,編譯器翻譯過程越簡單,產生的冗餘越少。對應彙編來書,由於與機器碼一一對應,所以翻譯後基本沒有冗餘。而高階語言由於進行了抽象和封裝,所以與機器指令間的耦合度較低,因此整個翻譯過程較複雜,因此在高階語言在具體化的過程中不可避免會產生較多的冗餘。據說C語言有10%的效率損失。

效率高不高,還取決於程式設計師水平

一個差的程式設計師用匯編寫程式,可能存在很多沒有用的操作,而程式高手用c語言寫,可以將程式最佳化到最大。最終的結果可能是彙編的程式跑不過C語言程式。

總之,完成一項工作的工作量是不變的,機器做的 多了,人就做的就少了,同時人對程式的很多細節的控制性也減弱了。各種語言都是在這個平衡點附近糾結。從C/C++的注重機器運算效率的最佳化,到C#/JAVA注重開發效率的最佳化。人操作起來更加方便了,更高效了,代價就是,機器要處理的東西更多,運算效率被進一步壓縮。但是這個壓縮在許可範圍內,那麼這也是一種進步。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2636804/,如需轉載,請註明出處,否則將追究法律責任。

相關文章