91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

解答編譯器是怎樣運(yùn)行的

GReq_mcu168 ? 來源:碼農(nóng)的荒島求生 ? 作者:碼農(nóng)的荒島求生 ? 2021-03-09 15:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

什么是編譯器?

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

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

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

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

假定我們有一段程序:

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

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

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

首先編譯器要把源代碼中的每個“單詞”提取出來,在編譯技術(shù)中“單詞”被稱為token。其實(shí)不只是每個單詞被稱為一個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

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

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

中間代碼優(yōu)化

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

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

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

代碼生成

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

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

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

總結(jié)

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

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

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

    關(guān)注

    1

    文章

    1672

    瀏覽量

    51674

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    性能突破 | SpacemiT-X60 在 LLVM 編譯器上實(shí)現(xiàn) 16% 顯著提升

    2025年10月,在北美RISC-V峰會上,Igalia編譯器工程師Mikhail發(fā)表專題演講《Unlocking15%MorePerformance
    的頭像 發(fā)表于 11-21 18:04 ?8901次閱讀
    性能突破 | SpacemiT-X60 在 LLVM <b class='flag-5'>編譯器</b>上實(shí)現(xiàn) 16% 顯著提升

    開源鴻蒙技術(shù)大會2025丨編譯器與編程語言分論壇:語言驅(qū)動系統(tǒng)創(chuàng)新,編譯賦能生態(tài)繁榮

    在萬物智聯(lián)的時代背景下,操作系統(tǒng)底層能力的構(gòu)建離不開編程語言與編譯器的關(guān)鍵支撐。作為開源鴻蒙生態(tài)的核心技術(shù),語言設(shè)計(jì)與編譯器、虛擬機(jī)實(shí)現(xiàn)的進(jìn)步直接關(guān)系到開發(fā)效率、運(yùn)行性能與系統(tǒng)安全。本次分論壇聚焦
    的頭像 發(fā)表于 11-20 17:24 ?935次閱讀
    開源鴻蒙技術(shù)大會2025丨<b class='flag-5'>編譯器</b>與編程語言分論壇:語言驅(qū)動系統(tǒng)創(chuàng)新,<b class='flag-5'>編譯</b>賦能生態(tài)繁榮

    GCC編譯器,怎么才能實(shí)現(xiàn)c文件中未被調(diào)用的函數(shù),不會被編譯呢?

    GCC編譯器,怎么才能實(shí)現(xiàn)c文件中未被調(diào)用的函數(shù),不會被編譯?有什么編譯選項(xiàng)可以設(shè)置嗎? 移植代碼,有些函數(shù)沒被調(diào)用的函數(shù)想留在代碼里,但不想被編譯,
    發(fā)表于 09-28 12:25

    如何在Keil中將NuMicro BSP從Arm編譯器5遷移到編譯器6?

    在Keil中將NuMicro BSP從Arm編譯器5遷移到編譯器6!
    發(fā)表于 08-20 06:29

    進(jìn)迭時空同構(gòu)融合RISC-V AI CPU的Triton算子編譯器實(shí)踐

    Triton是由OpenAI開發(fā)的一個開源編程語言和編譯器,旨在簡化高性能GPU內(nèi)核的編寫。它提供了類似Python的語法,并通過高級抽象降低了GPU編程的復(fù)雜性,同時保持了高性能。目前
    的頭像 發(fā)表于 07-15 09:04 ?1905次閱讀
    進(jìn)迭時空同構(gòu)融合RISC-V AI CPU的Triton算子<b class='flag-5'>編譯器</b>實(shí)踐

    邊緣設(shè)備AI部署:編譯器如何實(shí)現(xiàn)輕量化與高性能?

    、ASIC等)上高效執(zhí)行的機(jī)器代碼。AI編譯器在AI模型的部署和優(yōu)化中扮演著關(guān)鍵角色,能夠顯著提升模型的運(yùn)行效率和性能。 ? AI編譯器的主要功能 ? AI編譯器的主要功能包括模型優(yōu)化
    的頭像 發(fā)表于 07-06 05:49 ?6670次閱讀

    編譯器功能安全驗(yàn)證的關(guān)鍵要素

    在汽車、工業(yè)、醫(yī)療等安全關(guān)鍵型應(yīng)用中,確保功能安全合規(guī)性需要嚴(yán)格的工具鏈驗(yàn)證。開發(fā)安全關(guān)鍵型軟件的企業(yè)必須遵守ISO 26262、IEC 61508、ISO 62304等國際標(biāo)準(zhǔn)對編譯器工具鏈進(jìn)行全面的驗(yàn)證。
    的頭像 發(fā)表于 07-05 13:37 ?1587次閱讀

    stellar studio按照說明文檔進(jìn)行編譯器環(huán)境配置,為什么會報錯?

    已經(jīng)是按照說明文檔進(jìn)行編譯器環(huán)境配置,但是還是會報錯,問題大概可能是文件系統(tǒng)操作錯誤,無法訪問打開文件,看樣子像系統(tǒng)問題,但是其他同學(xué)有和我系統(tǒng)版本號一樣的也可以編譯運(yùn)行,具體錯誤點(diǎn)擊也無法跳轉(zhuǎn)到錯誤位置
    發(fā)表于 06-12 07:49

    兆松科技ZCC編譯器全面支持芯來科技NA系列處理

    近日,兆松科技(武漢)有限公司(以下簡稱“兆松科技”)宣布正式發(fā)布高性能RISC-V編譯器ZCC 4.0.0版本。
    的頭像 發(fā)表于 06-11 09:56 ?1727次閱讀

    RISC-V架構(gòu)下的編譯器自動向量化

    進(jìn)迭時空專注于研發(fā)基于RISC-V的高性能新AICPU,對于充分發(fā)揮CPU核的性能而言,編譯器是不可或缺的一環(huán),而在AI時代,毫無疑問向量算力將發(fā)揮越來越重要的作用。進(jìn)迭時空非常重視RISC-V
    的頭像 發(fā)表于 06-06 16:59 ?1249次閱讀
    RISC-V架構(gòu)下的<b class='flag-5'>編譯器</b>自動向量化

    【正點(diǎn)原子RK3506】安裝交叉編譯器、adb和編譯運(yùn)行SOEM控制EtherCAT IO從站

    】基于Buildroot系統(tǒng)_交叉編譯器安裝與使用參考手冊V1.1》中的說明,安裝相應(yīng)的交叉編譯器
    發(fā)表于 05-30 14:18

    RVCT編譯器是否比GNU的編譯器的代碼執(zhí)行速度更快?

    使用FX3S遇到了RVCT編譯器的問題。 1、在SDK的release note中有支持RVCT的描述, 但是在EZ USB Suite的設(shè)置中沒有找到RVCT的選項(xiàng), 請問支持的具體版本
    發(fā)表于 05-08 07:49

    HighTec編譯器全面支持芯馳科技車規(guī)MCU芯片E3650

    近日,HighTec與芯馳科技共同宣布HighTec編譯器套件將全面支持芯馳新一代旗艦智控MCU-E3650芯片。此次合作,進(jìn)一步豐富了芯馳車芯產(chǎn)品的工具鏈生態(tài),雙方將攜手為客戶提供高性能、高安全性的解決方案。
    的頭像 發(fā)表于 04-28 15:20 ?1814次閱讀

    HighTec編譯器全面適配紫光同芯THA6 Gen2系列產(chǎn)品

    近日,紫光同芯與全球領(lǐng)先的汽車級C/C++編譯器供應(yīng)商HighTec共同宣布,HighTec編譯器完成對紫光同芯THA6 Gen2系列產(chǎn)品的全面適配。此次合作實(shí)現(xiàn)了從指令集優(yōu)化到功能安全的全棧支持,是國產(chǎn)高端車規(guī)芯片與國際領(lǐng)先開發(fā)工具的深度技術(shù)融合,將為全球汽車電子開發(fā)者
    的頭像 發(fā)表于 04-02 09:42 ?1192次閱讀

    請問基于GCC編譯器的initcall在STM32如何實(shí)現(xiàn)?

    請問各位基于GCC編譯器的initcall在STM32如何實(shí)現(xiàn)?有哪位實(shí)現(xiàn)了嗎?
    發(fā)表于 03-13 06:24