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

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

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

解答編譯器是怎樣運行的

GReq_mcu168 ? 來源:碼農(nóng)的荒島求生 ? 作者:碼農(nóng)的荒島求生 ? 2021-03-09 15:20 ? 次閱讀

對于程序員來說編譯器是非常熟悉的,每天都在用,但是當(dāng)你在點擊“Run”這個按鈕或者執(zhí)行編譯命令時你知道編譯器是怎樣工作的嗎?

這篇文章就為你解答這個問題。

編譯器就是一個普通程序,沒什么大不了的

什么是編譯器?

編譯器是一個將高級語言翻譯為低級語言的程序。

首先我們一定要意識到編譯器就是一個普通程序,沒什么大不了的。

在沒有弄明白編譯器如何工作之前你可以簡單的把編譯器當(dāng)做一個黑盒子,其作用就是輸入一個文本文件輸出一個二進(jìn)制文件。

基本上編譯器經(jīng)過了以下幾個階段,等等,這句話教科書上也有,但是我相信很多同學(xué)其實并沒有真正理解這幾個步驟到底在說些什么,為了讓你徹底理解這幾個步驟,我們用一個簡單的例子來講解。

假定我們有一段程序:

while (y < z) { int x = a + b; y += x;}

那么編譯器是怎樣把這一段程序人類認(rèn)識的程序轉(zhuǎn)換為CPU認(rèn)識的二進(jìn)制機器指令呢?

提取出每一個單詞:詞法分析

首先編譯器要把源代碼中的每個“單詞”提取出來,在編譯技術(shù)中“單詞”被稱為token。其實不只是每個單詞被稱為一個token,除去單詞之外的比如左括號、右括號、賦值操作符等都被稱為token。

從源代碼中提取出token的過程就被稱為詞法分析,Lexical Analysis。

經(jīng)過一遍詞法分析,編譯器得到了以下token:

T_While whileT_LeftParen (T_Identifier yT_Less

就這樣一個磁盤中保存的字符串源代碼文件就轉(zhuǎn)換為了一個個的token。

這些token想表達(dá)什么意思:語法分析

有了這些token之后編譯器就可以根據(jù)語言定義的語法恢復(fù)其原本的結(jié)構(gòu),怎么恢復(fù)呢?

原來,編譯器在掃描出各個token后根據(jù)規(guī)則將其用樹的形式表示出來,這顆樹就被稱為語法樹。

語法樹是不是合理的:語義分析

有了語法樹后我們還要檢查這棵樹是不是合法的,比如我們不能把一個整數(shù)和一個字符串相加、比較符左右兩邊的數(shù)據(jù)類型要相同,等等。

這一步通過后就證明了程序合法,不會有編譯錯誤。

根據(jù)語法樹生成中間代碼:代碼生成

語義分析之后接下來編譯器遍歷語法樹并用另一種形式來表示,用什么來表示呢?那就是中間代碼,intermediate representation code,簡稱IR code。

上述語法樹可能就會表示為這樣的中間代碼:

Loop: x = a + b y = x + y _t1 = y < z if _t1 goto Loop

怎么樣,這實際上已經(jīng)比較接近最后的機器指令了。

只不過這還不是最終形態(tài)。

中間代碼優(yōu)化

在生成中間代碼后要對其進(jìn)行優(yōu)化,我們可以看到,實際上可以把x = a + b這行代碼放到循環(huán)外,因為每次循環(huán)都不會改變x的值,因此優(yōu)化后就是這樣了:

x = a + bLoop: y = x + y _t1 = y < z if _t1 goto Loop

中間代碼優(yōu)化后就可以生成機器指令了。

代碼生成

將上述優(yōu)化后的中間代碼轉(zhuǎn)換為機器指令:

add $1, $2, $3Loop: add $4, $1, $4 slt $6, $1, $5 beq $6, loop

最終,編譯器將程序員認(rèn)識的代碼轉(zhuǎn)換為了CPU認(rèn)識的機器指令。

總結(jié)

注意這篇簡短的講解不希望給大家留下這樣的印象,那就是編譯器是很簡單的,恰恰相反,現(xiàn)代編譯器是非常智能并且極其復(fù)雜的,絕不是短短一篇文章就能講清楚的,能實現(xiàn)一個編譯器是困難的,實現(xiàn)一個好的編譯器更是難上加難。

本文的目的旨在以極簡的方式描述編譯器的工作原理,這樣你就不用把編譯器當(dāng)做一個黑盒了,希望這篇文章能對你有所幫助。
編輯:lyn

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

    關(guān)注

    1

    文章

    1602

    瀏覽量

    48895

原文標(biāo)題:編譯器是如何工作的

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    AI編譯器技術(shù)剖析

    隨著人工智能技術(shù)的飛速發(fā)展,AI編譯器作為一種新興的編譯技術(shù)逐漸進(jìn)入人們的視野。AI編譯器不僅具備傳統(tǒng)編譯器的功能,如將高級語言編寫的源代碼轉(zhuǎn)換為機器可執(zhí)行的代碼,還融入了人工智能技術(shù)
    的頭像 發(fā)表于 07-17 18:28 ?1197次閱讀

    人工智能編譯器與傳統(tǒng)編譯器的區(qū)別

    人工智能編譯器(AI編譯器)與傳統(tǒng)編譯器在多個方面存在顯著的差異。這些差異主要體現(xiàn)在設(shè)計目標(biāo)、功能特性、優(yōu)化策略、適用范圍以及技術(shù)復(fù)雜性等方面。以下是對兩者區(qū)別的詳細(xì)探討,旨在全面解析其內(nèi)在差異。
    的頭像 發(fā)表于 07-17 18:19 ?1257次閱讀

    Meta發(fā)布基于Code Llama的LLM編譯器

    近日,科技巨頭Meta在其X平臺上正式宣布推出了一款革命性的LLM編譯器,這一模型家族基于Meta Code Llama構(gòu)建,并融合了先進(jìn)的代碼優(yōu)化和編譯器功能。LLM編譯器的推出,標(biāo)志著Meta在人工智能領(lǐng)域的又一重大突破,將
    的頭像 發(fā)表于 06-29 17:54 ?1305次閱讀

    SEGGER編譯器優(yōu)化和安全技術(shù)介紹 支持最新C和C++語言

    代碼生成,SEGGER編譯器生成非常小的代碼,非常適合內(nèi)存受限的環(huán)境,而不會犧牲執(zhí)行速度。 2)?速度優(yōu)化:在最高優(yōu)化級別,SEGGER編譯器生成盡可能快的代碼,確保您的應(yīng)用程序以峰值性能運行
    的頭像 發(fā)表于 06-04 15:31 ?1144次閱讀
    SEGGER<b class='flag-5'>編譯器</b>優(yōu)化和安全技術(shù)介紹 支持最新C和C++語言

    STM8S207R8使用IAR編譯自己的程序的時候,超出64K編譯器報錯是怎么回事?

    。直接下載程序到64K這款I(lǐng)C,居然成功了。然后所有功能運行都還正常。 問:1.編譯器不認(rèn)具體芯片的型號。這個核實過了。 2.編譯器編譯完成已經(jīng)超過芯片自身的flash容量了,還有超出
    發(fā)表于 05-17 06:52

    C語言:嵌入式開發(fā)中的關(guān)鍵編譯器角色

    嵌入式程序開發(fā)跟硬件密切相關(guān),需要使用C語言來讀寫底層寄存、存取數(shù)據(jù)、控制硬件等,C語言和硬件之間由編譯器來聯(lián)系,一些C標(biāo)準(zhǔn)不支持的硬件特性操作,由編譯器提供。
    發(fā)表于 04-26 14:53 ?407次閱讀
    C語言:嵌入式開發(fā)中的關(guān)鍵<b class='flag-5'>編譯器</b>角色

    QT開發(fā)學(xué)習(xí)筆記1(安裝交叉編譯器

    QT安裝交叉編譯器
    的頭像 發(fā)表于 02-18 10:02 ?687次閱讀
    QT開發(fā)學(xué)習(xí)筆記1(安裝交叉<b class='flag-5'>編譯器</b>)

    RL78系列的C編譯器包數(shù)據(jù)手冊

    電子發(fā)燒友網(wǎng)站提供《RL78系列的C編譯器包數(shù)據(jù)手冊.pdf》資料免費下載
    發(fā)表于 01-26 15:55 ?0次下載
    RL78系列的C<b class='flag-5'>編譯器</b>包數(shù)據(jù)手冊

    Triton編譯器的原理和性能

    Triton是一種用于編寫高效自定義深度學(xué)習(xí)原語的語言和編譯器。Triton的目的是提供一個開源環(huán)境,以比CUDA更高的生產(chǎn)力編寫快速代碼,但也比其他現(xiàn)有DSL具有更大的靈活性。Triton已被采用
    的頭像 發(fā)表于 12-16 11:22 ?2211次閱讀
    Triton<b class='flag-5'>編譯器</b>的原理和性能

    TVM編譯器的整體架構(gòu)和基本方法

    有將近兩個月沒有學(xué)習(xí)一些新東西,更新一下博客了。一直在忙公司的一個項目,是做一款支持LSTM和RNN的通用架構(gòu)加速IP。自己恰好負(fù)責(zé)指令編譯工作,雖然開始的指令比較粗糙,沒有一套完整的編譯器架構(gòu)
    的頭像 發(fā)表于 11-30 09:36 ?1863次閱讀
    TVM<b class='flag-5'>編譯器</b>的整體架構(gòu)和基本方法

    編譯器的優(yōu)化選項

    這一點,需要了解編譯器的能力和限制;第三,要了解硬件的運行方式,針對硬件特性進(jìn)行優(yōu)化。本文著重展開第二點和第三點。 簡單認(rèn)識編譯器 要寫出高性能的代碼,首先需要對編譯器有基礎(chǔ)的了解,原
    的頭像 發(fā)表于 11-24 15:37 ?746次閱讀
    <b class='flag-5'>編譯器</b>的優(yōu)化選項

    嵌入式j(luò)avascript編譯器的設(shè)計與實現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《嵌入式j(luò)avascript編譯器的設(shè)計與實現(xiàn).pdf》資料免費下載
    發(fā)表于 10-30 11:29 ?0次下載
    嵌入式j(luò)avascript<b class='flag-5'>編譯器</b>的設(shè)計與實現(xiàn)

    新版編譯器的設(shè)計思路和優(yōu)化方法

    小程序編譯器在小程序開發(fā)、預(yù)覽、發(fā)布各個階段都需要使用,因此編譯器性能會直接影響到開發(fā)者開發(fā)效率,也會影響到開發(fā)者工具的使用體驗。 由于舊版的編譯器(基于 webpack4)在構(gòu)建大型項目時會很慢,內(nèi)存占用也高,一直被開發(fā)者吐槽
    發(fā)表于 10-13 11:21 ?253次閱讀
    新版<b class='flag-5'>編譯器</b>的設(shè)計思路和優(yōu)化方法

    嵌入式開發(fā)中的C語言編譯器設(shè)置

    編譯器的語義檢查很弱小,甚至還會“掩蓋”錯誤。現(xiàn)代的編譯器設(shè)計是件浩瀚的工程,為了讓編譯器設(shè)計簡單一些,目前幾乎所有編譯器的語義檢查都比較弱小。為了獲得更快的執(zhí)行效率,C語言被設(shè)計的足
    發(fā)表于 10-11 12:43 ?571次閱讀

    esp32除了用arduino編譯器還可以用哪個編譯器?

    esp32除了用arduino編譯器還可以用哪個編譯器
    發(fā)表于 09-25 06:13