1. 程式人生 > >高階語言.組合語言和機器語言

高階語言.組合語言和機器語言

 機器語言 <![endif]> (Machine language)

機器語言Machine Language(低階語言)

機器語言是計算機唯一能接受和執行的語言。機器語言由二進位制碼組成,每一串二進位制碼叫做一條指令。一條指令規定了計算機執行的一個動作。一臺計算機所能懂得的指令的全體,叫做這個計算機的指令系統。不同型號的計算機的指令系統不同。

指令通常由幾個位元組組成,第一個位元組是操作碼,它規定了計算機要執行的基本操作;後面的位元組是運算元,它規定了操作物件或操作物件的地址。

機器語言是直接用二進位制程式碼指令表達的計算機語言,指令是用0和1組成的一串程式碼,它們有一定的位數,並分成若干段,各段的編碼表示不同的含義,例如某臺計算機字長為16位,即有16個二進位制陣列成一條指令或其它資訊。16個0和1可組成各種排列組合,通過線路變成電訊號,讓計算機執行各種不同的操作。

如某種計算機的指令為1011011000000000,它表示讓計算機進行一次加法操作;而指令1011010100000000則表示進行一次減法操作。它們的前八位表示操作碼,而後八位表示地址碼。從上面兩條指令可以看出,它們只是在操作碼中從左邊第0位算起的第6和第7位不同。這種機型可包含256(=28)個不同的指令。

機器語言或稱為二進位制程式碼語言,計算機可以直接識別,不需要進行任何翻譯。每臺機器的指令,其格式和程式碼所代表的含義都是硬性規定的,故稱之為面向機器的語言,也稱為機器語言。它是第一代的計算機語言。機器語言對不同型號的計算機來說一般是不同的。

使用機器語言編寫程式是一種相當煩瑣的工作,既難於記憶也難於操作,編寫出來的程式全是由0和1的數字組成,直觀性差、難以閱讀。不僅難學、難記、難檢查、又缺乏通用性,給計算機的推廣使用帶來很大的障礙。

最早的程式設計語言都採用機器語言來編寫。當時,要在計算機上執行的所有演算法都必須直接用機器語言來表達,計算機才能接受。演算法的運算序列包括運算物件和運算結果都必須轉換為指令序列。其中的每一條指令都以編碼(指令碼和地址碼)的形式出現。與演算法語言表達的演算法,相差十萬八千里。對於沒受過程式設計專門訓練的人來說,一份程式恰似一份"天書",讓人看了不知所云,可讀性極差。

用機器語言表達演算法的運算、資料和控制十分繁雜瑣碎,因為機器語言所提供的指令太初等、原始。機器語言只接受算術運算、按位邏輯運算和數的大小比較運算等。對於稍複雜的運算,都必須一一分解,直到到達最初等的運算才能用相應的指令替代之。機器語言能直接表達的資料只有最原始的位、位元組、和字三種。演算法中即使是最簡單的資料如布林值、字元、整數、和實數,也必須一一地對映到位、位元組和字中,還得一一分配它們的儲存單元。對於演算法中有結構的資料的表達則要麻煩得多。機器語言所提供的控制轉移指令也只有無條件轉移、條件轉移、進入子程式和從子程式返回等最基本的幾種。用它們來構造迴圈、形成分支、呼叫函式和過程得事先做許多的準備,還得靠許多的技巧。

直接用機器語言表達演算法有許多缺點。

Ø         大量繁雜瑣碎的細節牽制著程式設計師,使他們不可能有更多的時間和精力去從事創造性的勞動,執行對他們來說更為重要的任務。如確保程式的正確性、高效性。

Ø         程式設計師既要駕馭程式設計的全域性又要深入每一個區域性直到實現的細節,即使智力超群的程式設計師也常常會顧此失彼,屢出差錯,因而所編出的程式可靠性差,且開發週期長。

Ø         由於用機器語言進行程式設計的思維和表達方式與人們的習慣大相徑庭,只有經過較長時間職業訓練的程式設計師才能勝任,使得程式設計曲高和寡。

Ø         因為它的書面形式全是"密"碼,所以可讀性差,不便於交流與合作。

Ø         因為它嚴重地依賴於具體的計算機,所以可移植性差,重用性差。

這些弊端造成當時的計算機應用未能迅速得到推廣。



組合語言(Assember language)
組合語言Assembler Language(低階語言)

為了克服機器語言上述的缺點,出路在於程式設計語言的抽象,讓它儘可能地接近於演算法語言。為此,人們首先注意到的是可讀性和可移植性,因為它們相對地容易通過抽象而得到改善。於是,很快就出現組合語言。這種語言對機器語言的抽象,首先表現在將機器語言的每一條指令符號化:指令碼代之以記憶符號,地址碼代之以符號地址,使得其含義顯現在符號上而不再隱藏在編碼中,可讓人望"文"生義。其次表現在這種語言擺脫了具體計算機的限制,可在不同指令集的計算機上執行,只要該計算機配上組合語言的一個彙編程式。這無疑是機器語言朝演算法語言靠攏邁出的一步。但是,它離演算法語言還太遠,以致程式設計師還不能從分解演算法的資料、運算和控制到彙編才能直接表達的指令等繁雜瑣碎的事務中解脫出來。

用能反映指令功能的助記符表達的計算機語言叫組合語言。它是符號化了的機器語言。用匯編語言編寫的程式叫組合語言源程式,計算機無法執行。必須用匯程式設計序把它翻譯成機器語言目標程式,計算機才能執行。這個翻譯過程稱為彙編過程。

組合語言是用助記符表示指令功能的計算機語言。與機器語言相比,組合語言具有以下的幾個特點:第一,它使用符號來表示操作碼和地址碼,這種符號便於記憶,稱為記憶碼。第二,彙編程式自動處理儲存分配,毋需程式設計師做儲存分配工作。第三,程式設計師可以直接書寫十進位制數`

例如,要計算c=7+8,可以用如下幾條彙編命令:

標號        指令                   說明

START      GET 7;          把7送進累加器ACC中

             ADD 8;         累加器ACC+8送進累加器ACC中

             PUT C;         把累加器ACC送進C中

END        STOP;          停機

其中(ACC)表示累加器中的值,等等。

如此簡單的組合語言,只是符號形式的機器語言,但用它來編寫程式或閱讀已經編寫好的程式比起機器語言來要簡單和方便多了。這就是計算機語言發展中的第二代語言—組合語言。人們使用這種助記符編寫程式後,要是計算機能夠接受,還必須把編好的程式逐條翻譯成二進位制編碼的機器語言。當然,這個工作並不是有程式設計師來完成,而是有稱為“彙編程式”的程式自動完成的。彙編程式的功能就是把由組合語言編寫的程式(稱為組合語言源程式)翻譯成機器語言程式,計算機才能執行該程式。這個翻譯過程稱為彙編。

組合語言比起機器語言在很多方面都有很大的優越性,如編寫容易、修改方便、閱讀簡單、程式清楚等,但在計算機語言系統中,把組合語言仍然列入“低階語言”的範疇,它仍然是屬於面向機器的語言,也就是說,不同的計算機可以有不同的指令集。

高階語言(High-level language)
高階語言

機器語言和組合語言都是面向機器的,高階語言是面向使用者的。到了50年代中期,出現程式設計的高階語言如Fortran,Algol60,以及後來的PL/l,Pascal等,演算法的程式表達才產生一次大的飛躍。用高階語言編寫的程式叫做高階語言源程式,必須翻譯成機器語言目標程式才能被計算機執行。高階語言的翻譯有兩種方式:編譯方式和解釋方式。

Ø         編譯方式:先由編譯程式把高階語言源程式翻譯成目標程式,執行時執行目標程式。

Ø         2.解釋方式:在執行高階語言源程式時,由解釋程式對源程式邊翻譯邊執行。

誠然,演算法最終要表達為具體計算機上的機器語言才能在該計算機上執行,得到所需要的結果。但組合語言的實踐啟發人們,表達成機器語言不必一步到位,可以分兩步走或者可以築橋過河。即先表達成一種中介語言,然後轉成機器語言。組合語言作為一種中介語言,並沒有獲得很大成功,原因是它離演算法語言還太遠。這便指引人們去設計一種儘量接近演算法語言的規範語言,即所謂的高階語言,讓程式設計師可以用它方便地表達演算法,然後藉助於規範的高階語言到規範的機器語言的"翻譯",最終將演算法表達為機器語言。而且,由於高階語言和機器語言都具有規範性,這裡的"翻譯"完全可以機械化地由計算機來完成,就像組合語言被翻譯成機器語言一樣,只要計算機配上一個編譯程式。

上述兩步,前一步由程式設計師去完成,後一步可以由編譯程式去完成。在規定清楚它們各自該做什麼之後,這兩步是完全獨立的。它們各自該如何做互不相干。前一步要做的只是用高階語言正確地表達給定的演算法,產生一個高階語言程式;後一步要做的只是將第一步得到的高階語言程式翻譯成機器語言程式。至於程式設計師如何用高階語言表達演算法和編譯程式如何將高階語言表達的演算法翻譯成機器語言表達的演算法,顯然毫不相干。

為了解決低階語言的缺點,人們為了從根本上擺脫語言對機器的依賴,使之獨立於機器,由面向機器改為面向過程,經過多年精心的研究,終於在1954年首先創造出一種與具體的計算機指令系統無關的、表達方式或接近於人們對求解過程或問題的描述方式,且易於掌握和書寫的語言,這就是FORTRAN語言。人們把具有以上特點的語言稱為高階語言,這就是計算機語言系統中的第三代語言。

例如計算A=1+2,若用高階語言(如BASIC語言)編寫,只要兩條語句:

10       A=1+2

11       END

就可以完成A=1+2的操作。這種語言,人們易於掌握和理解,即使小學生也容易掌握,便於推廣,它不再是面向機器,而是“面向過程”,即使用者不僅要告訴計算機“做什麼”,還要告訴計算機“怎麼做”,也就是把每一步操作事先設計好,然後再編寫程式,讓計算機按照指定的步驟去執行。目前,世界上已經有幾百種不同型別、功能各異的高階語言。使用較多的有:

BASIC

FORTRAN

PASCAL

C

PL/I

ADA

LISP

程式設計語言從機器語言到高階語言的抽象,帶來的主要好處是:

高階語言接近演算法語言,易學、易掌握,一般工程技術人員只要幾周時間的培訓就可以勝任程式設計師的工作;
高階語言為程式設計師提供了結構化程式設計的環境和工具,使得設計出來的程式可讀性好,可維護性強,可靠性高;
高階語言遠離機器語言,與具體的計算機硬體關係不大,因而所寫出來的程式可移植性好,重用率高;
由於把繁雜瑣碎的事務交給了編譯程式去做,所以自動化程度高,開發週期短,且程式設計師得到解脫,可以集中時間和精力去從事對於他們來說更為重要的創造性勞動,以提高程式的質量。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

程式語言的種類之一,由被稱作翻譯器(interpreter)的軟體一邊把人類記述的程式變換成電腦可執行的形式,一邊執行的形式的語言。

解釋語言是 電腦使用的機器語言,與機器語言1對1地對應的組合語言相比,高抽象度,與人類平常使用的自然語言相近的感覺的高階語言。由於電腦無法識別人類所記述的原始碼,所以由解釋語言(指令碼引擎)翻譯成機器語言,變換成可執行的程式。

高階語言裡還有,一併地轉換成機器語言的程式之後再執行的編譯語言。這個語言,由於需要先把程式轉換成機器語言程式然後再執行,所以在開發的速度與容易度,修正的方便性上都不如組合語言,但是,由於不需要同時翻譯,所以在實效速度上佔有很大的優勢。還有,解釋語言中的執行

環境裡需要原始碼,編譯語言裡就不需要。