在計算機科學(xué)中,的確遇到很多這樣的案例。比如我們現(xiàn)在使用的gcc和c語言程序的關(guān)系堕战,記得大一那會兒一直搞不明白,感覺很奇怪拍霜。既然c語言程序要用gcc編譯才能運行嘱丢,而gcc本身又是c語言程序,那gcc是怎么被編譯出來的祠饺,gcc嗎越驻?解答一是gcc由其他語言編譯器編譯出來。那其他語言的編譯器又是什么編譯器編譯出來的呢道偷?也就是說缀旁,總得有一個上帝一樣的編譯器,它一開始就不用編譯勺鸦。這個上帝一樣的編譯器到底是什么啊并巍。學(xué)過匯編的人應(yīng)該知道,匯編語言是最接近硬件的語言换途,如果你的程序是匯編語言寫的懊渡,那么需要一個匯編器,但是最開始哪兒有匯編器军拟。其實距贷,匯編語言又叫助記符,每一個指令都對應(yīng)著一個二進(jìn)制編碼吻谋。呵呵忠蝗,上帝編譯器其實就是人啊……計算機早期,其實都是自己在紙條上寫完程序后漓拾,然后對照編碼表阁最,一步一步翻譯成機器語言的。人腦是計算速度最慢的編譯器骇两,但卻是計算機的上帝編譯器速种。另一個案例是機器學(xué)習(xí),有很多這樣的問題低千,輸入一批數(shù)據(jù)配阵,訓(xùn)練馏颂,再用輸出結(jié)果,調(diào)整參數(shù)再將輸出作為輸入棋傍。這樣一來救拉,就是先有輸出還是輸入的問題,但是問題是一開始輸入和輸出都沒有瘫拣。此時的辦法就是人為設(shè)定一個輸入亿絮,比如一批隨機輸入數(shù)據(jù)。最后麸拄,還有一個比較常見的就是對數(shù)據(jù)的描述信息派昧,我們稱之為元數(shù)據(jù)meta data。元數(shù)據(jù)就是一個鏈拢切,一直指向目標(biāo)數(shù)據(jù)蒂萎,而同時目標(biāo)數(shù)據(jù)中也可以含有發(fā)現(xiàn)元數(shù)據(jù)的能力,這樣一個雙向鏈中淮椰,也需要一個最初的元數(shù)據(jù)五慈,而這個元數(shù)據(jù)可能就是人為設(shè)定死的。
機器語言 (Machine language)
機器語言Machine Language(低級語言)
機器語言是計算機唯一能接受和執(zhí)行的語言实苞。機器語言由二進(jìn)制碼組成豺撑,每一串二進(jìn)制碼叫做一條指令烈疚。一條指令規(guī)定了計算機執(zhí)行的一個動作黔牵。一臺計算機所能懂得的指令的全體,叫做這個計算機的指令系統(tǒng)爷肝。不同型號的計算機的指令系統(tǒng)不同猾浦。
指令通常由幾個字節(jié)組成,第一個字節(jié)是操作碼灯抛,它規(guī)定了計算機要執(zhí)行的基本操作金赦;后面的字節(jié)是操作數(shù),它規(guī)定了操作對象或操作對象的地址对嚼。
機器語言是直接用二進(jìn)制代碼指令表達(dá)的計算機語言夹抗,指令是用0和1組成的一串代碼,它們有一定的位數(shù)纵竖,并分成若干段漠烧,各段的編碼表示不同的含義,例如某臺計算機字長為16位靡砌,即有16個二進(jìn)制數(shù)組成一條指令或其它信息已脓。16個0和1可組成各種排列組合,通過線路變成電信號通殃,讓計算機執(zhí)行各種不同的操作度液。
如某種計算機的指令為1011011000000000,它表示讓計算機進(jìn)行一次加法操作;而指令1011010100000000則表示進(jìn)行一次減法操作堕担。它們的前八位表示操作碼已慢,而后八位表示地址碼。從上面兩條指令可以看出照宝,它們只是在操作碼中從左邊第0位算起的第6和第7位不同蛇受。這種機型可包含256(=28)個不同的指令。
機器語言或稱為二進(jìn)制代碼語言厕鹃,計算機可以直接識別兢仰,不需要進(jìn)行任何翻譯。每臺機器的指令剂碴,其格式和代碼所代表的含義都是硬性規(guī)定的把将,故稱之為面向機器的語言,也稱為機器語言忆矛。它是第一代的計算機語言察蹲。機器語言對不同型號的計算機來說一般是不同的。
使用機器語言編寫程序是一種相當(dāng)煩瑣的工作催训,既難于記憶也難于操作洽议,編寫出來的程序全是由0和1的數(shù)字組成,直觀性差漫拭、難以閱讀亚兄。不僅難學(xué)、難記采驻、難檢查审胚、又缺乏通用性,給計算機的推廣使用帶來很大的障礙礼旅。
最早的程序設(shè)計語言都采用機器語言來編寫膳叨。當(dāng)時,要在計算機上運行的所有算法都必須直接用機器語言來表達(dá)痘系,計算機才能接受菲嘴。算法的運算序列包括運算對象和運算結(jié)果都必須轉(zhuǎn)換為指令序列。其中的每一條指令都以編碼(指令碼和地址碼)的形式出現(xiàn)汰翠。與算法語言表達(dá)的算法龄坪,相差十萬八千里。對于沒受過程序設(shè)計專門訓(xùn)練的人來說奴璃,一份程序恰似一份"天書"悉默,讓人看了不知所云,可讀性極差苟穆。
用機器語言表達(dá)算法的運算抄课、數(shù)據(jù)和控制十分繁雜瑣碎唱星,因為機器語言所提供的指令太初等、原始跟磨。機器語言只接受算術(shù)運算间聊、按位邏輯運算和數(shù)的大小比較運算等。對于稍復(fù)雜的運算抵拘,都必須一一分解哎榴,直到到達(dá)最初等的運算才能用相應(yīng)的指令替代之。機器語言能直接表達(dá)的數(shù)據(jù)只有最原始的位僵蛛、字節(jié)尚蝌、和字三種。算法中即使是最簡單的數(shù)據(jù)如布爾值充尉、字符飘言、整數(shù)、和實數(shù)驼侠,也必須一一地映射到位姿鸿、字節(jié)和字中,還得一一分配它們的存儲單元倒源。對于算法中有結(jié)構(gòu)的數(shù)據(jù)的表達(dá)則要麻煩得多苛预。機器語言所提供的控制轉(zhuǎn)移指令也只有無條件轉(zhuǎn)移、條件轉(zhuǎn)移笋熬、進(jìn)入子程序和從子程序返回等最基本的幾種热某。用它們來構(gòu)造循環(huán)、形成分支突诬、調(diào)用函數(shù)和過程得事先做許多的準(zhǔn)備苫拍,還得靠許多的技巧芜繁。
直接用機器語言表達(dá)算法有許多缺點旺隙。
????????? 大量繁雜瑣碎的細(xì)節(jié)牽制著程序員,使他們不可能有更多的時間和精力去從事創(chuàng)造性的勞動骏令,執(zhí)行對他們來說更為重要的任務(wù)蔬捷。如確保程序的正確性、高效性榔袋。
????????? 程序員既要駕馭程序設(shè)計的全局又要深入每一個局部直到實現(xiàn)的細(xì)節(jié)周拐,即使智力超群的程序員也常常會顧此失彼,屢出差錯凰兑,因而所編出的程序可靠性差妥粟,且開發(fā)周期長。
????????? 由于用機器語言進(jìn)行程序設(shè)計的思維和表達(dá)方式與人們的習(xí)慣大相徑庭吏够,只有經(jīng)過較長時間職業(yè)訓(xùn)練的程序員才能勝任勾给,使得程序設(shè)計曲高和寡滩报。
????????? 因為它的書面形式全是"密"碼,所以可讀性差播急,不便于交流與合作脓钾。
????????? 因為它嚴(yán)重地依賴于具體的計算機,所以可移植性差桩警,重用性差可训。
這些弊端造成當(dāng)時的計算機應(yīng)用未能迅速得到推廣。
匯編語言(Assember language)
匯編語言Assembler Language(低級語言)
為了克服機器語言上述的缺點捶枢,出路在于程序設(shè)計語言的抽象握截,讓它盡可能地接近于算法語言。為此烂叔,人們首先注意到的是可讀性和可移植性川蒙,因為它們相對地容易通過抽象而得到改善。于是长已,很快就出現(xiàn)匯編語言畜眨。這種語言對機器語言的抽象,首先表現(xiàn)在將機器語言的每一條指令符號化:指令碼代之以記憶符號术瓮,地址碼代之以符號地址康聂,使得其含義顯現(xiàn)在符號上而不再隱藏在編碼中,可讓人望"文"生義胞四。其次表現(xiàn)在這種語言擺脫了具體計算機的限制恬汁,可在不同指令集的計算機上運行,只要該計算機配上匯編語言的一個匯編程序辜伟。這無疑是機器語言朝算法語言靠攏邁出的一步氓侧。但是,它離算法語言還太遠(yuǎn)导狡,以致程序員還不能從分解算法的數(shù)據(jù)荒典、運算和控制到匯編才能直接表達(dá)的指令等繁雜瑣碎的事務(wù)中解脫出來。
用能反映指令功能的助記符表達(dá)的計算機語言叫匯編語言刁岸。它是符號化了的機器語言液南。用匯編語言編寫的程序叫匯編語言源程序,計算機無法執(zhí)行枚赡。必須用匯編程序把它翻譯成機器語言目標(biāo)程序氓癌,計算機才能執(zhí)行。這個翻譯過程稱為匯編過程贫橙。
匯編語言是用助記符表示指令功能的計算機語言贪婉。與機器語言相比,匯編語言具有以下的幾個特點:第一卢肃,它使用符號來表示操作碼和地址碼疲迂,這種符號便于記憶星压,稱為記憶碼。第二鬼譬,匯編程序自動處理存儲分配娜膘,毋需程序員做存儲分配工作。第三优质,程序員可以直接書寫十進(jìn)制數(shù)`
例如竣贪,要計算c=7+8,可以用如下幾條匯編命令:
標(biāo)號??????? 指令?????????????????? 說明
START????? GET 7;????????? 把7送進(jìn)累加器ACC中
ADD 8巩螃;???????? 累加器ACC+8送進(jìn)累加器ACC中
PUT C演怎;???????? 把累加器ACC送進(jìn)C中
END??????? STOP;????????? 停機
其中(ACC)表示累加器中的值避乏,等等爷耀。
如此簡單的匯編語言,只是符號形式的機器語言拍皮,但用它來編寫程序或閱讀已經(jīng)編寫好的程序比起機器語言來要簡單和方便多了歹叮。這就是計算機語言發(fā)展中的第二代語言—匯編語言。人們使用這種助記符編寫程序后铆帽,要是計算機能夠接受咆耿,還必須把編好的程序逐條翻譯成二進(jìn)制編碼的機器語言。當(dāng)然爹橱,這個工作并不是有程序員來完成萨螺,而是有稱為“匯編程序”的程序自動完成的。匯編程序的功能就是把由匯編語言編寫的程序(稱為匯編語言源程序)翻譯成機器語言程序愧驱,計算機才能執(zhí)行該程序慰技。這個翻譯過程稱為匯編。
匯編語言比起機器語言在很多方面都有很大的優(yōu)越性组砚,如編寫容易吻商、修改方便、閱讀簡單惫确、程序清楚等手报,但在計算機語言系統(tǒng)中蚯舱,把匯編語言仍然列入“低級語言”的范疇改化,它仍然是屬于面向機器的語言,也就是說枉昏,不同的計算機可以有不同的指令集陈肛。
高級語言(High-level language)
高級語言
機器語言和匯編語言都是面向機器的,高級語言是面向用戶的兄裂。到了50年代中期句旱,出現(xiàn)程序設(shè)計的高級語言如Fortran阳藻,Algol60,以及后來的PL/l谈撒,Pascal等腥泥,算法的程序表達(dá)才產(chǎn)生一次大的飛躍。用高級語言編寫的程序叫做高級語言源程序啃匿,必須翻譯成機器語言目標(biāo)程序才能被計算機執(zhí)行蛔外。高級語言的翻譯有兩種方式:編譯方式和解釋方式。
????????? 編譯方式:先由編譯程序把高級語言源程序翻譯成目標(biāo)程序溯乒,執(zhí)行時運行目標(biāo)程序夹厌。
????????? 2.解釋方式:在運行高級語言源程序時,由解釋程序?qū)υ闯绦蜻叿g邊執(zhí)行裆悄。
誠然矛纹,算法最終要表達(dá)為具體計算機上的機器語言才能在該計算機上運行,得到所需要的結(jié)果光稼。但匯編語言的實踐啟發(fā)人們或南,表達(dá)成機器語言不必一步到位,可以分兩步走或者可以筑橋過河艾君。即先表達(dá)成一種中介語言迎献,然后轉(zhuǎn)成機器語言。匯編語言作為一種中介語言腻贰,并沒有獲得很大成功吁恍,原因是它離算法語言還太遠(yuǎn)。這便指引人們?nèi)ピO(shè)計一種盡量接近算法語言的規(guī)范語言播演,即所謂的高級語言冀瓦,讓程序員可以用它方便地表達(dá)算法,然后借助于規(guī)范的高級語言到規(guī)范的機器語言的"翻譯"写烤,最終將算法表達(dá)為機器語言翼闽。而且,由于高級語言和機器語言都具有規(guī)范性洲炊,這里的"翻譯"完全可以機械化地由計算機來完成感局,就像匯編語言被翻譯成機器語言一樣,只要計算機配上一個編譯程序暂衡。
上述兩步询微,前一步由程序員去完成,后一步可以由編譯程序去完成狂巢。在規(guī)定清楚它們各自該做什么之后撑毛,這兩步是完全獨立的。它們各自該如何做互不相干唧领。前一步要做的只是用高級語言正確地表達(dá)給定的算法藻雌,產(chǎn)生一個高級語言程序;后一步要做的只是將第一步得到的高級語言程序翻譯成機器語言程序雌续。至于程序員如何用高級語言表達(dá)算法和編譯程序如何將高級語言表達(dá)的算法翻譯成機器語言表達(dá)的算法,顯然毫不相干胯杭。
為了解決低級語言的缺點驯杜,人們?yōu)榱藦母旧蠑[脫語言對機器的依賴,使之獨立于機器做个,由面向機器改為面向過程艇肴,經(jīng)過多年精心的研究,終于在1954年首先創(chuàng)造出一種與具體的計算機指令系統(tǒng)無關(guān)的叁温、表達(dá)方式或接近于人們對求解過程或問題的描述方式再悼,且易于掌握和書寫的語言,這就是FORTRAN語言膝但。人們把具有以上特點的語言稱為高級語言冲九,這就是計算機語言系統(tǒng)中的第三代語言。
例如計算A=1+2跟束,若用高級語言(如BASIC語言)編寫莺奸,只要兩條語句:
10?????? A=1+2
11?????? END
就可以完成A=1+2的操作。這種語言冀宴,人們易于掌握和理解灭贷,即使小學(xué)生也容易掌握,便于推廣略贮,它不再是面向機器甚疟,而是“面向過程”,即用戶不僅要告訴計算機“做什么”逃延,還要告訴計算機“怎么做”览妖,也就是把每一步操作事先設(shè)計好,然后再編寫程序揽祥,讓計算機按照指定的步驟去執(zhí)行讽膏。目前,世界上已經(jīng)有幾百種不同類型拄丰、功能各異的高級語言府树。使用較多的有:
BASIC
FORTRAN
PASCAL
C
PL/I
ADA
LISP
程序設(shè)計語言從機器語言到高級語言的抽象,帶來的主要好處是:
高級語言接近算法語言料按,易學(xué)奄侠、易掌握,一般工程技術(shù)人員只要幾周時間的培訓(xùn)就可以勝任程序員的工作站绪;
高級語言為程序員提供了結(jié)構(gòu)化程序設(shè)計的環(huán)境和工具遭铺,使得設(shè)計出來的程序可讀性好,可維護(hù)性強恢准,可靠性高魂挂;
高級語言遠(yuǎn)離機器語言,與具體的計算機硬件關(guān)系不大馁筐,因而所寫出來的程序可移植性好涂召,重用率高;
由于把繁雜瑣碎的事務(wù)交給了編譯程序去做敏沉,所以自動化程度高果正,開發(fā)周期短,且程序員得到解脫盟迟,可以集中時間和精力去從事對于他們來說更為重要的創(chuàng)造性勞動秋泳,以提高程序的質(zhì)量。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
程序語言的種類之一攒菠,由被稱作翻譯器(interpreter)的軟件一邊把人類記述的程序變換成電腦可執(zhí)行的形式迫皱,一邊執(zhí)行的形式的語言。
解釋語言是電腦使用的機器語言辖众,與機器語言1對1地對應(yīng)的匯編語言相比卓起,高抽象度,與人類平常使用的自然語言相近的感覺的高級語言凹炸。由于電腦無法識別人類所記述的源代碼戏阅,所以由解釋語言(腳本引擎)翻譯成機器語言,變換成可執(zhí)行的程序啤它。
高級語言里還有奕筐,一并地轉(zhuǎn)換成機器語言的程序之后再執(zhí)行的編譯語言。這個語言变骡,由于需要先把程序轉(zhuǎn)換成機器語言程序然后再執(zhí)行救欧,所以在開發(fā)的速度與容易度,修正的方便性上都不如匯編語言锣光,但是笆怠,由于不需要同時翻譯,所以在實效速度上占有很大的優(yōu)勢誊爹。還有蹬刷,解釋語言中的執(zhí)行環(huán)境里需要源代碼,編譯語言里就不需要频丘。