国产成人av人人爽人人澡-亚洲国产日韩欧美一区-好吊日视频这里只有精品-日本高清精品视频在线

你好!歡迎來到深圳市穎特新科技有限公司!
語言
當前位置:首頁 >> 技術(shù)中心 >> 單片機入門 >> 關(guān)于編程語言的思考—編譯型和解釋型

關(guān)于編程語言的思考—編譯型和解釋型

關(guān)鍵字:編程語言 源代碼 作者:admin 來源:不詳 發(fā)布時間:2018-05-19  瀏覽:8

我們知道,任何編程語言編寫的程序歸根到底都是由底層機器的機器代碼(01序列)執(zhí)行的,無論是編譯型語言還是解釋型語言。而任何高級編程語言程序的源代碼都是一個字符序列,這個字符序列到底層的01序列是通過編譯器或解析器經(jīng)過多次轉(zhuǎn)換完成的。

圖1 編程語言的層次結(jié)構(gòu)

這個層次結(jié)構(gòu)中,從高到低越來越接近于機器硬件。機器代碼就是01序列,匯編語言就是描述本地機器的指令集體系結(jié)構(gòu),而高級語言就包含相應(yīng)的數(shù)據(jù)結(jié)構(gòu)和語法結(jié)構(gòu),更接近人類的語言習(xí)慣。因此,層次越高就越面向于人類。在計算機科學(xué)中,CPU被抽象為指令集體系結(jié)構(gòu),這個指令集描述了CPU所有完成的所有功能。所有的程序都經(jīng)過編譯或解釋轉(zhuǎn)化為這個指令集表示的機器程序。在指令集中指令可以按功能劃分為:

1. 數(shù)據(jù)傳輸指令,用于讀寫內(nèi)存、寄存器。

2. 算術(shù)與邏輯運算指令,比如:addl執(zhí)行雙字(32bit)的加法,andl雙字的按位與。

3. 控制流指令,用于實現(xiàn)高級編程語言中的分支、循環(huán)等控制結(jié)構(gòu)。

4. 過程調(diào)用指令,用于實現(xiàn)函數(shù)調(diào)用,分配、恢復(fù)棧幀等操作。

任何程序都需要被轉(zhuǎn)換為某個指令集的指令序列,比如下列簡單的求階乘的C程序:

[cpp] view plaincopyprint?int fact_while(int n)

{

int result = 1;

while (n > 1) {

result *= n;

n = n-1;

}

return result;

}

在32bit機器上,經(jīng)過gcc編譯之后的x86指令序列為:

[plain] view plaincopyprint? movl 8(%ebp), %edx

movl $1, %eax

cmpl $1, %edx

jle .L7

.L10:

imull %edx, %eax

subl $1, %edx

cmpl $1, %edx

jg .L10

.L7:

通過觀察C程序的機器代碼可以發(fā)現(xiàn)由C程序轉(zhuǎn)化為機器代碼,主要有數(shù)據(jù)類型和控制結(jié)構(gòu)的轉(zhuǎn)換。下面以x86指令集說明:

1. 數(shù)據(jù)類型的轉(zhuǎn)換:在底層,x86指令對于數(shù)據(jù)是不區(qū)分邏輯類型的,也就是不分int,float,double。所有的數(shù)據(jù)按照其所占的字節(jié)數(shù)被歸類為字(16個字節(jié),Word)、雙字(32個字節(jié),Double Words)、四字(64個字節(jié),Quad Words)。一個指令操作的數(shù)據(jù)類型是由這個指令的后綴表示的,比如mov指令,movw操作字,movl操作雙字。也就是說高級語言的程序中的不同數(shù)據(jù)類型反映到底層指令集上主要體現(xiàn)是指令的不同。比如,將上述C程序中的result類型改為short,在相應(yīng)的匯編代碼中的mov指令會由movl轉(zhuǎn)換為movw。當然,還有一個問題就是C語言中的具體數(shù)據(jù)類型,在機器代碼中是如何存儲表示的。這應(yīng)該是gcc編譯器的職責,比如對于int,首先gcc需要知道底層指令集如何編碼int,采用什么編碼方式,字節(jié)順序是Big-endian還是Little-endian等。在知道底層的實現(xiàn)方式后gcc才能將表示整型數(shù)字的字符串編碼為相應(yīng)的二進制形式。而對于數(shù)組、struct和union這些數(shù)據(jù)結(jié)構(gòu)會轉(zhuǎn)化為相應(yīng)的內(nèi)存地址加偏移量的形式。

2. 控制結(jié)構(gòu)的轉(zhuǎn)換:控制結(jié)構(gòu)就是執(zhí)行指令的流程。在x86中,所有的指令集都是順序執(zhí)行。要實現(xiàn)分支、循環(huán)等結(jié)構(gòu),必須具備go形式的跳轉(zhuǎn)指令,以及相應(yīng)的條件判斷指令。CPU中有一組條件碼寄存器,指示算術(shù)或邏輯運算的狀態(tài)(計算結(jié)果是否溢出、為0或者是負數(shù)等)。執(zhí)行條件運算指令可以測試一個條件,比如"cmpl $1, %edx"比較直接數(shù)1與寄存器%edx中存放的數(shù)的大小,并將結(jié)果存入條件碼寄存器中。接下來執(zhí)行條件跳轉(zhuǎn)指令,根據(jù)條件碼寄存器中的狀態(tài)進行判斷是否進行跳轉(zhuǎn)。比如“jg .L10”是在前一條的cmpl指令結(jié)果返回大于的情況跳轉(zhuǎn)到L10,否則執(zhí)行下一條指令。

當然,在進行函數(shù)調(diào)用時,還要在底層用機器碼對其進行描述。我們知道,計算機科學(xué)中用棧來實現(xiàn)函數(shù)的調(diào)用(叫做調(diào)用棧),棧中存放棧幀。每一次函數(shù)調(diào)用對應(yīng)一個棧幀,棧幀中包含該方法的局部變量、保存的寄存器值等數(shù)據(jù)。這樣函數(shù)的調(diào)用和返回就對應(yīng)著棧幀的入棧和出棧。CPU的寄存器組中,有兩個專門用于實現(xiàn)方法調(diào)用,分別是%esp和%ebp。%esp是棧指針寄存器,存放當前函數(shù)棧棧頂?shù)膬?nèi)存地址。%ebp是幀指針寄存器,在%esp和%ebp之間的內(nèi)存地址序列就對應(yīng)于當前函數(shù)的棧幀。由于函數(shù)調(diào)用、返回與棧幀的關(guān)系很密切,所以可以將以此函數(shù)調(diào)用過程描述為:

1. 初始化被調(diào)用函數(shù)的棧幀,并將其入棧。也就是調(diào)用函數(shù)過程,通過call指令實現(xiàn)。

2. 執(zhí)行被調(diào)用函數(shù)。

3. 恢復(fù)調(diào)用函數(shù)的棧幀,將被調(diào)用函數(shù)的棧幀出棧。也就是函數(shù)返回的過程,通過ret指令實現(xiàn)。

對于初始化、恢復(fù)棧幀實際上都是%esp和%ebp的調(diào)整,還要包括傳參和返回值的問題,這些都是由編譯器實現(xiàn)的。

上面介紹了C語言和機器語言的關(guān)系,下面看一下其他類型語言的實現(xiàn)機制。首先,我們可以把編程語言分為編譯型語言、解釋型語言和虛擬機語言。編譯型語言直接被編譯成本地機器代碼,比如C、C++。解釋型語言是通過解釋器執(zhí)行,比如javascript、shell、python等。虛擬機語言運行在虛擬機上,需要被編譯成虛擬機代碼,由虛擬機執(zhí)行,比如java。雖然python也有自己的虛擬機,但是不需要編譯,所以把它歸類為解釋型語言。

圖2 編程語言實現(xiàn)結(jié)構(gòu)

通過上文的分析、我們知道對于一門語言最重要的是數(shù)據(jù)類型、控制結(jié)構(gòu)和語法結(jié)構(gòu)以及系統(tǒng)調(diào)用。從上圖可以看出,C和C++更接近于底層硬件,但是不能像匯編語言一樣可以直接訪問寄存器等硬件。而python和java相對于C和C++的抽象層次又高了一層,它們不能通過指針直接訪問內(nèi)存。從機器語言->匯編語言->系統(tǒng)語言(C和C++)->解釋型語言(python)和虛擬機語言(java),抽象層次越來越高,越貼近于人的思維,不需要考慮那么多細節(jié);同時,程序員的自由度和程序的運行速度越來越低。下面從低向高j討論一下。

在底層,匯編語言會經(jīng)過匯編器轉(zhuǎn)換為機器代碼。比如,通過gcc編譯C程序時,會調(diào)用匯編器進行匯編。通過匯編器和匯編語言這一層次,可以很好的隔離底層機器硬件的實現(xiàn)細節(jié)。不同的處理器具有與之對應(yīng)的匯編器,將匯編語言匯編成該處理器支持的指令集。這樣就是實現(xiàn)了匯編語言這一層的移植性。

在C和C++系統(tǒng)編程語言這一層,會通過編譯器完成語言元素到匯編語言的映射。比如前文描述的,數(shù)據(jù)類型、控制結(jié)構(gòu)、函數(shù)調(diào)用等結(jié)構(gòu)的轉(zhuǎn)換。

python是解釋型語言,它通過python解釋器實現(xiàn)向底層語言的映射。我們知道python虛擬機是由C語言編寫的,所以python程序會轉(zhuǎn)化為C程序而執(zhí)行。比如,python中的所有對象都會在C中有對應(yīng)的PyObject結(jié)構(gòu)體。python的list、dict等數(shù)據(jù)類型也要在C中有對應(yīng)的表示。而像生成器、迭代器等語法結(jié)構(gòu)需要相應(yīng)的支持。

而虛擬機是模擬一個指令集的程序,所以它自身有一套獨立于具體硬件、操作系統(tǒng)的指令集。需要通過底層語言實現(xiàn)這套指令集。虛擬機本身也有自己的數(shù)據(jù)類型系統(tǒng)、語言結(jié)構(gòu)等。比如,java虛擬機上支持的數(shù)據(jù)類型有基本數(shù)據(jù)類型和引用類型,也支持tableswitch和lookupswitch等實現(xiàn)switch語法結(jié)構(gòu)的字節(jié)碼指令。對于這些語言元素映射到底層語言的實現(xiàn)方式可以不同的方式。首先是解釋器模式轉(zhuǎn)化為C++,還有就是JIT直接編譯成本地機器代碼。

像java這樣的虛擬機語言會被編譯器編譯成虛擬機本地的機器代碼,然后再虛擬機上執(zhí)行,這里就需要向javac編譯器實現(xiàn)java語言的數(shù)據(jù)類型、語言結(jié)構(gòu)和java虛擬機上的數(shù)據(jù)類型、語法結(jié)構(gòu)的映射。

通過談?wù),可以看出編譯器和解釋器以及虛擬機在編程語言中的重要性,它們都是編程語言可以在計算機上運行的基石。一門編程語言的編譯器、解釋器或者虛擬機可以很大程度上影響這門語言的執(zhí)行效率。因為它們在進行語言轉(zhuǎn)換時會進行很多的優(yōu)化以提高執(zhí)行效率。這也是為什么JVM上有那么多優(yōu)秀的語言,因為JVM很強大。所以,要深入語言的底層,要學(xué)會編譯器、解釋器和虛擬機的實現(xiàn),這方面還需要下功夫啊。

編輯:admin  最后修改時間:2018-05-19

聯(lián)系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

Copyright © 2014-2023 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號-4

日本大学生精油按摩在线观看| 免费黄色一区二区三区| 久久福利视频在线观看| 很黄很污在线免费观看| 午夜视频在线观看日韩| 91国自产精品中文字幕亚洲| 日本久久精品在线观看| 亚洲人妻av中文字幕| 俄罗斯胖女人性生活视频| 亚洲中文字幕人妻系列| 国产高清一区二区白浆| 十八禁日本一区二区三区| 香蕉尹人视频在线精品| 精品人妻一区二区三区在线看| 亚洲一区二区三区三州| 91欧美亚洲视频在线| 黑人巨大精品欧美一区二区区| 亚洲精品国产美女久久久99| 日本午夜福利视频免费观看| 欧美丰满大屁股一区二区三区 | 久久精品国产亚洲av麻豆| 99在线视频精品免费播放| 在线观看国产成人av天堂野外| 欧美成人一区二区三区在线| 在线免费国产一区二区三区| 黄色在线免费高清观看| 成人日韩视频中文字幕| 东京热男人的天堂久久综合| 国产又色又爽又黄又大| 国产成人人人97超碰熟女| 91在线爽的少妇嗷嗷叫| 精品精品国产自在久久高清| 国产色偷丝袜麻豆亚洲| 久久中文字幕中文字幕中文| 老熟妇2久久国内精品| 亚洲国产性生活高潮免费视频| 亚洲综合天堂一二三区| 欧美日韩综合在线精品| 都市激情小说在线一区二区三区| 日本不卡在线视频中文国产| 国产日本欧美特黄在线观看|