chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

介紹了C語(yǔ)言和機(jī)器語(yǔ)言的關(guān)系 以及其他類型語(yǔ)言的實(shí)現(xiàn)機(jī)制

h1654155971.7688 ? 2018-02-05 09:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

任何程序都需要被轉(zhuǎn)換為某個(gè)指令集的指令序列,比如下列簡(jiǎ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ī)器上,經(jīng)過(guò)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:

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

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

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

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

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

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

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

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

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

介紹了C語(yǔ)言和機(jī)器語(yǔ)言的關(guān)系 以及其他類型語(yǔ)言的實(shí)現(xiàn)機(jī)制

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

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

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

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

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

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

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    183

    文章

    7634

    瀏覽量

    143894
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4848

    瀏覽量

    88914
  • 機(jī)器語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    36

    瀏覽量

    10967

原文標(biāo)題:關(guān)于編程語(yǔ)言的思考—編譯型和解釋型

文章出處:【微信號(hào):weixin21ic,微信公眾號(hào):21ic電子網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    c語(yǔ)言匯編語(yǔ)言和機(jī)器語(yǔ)言的轉(zhuǎn)化

    匯編語(yǔ)言經(jīng)過(guò)匯編程序可以翻譯成及期望語(yǔ)言C語(yǔ)言是不是必須先轉(zhuǎn)換為匯編語(yǔ)言,然后才能生成機(jī)器語(yǔ)言
    發(fā)表于 04-14 16:53

    匯編語(yǔ)言機(jī)器語(yǔ)言

    機(jī)器語(yǔ)言是計(jì)算機(jī)直接認(rèn)識(shí)的語(yǔ)言,在電路中有高低電平表示,在邏輯中用0和1表示(0表示低或者開(kāi)關(guān)的斷開(kāi),1表示高或者開(kāi)關(guān)的閉合)機(jī)器語(yǔ)言是最早的機(jī)器運(yùn)行的
    發(fā)表于 03-13 17:22

    C語(yǔ)言為什么不能直接轉(zhuǎn)換為機(jī)器語(yǔ)言呢?

    單片機(jī)只能識(shí)別機(jī)器語(yǔ)言。匯編把程序轉(zhuǎn)換為機(jī)器語(yǔ)言C語(yǔ)言把程序轉(zhuǎn)換為匯編語(yǔ)言,那么為什么C
    發(fā)表于 04-12 16:51

    單片機(jī)入門 (3) 單片機(jī)的編程語(yǔ)言和開(kāi)發(fā)環(huán)境

    另一個(gè)問(wèn)題,就是不同的CPU,機(jī)器語(yǔ)言的描述方式也不同。因此,如果更換了CPU,就必須改寫與機(jī)器語(yǔ)言有著密不可分關(guān)系的匯編語(yǔ)言,工作量比較大。(以上例子中的
    發(fā)表于 03-30 10:11

    匯編程序和c語(yǔ)言對(duì)比,單片機(jī)編程中C語(yǔ)言和匯編的差異 精選資料分享

    最近對(duì)比了下C語(yǔ)言和匯編兩種語(yǔ)言在單片機(jī)領(lǐng)域的差異。匯編作為低級(jí)語(yǔ)言,是僅次于機(jī)器語(yǔ)言和硬件聯(lián)系最緊密的
    發(fā)表于 07-16 07:48

    單片機(jī)C語(yǔ)言和匯編語(yǔ)言的混合編程

    . 保持機(jī)器語(yǔ)言的優(yōu)勢(shì),具有直接而簡(jiǎn)潔的功能4. 可維護(hù)性和可讀性差5. 可移植性差第5章單片機(jī)C語(yǔ)言和匯編語(yǔ)言的混合編程5.1.2單片機(jī)C
    發(fā)表于 01-25 06:47

    C語(yǔ)言和匯編語(yǔ)言混合編程方法和C語(yǔ)言中斷處理方法

    C語(yǔ)言和匯編語(yǔ)言混合編程方法和C語(yǔ)言中斷處理方法,new
    發(fā)表于 01-06 14:36 ?36次下載

    機(jī)器語(yǔ)言是什么_機(jī)器語(yǔ)言指令大全

    本文開(kāi)始介紹機(jī)器語(yǔ)言是什么或概念,其次介紹機(jī)器語(yǔ)言缺點(diǎn),最后介紹
    的頭像 發(fā)表于 04-16 10:08 ?7.7w次閱讀
    <b class='flag-5'>機(jī)器語(yǔ)言</b>是什么_<b class='flag-5'>機(jī)器語(yǔ)言</b>指令大全

    高級(jí)語(yǔ)言和匯編語(yǔ)言_機(jī)器語(yǔ)言的區(qū)別

    本文首先介紹高級(jí)語(yǔ)言的優(yōu)缺點(diǎn)、匯編語(yǔ)言的優(yōu)缺點(diǎn)及使用匯編語(yǔ)言的理由,其次介紹
    的頭像 發(fā)表于 04-16 10:28 ?3.1w次閱讀

    面向機(jī)器語(yǔ)言有哪些

    本文開(kāi)始介紹機(jī)器語(yǔ)言原理,其次介紹面向機(jī)器語(yǔ)言的概念與分類,最后
    的頭像 發(fā)表于 04-16 10:29 ?1.2w次閱讀
    面向<b class='flag-5'>機(jī)器語(yǔ)言</b>有哪些

    計(jì)算機(jī)的機(jī)器語(yǔ)言和匯編語(yǔ)言與高級(jí)語(yǔ)言的詳細(xì)資料介紹

    計(jì)算機(jī)語(yǔ)言通常是一個(gè)能完整、準(zhǔn)確和規(guī)則地表達(dá)人們的意圖,并用以指揮或控制計(jì)算機(jī)工作的“符號(hào)系統(tǒng)”。計(jì)算機(jī)語(yǔ)言通常分為三類:即機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)
    的頭像 發(fā)表于 02-06 16:11 ?6435次閱讀

    單片機(jī)C語(yǔ)言和C語(yǔ)言為什么有差異?

    許多小伙伴在學(xué)完C語(yǔ)言后想入門單片機(jī),但學(xué)著學(xué)著發(fā)現(xiàn)明明都是C語(yǔ)言,為什么單片機(jī)C語(yǔ)言和我當(dāng)初學(xué)
    發(fā)表于 09-01 16:39 ?4099次閱讀

    如何選擇創(chuàng)建c語(yǔ)言和c++

    選擇創(chuàng)建 C 語(yǔ)言和 C++ 都需要綜合考慮多個(gè)因素。在決定使用哪種語(yǔ)言之前,我們需要對(duì)這兩種語(yǔ)言的特點(diǎn)、優(yōu)缺點(diǎn)、適用場(chǎng)景、學(xué)習(xí)成本等進(jìn)行全
    的頭像 發(fā)表于 11-27 15:58 ?1177次閱讀

    vb語(yǔ)言和c++語(yǔ)言的區(qū)別

    VB語(yǔ)言和C++語(yǔ)言是兩種不同的編程語(yǔ)言,雖然它們都屬于高級(jí)編程語(yǔ)言,但在設(shè)計(jì)和用途上有很多區(qū)別。下面將詳細(xì)比較VB
    的頭像 發(fā)表于 02-01 10:20 ?3794次閱讀

    PLC編程語(yǔ)言和C語(yǔ)言的區(qū)別

    在工業(yè)自動(dòng)化和計(jì)算機(jī)編程領(lǐng)域中,PLC(可編程邏輯控制器)編程語(yǔ)言和C語(yǔ)言各自扮演著重要的角色。盡管兩者都是編程語(yǔ)言,但它們?cè)诙鄠€(gè)方面存在顯著的區(qū)別。本文將從多個(gè)維度深入探討PLC編程
    的頭像 發(fā)表于 06-14 17:11 ?5852次閱讀