色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

介紹了C語言和機器語言的關系 以及其他類型語言的實現機制

h1654155971.7688 ? 2018-02-05 09:58 ? 次閱讀

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

圖1 編程語言的層次結構

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

1. 數據傳輸指令,用于讀寫內存、寄存器

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

3. 控制流指令,用于實現高級編程語言中的分支、循環等控制結構。

4. 過程調用指令,用于實現函數調用,分配、恢復棧幀等操作。

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

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

{

int result = 1;

while (n > 1) {

result *= n;

n = n-1;

}

return result;

}

在32bit機器上,經過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程序的機器代碼可以發現由C程序轉化為機器代碼,主要有數據類型和控制結構的轉換。下面以x86指令集說明:

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

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

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

1. 初始化被調用函數的棧幀,并將其入棧。也就是調用函數過程,通過call指令實現。

2. 執行被調用函數。

3. 恢復調用函數的棧幀,將被調用函數的棧幀出棧。也就是函數返回的過程,通過ret指令實現。

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

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

介紹了C語言和機器語言的關系 以及其他類型語言的實現機制

圖2 編程語言實現結構

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

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

在C和C++系統編程語言這一層,會通過編譯器完成語言元素到匯編語言的映射。比如前文描述的,數據類型、控制結構、函數調用等結構的轉換。

python是解釋型語言,它通過python解釋器實現向底層語言的映射。我們知道python虛擬機是由C語言編寫的,所以python程序會轉化為C程序而執行。比如,python中的所有對象都會在C中有對應的PyObject結構體。python的list、dict等數據類型也要在C中有對應的表示。而像生成器、迭代器等語法結構需要相應的支持。

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

像java這樣的虛擬機語言會被編譯器編譯成虛擬機本地的機器代碼,然后再虛擬機上執行,這里就需要向javac編譯器實現java語言的數據類型、語言結構和java虛擬機上的數據類型、語法結構的映射。

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7608

    瀏覽量

    137111
  • python
    +關注

    關注

    56

    文章

    4798

    瀏覽量

    84810
  • 機器語言
    +關注

    關注

    0

    文章

    35

    瀏覽量

    10764

原文標題:關于編程語言的思考—編譯型和解釋型

文章出處:【微信號:weixin21ic,微信公眾號:21ic電子網】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    c語言匯編語言和機器語言的轉化

    匯編語言經過匯編程序可以翻譯成及期望語言C語言是不是必須先轉換為匯編語言,然后才能生成機器語言
    發表于 04-14 16:53

    匯編語言機器語言

    機器語言是計算機直接認識的語言,在電路中有高低電平表示,在邏輯中用0和1表示(0表示低或者開關的斷開,1表示高或者開關的閉合)機器語言是最早的機器運行的
    發表于 03-13 17:22

    C語言為什么不能直接轉換為機器語言呢?

    單片機只能識別機器語言。匯編把程序轉換為機器語言C語言把程序轉換為匯編語言,那么為什么C
    發表于 04-12 16:51

    單片機入門 (3) 單片機的編程語言和開發環境

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

    匯編程序和c語言對比,單片機編程中C語言和匯編的差異 精選資料分享

    最近對比了下C語言和匯編兩種語言在單片機領域的差異。匯編作為低級語言,是僅次于機器語言和硬件聯系最緊密的
    發表于 07-16 07:48

    單片機C語言和匯編語言的混合編程

    . 保持機器語言的優勢,具有直接而簡潔的功能4. 可維護性和可讀性差5. 可移植性差第5章單片機C語言和匯編語言的混合編程5.1.2單片機C
    發表于 01-25 06:47

    機器語言是什么_機器語言指令大全

    本文開始介紹機器語言是什么或概念,其次介紹機器語言缺點,最后介紹
    的頭像 發表于 04-16 10:08 ?7.5w次閱讀
    <b class='flag-5'>機器語言</b>是什么_<b class='flag-5'>機器語言</b>指令大全

    高級語言和匯編語言_機器語言的區別

    本文首先介紹高級語言的優缺點、匯編語言的優缺點及使用匯編語言的理由,其次介紹
    的頭像 發表于 04-16 10:28 ?3w次閱讀

    面向機器語言有哪些

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

    C語言的簡單介紹

    C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用于底層開發。C語言能以簡易的方式編譯、處理低級存儲器。
    發表于 01-02 08:00 ?1次下載

    計算機的機器語言和匯編語言與高級語言的詳細資料介紹

    計算機語言通常是一個能完整、準確和規則地表達人們的意圖,并用以指揮或控制計算機工作的“符號系統”。計算機語言通常分為三類:即機器語言、匯編語言和高級
    的頭像 發表于 02-06 16:11 ?5869次閱讀

    單片機C語言和C語言為什么有差異?

    許多小伙伴在學完C語言后想入門單片機,但學著學著發現明明都是C語言,為什么單片機C語言和我當初學
    發表于 09-01 16:39 ?3796次閱讀

    如何選擇創建c語言和c++

    選擇創建 C 語言和 C++ 都需要綜合考慮多個因素。在決定使用哪種語言之前,我們需要對這兩種語言的特點、優缺點、適用場景、學習成本等進行全
    的頭像 發表于 11-27 15:58 ?630次閱讀

    vb語言和c++語言的區別

    VB語言和C++語言是兩種不同的編程語言,雖然它們都屬于高級編程語言,但在設計和用途上有很多區別。下面將詳細比較VB
    的頭像 發表于 02-01 10:20 ?2386次閱讀

    PLC編程語言和C語言的區別

    在工業自動化和計算機編程領域中,PLC(可編程邏輯控制器)編程語言和C語言各自扮演著重要的角色。盡管兩者都是編程語言,但它們在多個方面存在顯著的區別。本文將從多個維度深入探討PLC編程
    的頭像 發表于 06-14 17:11 ?2933次閱讀
    主站蜘蛛池模板: 2021自产拍在线观看视频| 四房色播手机版| 欧美特黄99久久毛片免费| 亚欧免费观看在线观看更新| 啊灬啊灬啊灬快灬深高潮啦| 精品美女国产互换人妻| 文中字幕一区二区三区视频播放| 91久久偷偷做嫩草影院免| 精品视频在线一区| 天海翼精品久久中文字幕| YELLOW视频直播在线观看高清| 六月婷婷国产精品综合| 夜夜澡人人爽人人喊_欧美| 好看的电影网站亚洲一区| 午夜精品久久久久久久爽牛战| 哒哒哒影院在线观看免费高清| 女性BBWBBWBBWBBW| 97超碰97资源在线观看| 美女丝袜夹b| 99久久精品国产高清一区二区| 暖暖视频免费高清在线观看 视频| 中文字幕在线视频观看| 免费特黄一区二区三区视频一| 99国产精品偷窥熟女精品视频 | 97碰成视频免费| 免费人成在线观看网站视频| 99久久久久精品国产免费麻豆| 欧美性猛交AAA片免费观看| 不良网站进入窗口软件下载免费| 日本老师xxxxx18| 国产精品高清m3u8在线播放| 亚洲国产精品嫩草影院久久| 黄页免费观看| 亚洲手机在线人成视频| 久久电影院久久国产| 亚洲最大在线视频| 成人在线视频免费| jazzjazzjazz欧美| 日韩精品一区VR观看| 国产 精品 亚洲 欧美 高清| 特级毛片内射WWW无码|