細述程式語言的發展過程
編寫計算機程式所用的語言是人與計算機之間交換的工具,按語言對機器的依賴程度分為機器語言、組合語言和高階語言。 |
機器語言是面向機器的語言,每一個由機器語言所編寫的程式只適用於某種特定型別的計算機,即指令程式碼通常隨CPU型號的不同而不同。它可以被計算機硬體直接識別,不需要翻譯。一句機器語言實際上就是一條機器指令,它由操作碼和地址碼組成。機器指令的形式是用0、1組成的二進位制程式碼串。
組合語言是一種面向機器的程式設計語言,它是為特定的計算機或計算機系列設計的。組合語言採用一定的助記符號表示機器語言中指令和資料,即用助記符號代替了二進位制形式的機器指令。這種替代使得機器語言“符號化”,所以組合語言也是符號語言。每條組合語言的指令就對應了一條機器語言的程式碼,不同型號的計算機系統一般有不同的組合語言。
計算機硬體只能識別機器指令,執行機器指令,對於用助記符表示的彙編指令是不能執行的。組合語言編寫的程式要執行的話,必須用一個程式將組合語言翻譯成機器語言程式,用於翻譯的程式稱為彙編程式(彙編系統)。
彙編程式是將用符號表示的彙編指令碼翻譯成為與之對應的機器語言指令碼。用匯編語言編寫的程式稱為源程式,變換後得到的機器語言程式稱為目標程式。
機器語言與組合語言受機器限制費工費時,並且缺乏通用性,為解決此問題,人們努力創造一種獨立於計算機的語言。從20世紀50年代中期開始到20世紀70年代陸續產生了許多高階演算法語言。這些演算法語言中的資料用十進位制來表示,語句用較為接近自然語言的英文字來表示。它們比較接近於人們習慣用的自然語言和數學表示式,因此稱為高階語言。高階語言具有較大的通用性,尤其是有些標準版本的高階演算法語言,在國際上都是通用的。用高階語言編寫的程式能使用在不同的計算機系統上。
但是,對於高階語言編寫的程式計算機是不能識別和執行的。要執行高階語言編寫的程式,首先要將高階語言編寫的程式翻譯成計算機能識別和執行的二進位制機器指令,然後供計算機執行。
一般將用高階語言編寫的程式稱為“源程式”,而把由源程式翻譯成的機器語言程式或組合語言程式稱為“目標程式”。把用來編寫源程式的高階語言或組合語言稱為源語言,而把和目標程式相對應的語言(組合語言或機器語言)稱為目標語言。
計算機將源程式翻譯成機器指令時,通常分兩種翻譯方式:一種為“編譯”方式,另一種為“解釋”方式。所謂編譯方式是把源程式翻譯成等價的目標程式,然後再執行此目標程式。而解釋方式是把源程式逐句翻譯,翻譯一句執行一句,邊翻譯邊執行。解釋程式不產生將被執行的目標程式,而是藉助於解釋程式直接執行源程式本身。一般將高階語言程式翻譯成組合語言或機器語言的程式稱為編譯程式。
高階語言:實現效率高,執行效率低,對硬體的可控性弱,目的碼大,可維護性好,可移植性好 低階語言:實現效率低,執行效率高,對硬體的可控性強,目的碼小,可維護性差,可移植性差
我們都知道CPU執行的是二進位制指令,所有的語言編寫的程式最終都要翻譯成二進位制程式碼,但是為什麼實現會有以上眾多差異呢?下面以C語言為高階語言代表,組合語言為低階語言代表來解釋一下。越低階的語言,形式上越接近機器指令,組合語言就是與機器指令一一對應的。而越高階的語言,一條語句對應的指令數越多,其中原因就是高階語言對底層操作進行了抽象和封裝,使編寫程式的過程更符合人類的思維習慣,並且極大了簡化了人力勞動。也就是說你用高階語言寫一句,會被轉換成許多底層操作,大部分的工作交給了負責轉換的機器(即編譯器),從而人力得到了解放。因為機器就是用來為人類提供便利的,所以說高階語言的出現是計算機發展的必然結果。下面重點解釋為何低階語言的執行效率更高:
越低階的語言月接近底層,即控制硬體訪問的能力越強,對硬體資源的利用效率越高。比如說組合語言能夠訪問暫存器,而C語言就做不到。透過對暫存器等硬體的訪問,我們可以將程式的執行效率最佳化到最大,而像C這樣的高階語言用的最多的是堆疊這樣的記憶體結構,訪問速度自然不如暫存器了。
各種語言需要透過編譯器翻譯成機器碼,不管編譯多麼智慧和強大,都是會產生冗餘。這裡的冗餘不是指指令的多少,而是有沒有做沒有必要的事情。 產生冗餘的多少關鍵要看語言跟機器指令之間的耦合度。耦合度越大,編譯器翻譯過程越簡單,產生的冗餘越少。對應彙編來書,由於與機器碼一一對應,所以翻譯後基本沒有冗餘。而高階語言由於進行了抽象和封裝,所以與機器指令間的耦合度較低,因此整個翻譯過程較複雜,因此在高階語言在具體化的過程中不可避免會產生較多的冗餘。據說C語言有10%的效率損失。
一個差的程式設計師用匯編寫程式,可能存在很多沒有用的操作,而程式高手用c語言寫,可以將程式最佳化到最大。最終的結果可能是彙編的程式跑不過C語言程式。
總之,完成一項工作的工作量是不變的,機器做的 多了,人就做的就少了,同時人對程式的很多細節的控制性也減弱了。各種語言都是在這個平衡點附近糾結。從C/C++的注重機器運算效率的最佳化,到C#/JAVA注重開發效率的最佳化。人操作起來更加方便了,更高效了,代價就是,機器要處理的東西更多,運算效率被進一步壓縮。但是這個壓縮在許可範圍內,那麼這也是一種進步。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2636804/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 程式語言的演化過程
- 程式語言執行過程
- 資訊圖:程式語言的進化過程
- Python程式語言的發展簡史Python
- 【開發語言】PHP、Java、C語言的編譯執行過程PHPJavaC語言編譯
- 非同步的發展過程非同步
- 虛擬化技術的發展歷程簡述
- 需求開發過程步驟簡述
- go語言編譯過程概述Go編譯
- C語言編譯全過程C語言編譯
- Python 語言的發展簡史Python
- MySql特性發展過程(轉)MySql
- js 非同步發展過程JS非同步
- 高階語言反彙編程式的函式呼叫過程 (轉)函式
- C語言程式碼區錯誤以及編譯過程C語言編譯
- 【Go 語言入門專欄】Go 語言的起源與發展Go
- 探索自然語言處理:語言模型的發展與應用自然語言處理模型
- 軟體過程的發展的思考 (轉)
- 國人開發的程式語言-“明”語言
- 3- C語言編譯過程C語言編譯
- C語言編譯過程簡介C語言編譯
- 簡述Socket連線的過程
- 01-大語言模型發展模型
- 細數檔案共享的發展歷程–資訊圖
- c語言程式的執行過程(以輸出hello,world為例)C語言
- 程式設計師簡歷探秘,java語言發展前景程式設計師Java
- 10圖述說微軟公司40年發展歷程微軟
- 回顧我學過的程式語言
- 一種面嚮物件語言的方法呼叫過程。物件
- C語言的編譯連結執行過程C語言編譯
- 從彙編角度分析C語言的過程呼叫C語言
- 深入理解 C 語言的函式呼叫過程函式
- 深入理解C語言的函式呼叫過程C語言函式
- 蛋白質語言模型綜述模型
- Python語言的發展背景是什麼?Python
- 語音特徵引數MFCC計算的詳細過程特徵
- Rust程式語言2022年自身發展展望 - chesterRust
- 細說JavaScript非同步函式發展歷程JavaScript非同步函式