1.2.1 如何讓機(jī)器理解你
計(jì)算機(jī)語言,也就是我們平時(shí)所說的程序設(shè)計(jì)語言,它通常是指一個(gè)能夠完整、準(zhǔn)確和規(guī)則地表達(dá)人們的意圖,并用以指揮或控制計(jì)算機(jī)工作的“符號(hào)系統(tǒng)”。計(jì)算機(jī)語言是人與機(jī)器交流意思、傳遞指令的渠道和媒介。類比于人類的自然語言,二者之間有許多相似之處,它們都是使用有限的簡(jiǎn)單符號(hào),經(jīng)過組合后來表達(dá)復(fù)雜多變的含義,從而構(gòu)建出豐富多彩的計(jì)算機(jī)軟件。
計(jì)算機(jī)語言通常分為3類:即機(jī)器語言、匯編語言和高級(jí)語言,如圖1-4所示。某些文獻(xiàn)上又把機(jī)器語言和匯編語言統(tǒng)稱為低級(jí)語言,本書仍把它們分別對(duì)待。

圖1-4 計(jì)算機(jī)語言
計(jì)算機(jī)硬件是以電路為基礎(chǔ)的“電子系統(tǒng)”。對(duì)于一條電路而言,所處的狀態(tài)要么是通路,要么是斷路,這也就奠定了計(jì)算機(jī)本身的“二值性”,在計(jì)算機(jī)的世界里,只有0和1兩種狀態(tài),它也僅能讀懂用二進(jìn)制格式編寫的代碼。因此,機(jī)器語言作為一種直接與機(jī)器進(jìn)行通信的語言,就是一種使用二進(jìn)制代碼表示的計(jì)算機(jī)能夠直接識(shí)別和執(zhí)行的機(jī)器指令的集合。機(jī)器語言是計(jì)算機(jī)的設(shè)計(jì)者通過計(jì)算機(jī)的硬件結(jié)構(gòu)賦予計(jì)算機(jī)的操作功能,機(jī)器語言的特點(diǎn)在于靈活和高效。
很多讀者往往覺得機(jī)器語言諱莫如深,一個(gè)看似雜亂無章的二進(jìn)制序列,機(jī)器何以給出正確的解釋并執(zhí)行相應(yīng)的指令,對(duì)于這個(gè)問題很多讀者都百思不得其解。在本書第5章中,我們將用高級(jí)語言編寫的一條語句還原成了機(jī)器語言的模樣,到那時(shí)上述疑問也就可以迎刃而解了!
用機(jī)器語言編寫程序難度很高,編程人員首先要熟記所用計(jì)算機(jī)的全部指令代碼和代碼的含義。而且對(duì)于不同型號(hào)、不同品牌及不同類型的硬件,其機(jī)器語言的指令集是有差別的,這給機(jī)器語言的使用和推廣造成了障礙。此外,在手工編寫機(jī)器語言代碼時(shí),程序員不得不自己處理每條指令和每個(gè)數(shù)據(jù)的存儲(chǔ)分配和輸入/輸出,還得記住編程過程中每步所使用的工作單元處在何種狀態(tài)。即使一個(gè)看似非常簡(jiǎn)單的操作或功能,使用機(jī)器語言來實(shí)現(xiàn)也是十分煩瑣而復(fù)雜的,實(shí)際中編寫機(jī)器語言程序花費(fèi)的時(shí)間往往是機(jī)器執(zhí)行時(shí)間的幾十倍甚至幾百倍。這還不是最糟糕的!使用機(jī)器語言編寫的程序可讀性極差,維護(hù)起來也相當(dāng)困難,由于語句本身是大量0和1交錯(cuò)的二進(jìn)制序列,看上去令人眼花繚亂,極易出錯(cuò)。同一個(gè)人編寫的程序在相隔一段時(shí)間后再去閱讀時(shí)理解起來也非常不容易。因此,目前除了計(jì)算機(jī)硬件制造商的少數(shù)專業(yè)人員以外,已經(jīng)很少有人再去學(xué)習(xí)機(jī)器語言了。
早期的計(jì)算機(jī)程序設(shè)計(jì)只能由少數(shù)的專業(yè)人員來完成,第一批計(jì)算機(jī)科學(xué)家,例如圖靈、馮·諾依曼等人都是公認(rèn)的數(shù)學(xué)天才。這在很大程度上阻礙了計(jì)算機(jī)技術(shù)的推廣和長(zhǎng)遠(yuǎn)發(fā)展。既然機(jī)器語言有諸多弊端,于是有人開始考慮改進(jìn)。為了克服機(jī)器語言難讀、難編、難記和易出錯(cuò)的缺點(diǎn),計(jì)算機(jī)科學(xué)家和工程技術(shù)人員就用與代碼指令實(shí)際含義相近的英文縮寫詞、字母和數(shù)字等符號(hào)來取代指令代碼,于是匯編語言應(yīng)運(yùn)而生。在匯編語言中,縮寫詞ADD表示加法,MOV則代表數(shù)據(jù)傳送,這無疑在很大程度上減輕了開發(fā)人員的編程難度。如此一來,程序員很容易讀懂并理解程序在干什么,糾錯(cuò)及維護(hù)都變得方便了。目前,在中國的各大高校中,計(jì)算機(jī)專業(yè)的學(xué)生仍然把匯編語言作為一門必修課來學(xué)習(xí)。
匯編語言是一種用助記符表示的仍然面向機(jī)器的計(jì)算機(jī)語言。作為第二代計(jì)算機(jī)語言,它相比于機(jī)器語言有了長(zhǎng)足的發(fā)展。然而計(jì)算機(jī)是不認(rèn)識(shí)這些助記符的,這就需要一個(gè)專門的程序,專門負(fù)責(zé)將這些符號(hào)翻譯成計(jì)算機(jī)能夠理解的二進(jìn)制序列(即機(jī)器語言),這種翻譯程序就被稱為匯編程序。
由于匯編語言采用了助記符來編寫程序,比用機(jī)器語言的二進(jìn)制代碼編程要方便些,在一定程度上簡(jiǎn)化了編程過程。但由于需要使用匯編程序來進(jìn)行中間翻譯工作,因此效率比機(jī)器語言稍有下降,但仍然保持了相對(duì)的高效性。
但匯編語言仍然存在一定的問題。首先,匯編語言仍然是面向機(jī)器的語言,學(xué)習(xí)和使用它仍然比較煩瑣而費(fèi)時(shí)。其次,匯編語言的通用性差,不同型號(hào)和類型的硬件設(shè)備所采用的匯編指令系統(tǒng)存在很大的差異,這在很大程度上限制了匯編語言的使用。
不論是機(jī)器語言還是匯編語言都是面向硬件具體操作的,因此把它們統(tǒng)稱為低級(jí)語言是有一定道理的。低級(jí)語言本身對(duì)機(jī)器過分依賴,要求使用者必須對(duì)硬件結(jié)構(gòu)及其工作原理都十分熟悉,這對(duì)非計(jì)算機(jī)專業(yè)人員來說是很難做到的。從最初與計(jì)算機(jī)交流的痛苦經(jīng)歷中人們意識(shí)到,應(yīng)該設(shè)計(jì)這樣一種編程語言——接近于人類的自然語言,同時(shí)又不依賴于計(jì)算機(jī)硬件,編出的程序還能在所有機(jī)器上通用。于是高級(jí)語言終于誕生了。縱觀計(jì)算機(jī)程序設(shè)計(jì)語言的發(fā)展歷程,程序設(shè)計(jì)語言經(jīng)歷了從機(jī)器語言、匯編語言到高級(jí)語言的歷程。這段經(jīng)歷雖然漫長(zhǎng),但從無到有、從弱到強(qiáng)的發(fā)展過程也折射出計(jì)算機(jī)技術(shù)時(shí)過境遷、飛速發(fā)展的歷史腳步。
高級(jí)語言的出現(xiàn)具有劃時(shí)代的意義,它是一種與自然語言相近并為計(jì)算機(jī)所接受和執(zhí)行的計(jì)算機(jī)語言,更重要的是它是面向用戶的語言。無論何種機(jī)型的計(jì)算機(jī),只要配備上相應(yīng)的高級(jí)語言的編譯或解釋程序,用該高級(jí)語言編寫的程序就可以在此計(jì)算機(jī)上正常運(yùn)作。
和匯編語言相比,高級(jí)語言不但將許多相關(guān)的機(jī)器指令合成為單條指令,并且去掉了與具體操作有關(guān)但與完成工作無關(guān)的細(xì)節(jié),例如使用堆棧、寄存器等,從而大大簡(jiǎn)化了程序中的指令。此外,由于省略了很多細(xì)節(jié),開發(fā)人員也就不需要有太多的專業(yè)知識(shí)了。這為高級(jí)語言本身的發(fā)展和推廣提供了有力保證,也為計(jì)算機(jī)事業(yè)的發(fā)展注入了持久的動(dòng)力。如果說個(gè)人計(jì)算機(jī)的出現(xiàn)使計(jì)算機(jī)走進(jìn)了千家萬戶,那么高級(jí)語言的出現(xiàn)就使得計(jì)算機(jī)程序設(shè)計(jì)不再是少數(shù)天才的專利。從此,計(jì)算機(jī)世界里發(fā)生了翻天覆地的變化,世界為之震驚!
高級(jí)語言主要是相對(duì)于匯編語言而言的,它并不是特指某一種具體的語言,而是包括了很多編程語言,不同高級(jí)語言的語法、命令格式是各不相同的。世界上第一個(gè)高級(jí)語言FORTRAN誕生于1954年,它是第一個(gè)完全脫離機(jī)器硬件的高級(jí)語言。在科學(xué)計(jì)算和工程領(lǐng)域,F(xiàn)ORTRAN語言仍然有廣泛的應(yīng)用。半個(gè)世紀(jì)以來,世界上共有幾百種高級(jí)語言出現(xiàn),其中有重要意義的也多達(dá)幾十種之多。其中,影響較大、使用較普遍、大家耳熟能詳?shù)挠蠪ORTRAN、ALGOL、COBOL、Basic、Pascal、C、C++、Java等。下面介紹幾種較有代表性的高級(jí)程序設(shè)計(jì)語言。
1.Basic語言
Basic語言全稱是Beginners’ All-Purpose Symbolic Instruction Code,意為“初學(xué)者通用符號(hào)指令代碼”。Basic語言于1964年由美國的兩位計(jì)算機(jī)科學(xué)家G. Kemeny和Thomas E. Kurtz在FORTRAN語言的基礎(chǔ)上創(chuàng)造而成。
Basic 具有易學(xué)、易懂、易記、易用的特點(diǎn),于是很快得到了推廣與應(yīng)用,現(xiàn)在它不僅是適合于初學(xué)者學(xué)習(xí)的入門語言,同時(shí)也是可以進(jìn)行科學(xué)計(jì)算、數(shù)據(jù)處理等工作的高級(jí)程序設(shè)計(jì)語言。
1975年,微軟公司成功地把Basic語言的編譯器移植到使用Intel處理器的ALR計(jì)算機(jī)中。此后,微軟還在其發(fā)布的DOS操作系統(tǒng)中免費(fèi)加入了GW-Basic、QBasic等當(dāng)時(shí)最好的Basic 解釋程序。自從Windows操作系統(tǒng)出現(xiàn)以來,圖形用戶界面(GUI)的Basic語言一躍成為當(dāng)今應(yīng)用最廣泛的程序設(shè)計(jì)語言之一,也就是聞名遐邇的Visual Basic。
2.Pascal語言
Pascal(B. Pascal)是17世紀(jì)法國著名數(shù)學(xué)家,他于1642年曾發(fā)明了現(xiàn)代臺(tái)式計(jì)算機(jī)的雛型機(jī)——加減法計(jì)算機(jī),Pascal語言正是得名于此。
Pascal語言由瑞士蘇黎士聯(lián)邦工業(yè)大學(xué)的沃斯(N.Wirth)教授研制,并于1971年正式發(fā)布。此外,沃斯一生還寫作了大量有關(guān)程序設(shè)計(jì)、算法和數(shù)據(jù)結(jié)構(gòu)的著作,因此,他于1984年獲得了計(jì)算機(jī)最高獎(jiǎng)——“圖靈獎(jiǎng)”。
不得不強(qiáng)調(diào),Pascal 語言是高級(jí)語言發(fā)展過程中一個(gè)重要的里程碑。Pascal 語言是第一個(gè)系統(tǒng)地體現(xiàn)了E. W. Dijkstra和C. A. R. Hoare定義的結(jié)構(gòu)化程序設(shè)計(jì)概念的語言。作為世界上第一個(gè)結(jié)構(gòu)化的程序設(shè)計(jì)語言,它的出現(xiàn)標(biāo)志著結(jié)構(gòu)化程序設(shè)計(jì)時(shí)期的開始。Pascal語言本身是從ALGOL 60衍生而來的,但其功能更加強(qiáng)大且容易使用。Pascal語言具有大量的控制結(jié)構(gòu),充分反映了結(jié)構(gòu)化程序設(shè)計(jì)的思想和要求,直觀易懂,使用靈活,既可用于科學(xué)計(jì)算,又能用來編寫系統(tǒng)軟件,應(yīng)用范圍極廣。
在Pascal語言問世以來的30余年間,先后產(chǎn)生了適合于不同機(jī)型的各種版本。其中,影響最大的莫過于Turbo Pascal系列軟件,它是由美國Borland公司設(shè)計(jì)、研制的一種適用于微機(jī)的Pascal編譯系統(tǒng)。后來在Anders Hejlsberg(Turbo Pascal的作者)的領(lǐng)導(dǎo)下,Borland公司于1995年發(fā)布了Delphi 1快速應(yīng)用開發(fā)(RAD)環(huán)境,Delphi目前仍然是業(yè)內(nèi)使用最廣泛的一款集成開發(fā)工具之一,它正是以Pascal語言為基礎(chǔ)的圖形用戶界面的集成開發(fā)環(huán)境。這個(gè)產(chǎn)品到現(xiàn)在依然是Borland公司最成功、最引以為傲的經(jīng)典之作,到本書截稿之日,Delphi 2009已經(jīng)正式發(fā)布。
3.Java語言
Java是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語言(以下簡(jiǎn)稱Java語言)和Java平臺(tái)的總稱。Java平臺(tái)由Java虛擬機(jī)(JVM)和Java 應(yīng)用編程接口構(gòu)成。Java應(yīng)用編程接口為Java應(yīng)用提供了一個(gè)獨(dú)立于操作系統(tǒng)的標(biāo)準(zhǔn)接口,分為基本部分和擴(kuò)展部分。在硬件或操作系統(tǒng)平臺(tái)上安裝一個(gè)Java平臺(tái)之后,Java應(yīng)用程序就可運(yùn)行了。現(xiàn)在Java平臺(tái)已經(jīng)嵌入了幾乎所有的操作系統(tǒng),這樣Java程序只編譯一次,就可以在各種系統(tǒng)中運(yùn)行。目前, Java分為3個(gè)體系:J2SE、J2EE和J2ME。如圖1-5所示為Sun公司的Java主頁。

圖1-5 Sun公司的Java主頁
就Java語言本身來說,它是一種簡(jiǎn)單的、面向?qū)ο蟮摹⒎植际降摹⒔忉尩摹⒔训摹踩摹⒔Y(jié)構(gòu)中立的、可移植的、性能很優(yōu)異的、多線程的、動(dòng)態(tài)的語言。當(dāng)1995年Sun推出Java語言之后,全世界的目光都被這個(gè)神奇的語言所吸引。但事實(shí)上,Java語言最早誕生于1991年,起初被稱為OAK語言,是Sun公司為一些消費(fèi)性電子產(chǎn)品而設(shè)計(jì)的一個(gè)通用環(huán)境。最初的目的只是為了開發(fā)一種獨(dú)立于平臺(tái)的軟件技術(shù),而且在網(wǎng)絡(luò)出現(xiàn)之前,OAK可以說是默默無聞,甚至差點(diǎn)夭折。但是,互聯(lián)網(wǎng)的飛速發(fā)展使Java一躍成為整個(gè)世界的寵兒。Java在Web上的應(yīng)用一改以往Internet上信息內(nèi)容的乏味和死板,使世人眼前為之一亮。自從Sun公司于1995年正式以Java這個(gè)名字推出該產(chǎn)品后,幾乎所有的Web開發(fā)人員都被他迷倒了。從此,伴隨著互聯(lián)網(wǎng)時(shí)代的來臨,Java取得了巨大的成功。
Java語言的優(yōu)良特性使得Java應(yīng)用具有無比的健壯性和可靠性,這也減少了應(yīng)用系統(tǒng)的維護(hù)費(fèi)用。Java對(duì)對(duì)象技術(shù)的全面支持和Java平臺(tái)內(nèi)嵌的API能縮短應(yīng)用系統(tǒng)的開發(fā)時(shí)間并降低成本。Java的編譯一次、到處可運(yùn)行的特性使得它能夠提供一個(gè)隨處可用的開放結(jié)構(gòu)和在多平臺(tái)之間傳遞信息的低成本方式。特別是Java企業(yè)應(yīng)用編程接口為企業(yè)計(jì)算及電子商務(wù)應(yīng)用系統(tǒng)提供了有關(guān)技術(shù)和豐富的類庫。總的來說,Java語言主要具有如下的特點(diǎn):
● Java語言是簡(jiǎn)單的。
● Java語言是純粹面向?qū)ο蟮摹?/p>
● Java語言是分布式的。
● Java語言是健壯的。
● Java語言是安全的。
● Java語言是體系結(jié)構(gòu)中立的。
● Java語言是可移植的。
● Java語言是多線程的。
● Java語言是動(dòng)態(tài)的。
早期受計(jì)算機(jī)硬件本身的限制,程序運(yùn)行效率是工程技術(shù)人員必須考慮的問題,隨著計(jì)算機(jī)硬件技術(shù)的進(jìn)步,效率已經(jīng)不再是人們考慮的頭等問題。于是編程語言擺脫了原有的硬件束縛,朝著更加多元化、人性化的方向發(fā)展。當(dāng)然,高級(jí)語言也需要面對(duì)和匯編語言同樣的問題,即機(jī)器如何理解它呢?計(jì)算機(jī)并不能直接地接受和執(zhí)行用高級(jí)語言編寫的代碼,要使機(jī)器能夠明白用高級(jí)語言所寫的代碼,有兩種可行的方法:一種是對(duì)程序進(jìn)行編譯;另一種則是對(duì)程序進(jìn)行解釋。據(jù)此,高級(jí)語言又可分為兩類,即編譯類語言和解釋類語言。
在具體介紹上述兩類高級(jí)語言之前,我們先給出翻譯的概念。所謂翻譯,就是指在計(jì)算機(jī)中放置一個(gè)能由計(jì)算機(jī)直接執(zhí)行的翻譯程序,它以某一種程序設(shè)計(jì)語言(源語言)所編寫的程序(源程序)作為翻譯或加工的對(duì)象,當(dāng)計(jì)算機(jī)執(zhí)行翻譯程序時(shí),就將它翻譯為與之等價(jià)的另一種語言(目標(biāo)語言)的程序(目標(biāo)程序)。如果一個(gè)翻譯程序的源語言是某種高級(jí)語言,其目標(biāo)語言是相對(duì)于某一計(jì)算機(jī)的匯編語言或者機(jī)器語言,則稱這種翻譯程序?yàn)榫幾g程序(或者編譯器)。一旦計(jì)算機(jī)上裝有這種編譯程序,那么當(dāng)源程序輸入計(jì)算機(jī)時(shí),源程序就可以通過編譯程序被翻譯成機(jī)器語言形式的目標(biāo)程序,計(jì)算機(jī)就能夠識(shí)別和執(zhí)行。而編譯和解釋就是“翻譯”的兩種具體方式。
編譯是指事先編好一個(gè)稱為編譯程序的機(jī)器語言程序并作為系統(tǒng)軟件存放在計(jì)算機(jī)內(nèi),當(dāng)用戶把由高級(jí)語言編寫的源程序輸入計(jì)算機(jī)后,編譯程序便把源程序整個(gè)地翻譯成用機(jī)器語言表示的與之等價(jià)的目標(biāo)程序,然后計(jì)算機(jī)再執(zhí)行該目標(biāo)程序,以完成源程序要處理的運(yùn)算并取得結(jié)果。也就是說,在應(yīng)用源程序執(zhí)行之前,程序源代碼就已經(jīng)被整體“翻譯”成目標(biāo)代碼(機(jī)器語言)了,這樣目標(biāo)程序就可以脫離其語言環(huán)境獨(dú)立執(zhí)行,使用比較方便、效率較高。現(xiàn)在大多數(shù)的編程語言都是編譯型的,例如C/C++、Pascal、FORTRAN和COBOL等。
解釋的執(zhí)行方式類似于日常生活中的“同聲傳譯”,也就是說,應(yīng)用程序源代碼一邊由相應(yīng)語言的解釋器“翻譯”成目標(biāo)代碼(機(jī)器語言),一邊執(zhí)行,因此解釋型的程序并不會(huì)產(chǎn)生目標(biāo)程序。這樣的好處在于它比較靈活,并可以動(dòng)態(tài)地調(diào)整、修改應(yīng)用程序。但解釋型程序的效率比較低,而且不能生成可獨(dú)立執(zhí)行的可執(zhí)行文件,即應(yīng)用程序不能脫離其解釋器。翻譯程序的結(jié)構(gòu)比編譯程序簡(jiǎn)單,且占用內(nèi)存較少,因此一些規(guī)模較小的語言常采用這種方式,如BASIC。然而,就目前的情況來看,純粹的解釋程序并不多見,通常的做法都是把編譯和解釋作某種程度的結(jié)合,從而彌補(bǔ)解釋型程序效率不高的弱點(diǎn)。
- C++案例趣學(xué)
- FreeSWITCH 1.8
- Mastering Selenium WebDriver
- Python 深度學(xué)習(xí)
- Python零基礎(chǔ)快樂學(xué)習(xí)之旅(K12實(shí)戰(zhàn)訓(xùn)練)
- Hands-On GPU:Accelerated Computer Vision with OpenCV and CUDA
- 快速念咒:MySQL入門指南與進(jìn)階實(shí)戰(zhàn)
- C語言程序設(shè)計(jì)教程
- Vue.js 2 Web Development Projects
- Unity&VR游戲美術(shù)設(shè)計(jì)實(shí)戰(zhàn)
- R數(shù)據(jù)科學(xué)實(shí)戰(zhàn):工具詳解與案例分析
- Building a Media Center with Raspberry Pi
- Learning Apache Thrift
- Apache Kafka 1.0 Cookbook
- 微服務(wù)設(shè)計(jì)