国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

編譯程序的任務(wù)

這篇具有很好參考價(jià)值的文章主要介紹了編譯程序的任務(wù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

編譯程序是一種翻譯程序,編譯程序是將一種語(yǔ)言形式翻譯成另一種語(yǔ)言形式。它將高級(jí)語(yǔ)言所寫(xiě)的源程序翻譯成等價(jià)的機(jī)器語(yǔ)言或匯編語(yǔ)言的目標(biāo)程序。

整個(gè)編譯過(guò)程一般可以劃分為 5 個(gè)階段:詞法分析、語(yǔ)法分析、語(yǔ)義分析及中間代碼生成、中間代碼優(yōu)化和目標(biāo)代碼生成。我們以一個(gè)簡(jiǎn)單的程序段為例,分別介紹這 5 個(gè)階段所完成的任務(wù)。例如,計(jì)算圓柱體表面積的程序段如下:

float r,h,s;
s = 2 * 3.1416 * r * (h + r);

詞法分析

詞法分析階段的任務(wù)是對(duì)構(gòu)成源程序的字符串進(jìn)行從左到右的掃描和分解,根據(jù)語(yǔ)言的詞法規(guī)則,識(shí)別出一個(gè)一個(gè)具有獨(dú)立意義的單詞(也稱單詞符號(hào),簡(jiǎn)稱符號(hào))。

語(yǔ)言的詞法規(guī)則是單詞符號(hào)的形成規(guī)則,它規(guī)定了哪些字符串構(gòu)成一個(gè)單詞符號(hào)。上述源程序通過(guò)詞法分析,根據(jù)語(yǔ)言的詞法規(guī)則識(shí)別出如下單詞符號(hào):

  • 基本字(關(guān)鍵字) float
  • 標(biāo)識(shí)符 r,h,s
  • 常數(shù) 3.1416,2
  • 運(yùn)算符 *,+
  • 界符 () ; ,

單詞符號(hào)的類型有:關(guān)鍵字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、界符。

語(yǔ)法分析

語(yǔ)法分析的任務(wù)是在詞法分析的基礎(chǔ)上,根據(jù)語(yǔ)言的語(yǔ)法規(guī)則,從單詞符號(hào)串中識(shí)別出各種語(yǔ)法單位(如表達(dá)式、說(shuō)明、 語(yǔ)句等)并進(jìn)行語(yǔ)法檢查,即檢查各種語(yǔ)法單位在語(yǔ)法結(jié)構(gòu)上的正確性。

語(yǔ)言的語(yǔ)法規(guī)則是語(yǔ)法單位的形成規(guī)則。它規(guī)定了如何從單詞符號(hào)形成語(yǔ)法單位。上述源程序通過(guò)語(yǔ)法分析,根據(jù)語(yǔ)言的語(yǔ)法規(guī)則識(shí)別單詞符號(hào)串 s = 2 * 3.1416 * r * (h + r),其中 s 是 <變量>,單詞符號(hào)串 2 * 3.1416 * r * (h + r) 組合成 <表達(dá)式 > 這樣的語(yǔ)法單位, 則由 <變量> = <表達(dá)式> 構(gòu)成 <賦值語(yǔ)句> 這樣的語(yǔ)法單位。在識(shí)別各類語(yǔ)法單位的同時(shí)進(jìn)行語(yǔ)法檢查,可以看到上述源程序是一個(gè)語(yǔ)法上正確的程序。

語(yǔ)義分析及中間代碼生成

定義一種語(yǔ)言除了要求定義語(yǔ)法外,還要求定義其語(yǔ)義,即對(duì)語(yǔ)言的各種語(yǔ)法單位賦予具體的意義。

語(yǔ)義分析的任務(wù)是首先對(duì)每種語(yǔ)法單位進(jìn)行靜態(tài)的語(yǔ)義審查,然后分析其含義,并用另一種語(yǔ)言形式(比源語(yǔ)言更接近于目標(biāo)語(yǔ)言的一種中間代碼或直接用目標(biāo)語(yǔ)言)來(lái)描述這種語(yǔ)義。例如,上述源程序中,賦值語(yǔ)句的語(yǔ)義為:計(jì)算賦值號(hào)右邊表達(dá)式的值,并把它送到賦值號(hào)左邊的變量所確定的內(nèi)存單元中。語(yǔ)義分析時(shí),先檢查賦值號(hào)右邊表達(dá)式和左邊變量的類型是否一致,然后再根據(jù)賦值語(yǔ)句的語(yǔ)義,對(duì)它進(jìn)行翻譯可得到如下形式的四元式中間代碼:

編譯程序的任務(wù)

其中,T1、T2、T3、T4 是編譯程序引進(jìn)的臨時(shí)變量,存放每條指令的運(yùn)算結(jié)果。上述每一個(gè)四元式所表示的語(yǔ)義為:

編譯程序的任務(wù)

這樣,我們將源語(yǔ)言形式的賦值語(yǔ)句翻譯為四元式表示的另一種語(yǔ)言形式,這兩種語(yǔ)言在結(jié)構(gòu)形式上是不同的,但在語(yǔ)義上是等價(jià)的。

中間代碼優(yōu)化

中間代碼優(yōu)化的任務(wù)是對(duì)前階段產(chǎn)生的中間代碼進(jìn)行等價(jià)變換或改造,以期獲得更為高效的,節(jié)省時(shí)間和空間的目標(biāo)代碼。優(yōu)化主要包括局部?jī)?yōu)化和循環(huán)優(yōu)化等,例如上述四元式經(jīng)局部?jī)?yōu)化后得:

編譯程序的任務(wù)

其中,2 和 3.1416 兩個(gè)運(yùn)算對(duì)象都是編譯時(shí)的已知量,在編譯時(shí)就可計(jì)算出它的值 6.28,而不必等到程序運(yùn)行時(shí)再計(jì)算,即不必生成(*,2,3.1416,T1)的運(yùn)算指令。

目標(biāo)代碼生成

目標(biāo)代碼生成的任務(wù)是將中間代碼變換成特定機(jī)器上的絕對(duì)指令代碼或可重定位的指令代碼或匯編指令代碼。

表格管理 & 錯(cuò)誤處理

在編譯程序的各個(gè)階段中,都要涉及表格管理和錯(cuò)誤處理。

編譯程序的重要功能之一,是記錄源程序中所使用的變量的名字,并且收集與名字屬性相關(guān)的各種信息。名字屬性包括一個(gè)名字的存儲(chǔ)分配、類型、作用域等信息。如果名字是一個(gè)函數(shù)名,還會(huì)包括其參數(shù)數(shù)量、類型、參數(shù)的傳遞方式以及返回類型等信息。符號(hào)表數(shù)據(jù)結(jié)構(gòu)可以為變量名字創(chuàng)建記錄條目,來(lái)登記源程序中所提供的或在編譯過(guò)程中所產(chǎn)生的這些信息,編譯程序在工作過(guò)程的各個(gè)階段需要構(gòu)造、查找、修改或存取有關(guān)表格中的信息,因此在編譯程序中必須有一組管理各種表格的程序。

如果編譯程序只處理正確的程序,那么它的設(shè)計(jì)和實(shí)現(xiàn)將會(huì)大大簡(jiǎn)化。但是程序設(shè)計(jì)人員還期望編譯程序能夠幫助定位和跟蹤錯(cuò)誤。無(wú)論程序員如何努力,程序中難免總會(huì)有錯(cuò)誤出現(xiàn)。雖然錯(cuò)誤很常見(jiàn),但很少有語(yǔ)言在設(shè)計(jì)的時(shí)候就考慮到錯(cuò)誤處理問(wèn)題。大部分程序設(shè)計(jì)語(yǔ)言的規(guī)范沒(méi)有規(guī)定編譯程序應(yīng)該如何處理錯(cuò)誤;錯(cuò)誤處理方法由編譯程序的設(shè)計(jì)者決定。 因此,從一開(kāi)始就計(jì)劃好如何進(jìn)行錯(cuò)誤處理,不僅可以簡(jiǎn)化編譯程序的結(jié)構(gòu),還可以改進(jìn)錯(cuò)誤處理方法。一個(gè)好的編譯程序在編譯過(guò)程中, 應(yīng)具有廣泛的程序查錯(cuò)能力,并能準(zhǔn)確地報(bào)告錯(cuò)誤的種類及出錯(cuò)位置,以便用戶查找和糾正,因此在編譯程序中還必須有一個(gè)出錯(cuò)處理程序。

編譯程序

編譯過(guò)程的這 5 個(gè)階段的任務(wù)分別由 5 個(gè)程序完成,這 5 個(gè)程序分別稱為詞法分析程序、語(yǔ)法分析程序、語(yǔ)義分析及中間
代碼生成程序、中間代碼優(yōu)化程序和目標(biāo)代碼生成程序,另外再加上表格管理程序和出錯(cuò)處理程序。這些程序便是編譯程
序的主要組成部分,一個(gè)典型編譯程序的結(jié)構(gòu)框圖如圖所示。

編譯程序的任務(wù)

需要注意的是,圖中所給出的各個(gè)階段之間的關(guān)系是指它們之間的邏輯關(guān)系,不一定是執(zhí)行時(shí)間上的先后關(guān)系。實(shí)際
上,可按不同的執(zhí)行流程來(lái)組織上述各階段的工作,這在很大程度上依賴于編譯過(guò)程中對(duì)源程序掃描的遍數(shù)以及如何劃分各遍掃描所進(jìn)行的工作。

此處所說(shuō)的 “遍”,是指對(duì)源程序或其等價(jià)的中間語(yǔ)言程序從頭到尾掃描一遍,并完成規(guī)定加工處理工作的過(guò)程。例如,可以將前述 5 個(gè)階段的工作結(jié)合在一起,對(duì)源程序從頭到尾掃描一遍來(lái)完成編譯的各項(xiàng)工作,這種編譯程序稱為一遍掃描的編譯程序。對(duì)于某些程序設(shè)計(jì)語(yǔ)言,用一遍掃描的編譯程序去實(shí)現(xiàn)比較困難,可采用多遍掃描的編譯程序結(jié)構(gòu),每遍可完成上述某個(gè)階段的一部分、全部或多個(gè)階段的工作,且每一遍的工作是從前一遍獲得的工作結(jié)果開(kāi)始的,最后一遍的工作結(jié)果是目標(biāo)語(yǔ)言程序,第一遍的輸入則是用戶書(shū)寫(xiě)的源程序。

多遍掃描的編譯程序較一遍掃描的編譯程序少占存儲(chǔ)空間,遍數(shù)多一些,可使各遍所要完成的功能獨(dú)立而單純,其編譯程序邏輯結(jié)構(gòu)清晰,但遍數(shù)多勢(shì)必增加輸入輸出開(kāi)銷,這將降低編譯效率。一個(gè)編譯程序究竟應(yīng)分成幾遍和它所面臨的源語(yǔ)言的特征、機(jī)器規(guī)模、設(shè)計(jì)的目標(biāo)等因素有關(guān),很難統(tǒng)一劃定。一般在主存可能的前提下,還是遍數(shù)少一點(diǎn)為好。

參考資料

《編譯原理(第4版)》1.2 編譯過(guò)程和編譯程序的基本結(jié)構(gòu)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-491604.html

到了這里,關(guān)于編譯程序的任務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 微信小程序編譯.wxml文件編譯錯(cuò)誤

    微信小程序編譯.wxml文件編譯錯(cuò)誤

    [ WXML 文件編譯錯(cuò)誤] ./pages/mine/wallet.wxml Bad value with message 1 | view 剛開(kāi)始找了半天都沒(méi)發(fā)現(xiàn)錯(cuò)誤,后面才發(fā)現(xiàn)原來(lái)是我寫(xiě)頁(yè)面的時(shí)候,插值語(yǔ)法忘記換成后端傳過(guò)來(lái)的數(shù)據(jù)了, 無(wú)語(yǔ)子- - 。 把插值語(yǔ)法中的中文改掉就不會(huì)報(bào)錯(cuò)了,不過(guò)不同原因都會(huì)報(bào)這個(gè)錯(cuò)誤,錯(cuò)誤原因大部分

    2024年02月15日
    瀏覽(23)
  • C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)

    C語(yǔ)言中程序的編譯(預(yù)處理操作)+鏈接詳解(詳細(xì)介紹程序預(yù)編譯過(guò)程)

    今天我們來(lái)學(xué)習(xí)C語(yǔ)言中程序的編譯和鏈接是如何進(jìn)行的。 在ANSI C的任何一種實(shí)現(xiàn)中,存在兩個(gè)不同的環(huán)境。 第1種是翻譯環(huán)境,在這個(gè)環(huán)境中源代碼被轉(zhuǎn)換為可執(zhí)行的機(jī)器指令。 第2種是執(zhí)行環(huán)境,它用于實(shí)際執(zhí)行代碼。 本文主要是介紹預(yù)編譯階段的相關(guān)知識(shí)。 1.組成一個(gè)程

    2023年04月09日
    瀏覽(33)
  • 微信小程序編譯bug---Hbuilderx編譯時(shí)一直卡在編譯界面

    微信小程序編譯bug---Hbuilderx編譯時(shí)一直卡在編譯界面

    使用Hbuilderx開(kāi)發(fā)微信小程序,正常開(kāi)發(fā)中,在某次重新保存代碼并編譯后一直卡在編譯界面; 如圖(圖為Hbuilderx界面) 因?yàn)榇藭r(shí)沒(méi)有編譯完成,所以微信開(kāi)發(fā)者工具界面一片空白,報(bào)錯(cuò)為:app.json: app.json 未找到 原因分析1:電腦有bug,遇事不決先重啟; 舉措:重啟HbuilderX;

    2024年01月17日
    瀏覽(22)
  • 交叉編譯arm程序,編譯arm版本的openssl

    交叉編譯arm程序,編譯arm版本的openssl

    開(kāi)局一個(gè)錯(cuò): 顯示沒(méi)有GCC, 于是下載gcc; 下載gcc有問(wèn)題: 發(fā)現(xiàn)是換源的問(wèn)題,于是換源后繼續(xù)安裝,安裝成功: 接著繼續(xù)出錯(cuò): 繼續(xù)安裝庫(kù)sudo apt-get install libncurses5-dev 接著又報(bào)錯(cuò)了,我之前去的github上弄的buildroot,現(xiàn)在去官網(wǎng)下載一個(gè)。 果然運(yùn)行成功了: Target options:

    2024年02月04日
    瀏覽(25)
  • Uniapp編譯后小程序的代碼反編譯一些思路

    Uniapp編譯后小程序的代碼反編譯一些思路

    最近客戶做的一個(gè)微信小程序,可以原來(lái)的開(kāi)發(fā)者忘記給他源文件了,只能通過(guò)反編譯uniapp找回原來(lái)的代碼,特此記錄一下反編譯的過(guò)程 舉例: 編譯后的代碼: 第一步 移除一些沒(méi)有用的事件 第二步 將非標(biāo)簽里面的{{}}里面的轉(zhuǎn)變?yōu)?vue 事件 如? 第三步 將小程序.js里面的o

    2024年02月13日
    瀏覽(22)
  • Qt 編譯程序打包依賴庫(kù)

    windows環(huán)境 使用windeployqt.exe 打包 linux環(huán)境 使用ldd命令打包

    2024年02月13日
    瀏覽(19)
  • 小程序反編譯-獲取源碼

    小程序反編譯-獲取源碼

    tips: 可以成功反編譯的包: ①已上線的小程序 (測(cè)試版-不可以) ②原生開(kāi)發(fā)的小程序(使用uniapp等生成的小程序,反編譯后只能獲取到—uniapp等編譯后的代碼) 下載夜神模擬器:官網(wǎng)下載(夜神安卓模擬器-安卓模擬器電腦版下載_安卓手游模擬器_手機(jī)模擬器_官網(wǎng)) 在模

    2024年02月14日
    瀏覽(18)
  • 微信小程序反編譯

    微信小程序反編譯

    官方地址 正常反編譯 反編譯后的文件和wxapkg在同一文件夾 可能會(huì)出現(xiàn)的問(wèn)題 測(cè)試環(huán)境:win11 看網(wǎng)上別人的解答都是將下載好的文件解壓到d盤(pán)(原因是路徑切換問(wèn)題),但是測(cè)試并不成功。 經(jīng)過(guò)測(cè)試,部分環(huán)境下不支持軟件執(zhí)行的 exit 語(yǔ)法,所以執(zhí)行后并未進(jìn)行反編譯操作

    2024年02月10日
    瀏覽(24)
  • VX小程序反編譯

    VX小程序反編譯

    小程序反編譯是是小程序測(cè)試必不可少的部分,接下來(lái)就讓我們探討其中一種反編譯方式吧,以下純屬小分享,謝謝?。?! 相關(guān)工具及鏈接: 鏈接:https://pan.baidu.com/s/1wutUCKbwrU-URD_RFmSWVg? 提取碼:4ret node.js運(yùn)行環(huán)境 小程序解密腳本 反編腳本 微信小程序開(kāi)發(fā)者工具 第一步 :

    2024年02月16日
    瀏覽(19)
  • 程序的編譯和鏈接

    程序的編譯和鏈接

    ? 目錄 翻譯環(huán)境? linux下的測(cè)試??編輯 預(yù)定義符號(hào) 執(zhí)行環(huán)境 #define定義宏 #和## # ## 宏參數(shù)的副作用 宏和函數(shù)對(duì)比 優(yōu)點(diǎn) 缺點(diǎn) #undef? ?條件編譯 頭文件包含 在標(biāo)準(zhǔn)c的任何實(shí)現(xiàn)中,存在兩種環(huán)境—— 翻譯環(huán)境和執(zhí)行環(huán)境 翻譯環(huán)境生成目標(biāo)文件(.obj) : vs不完全支持c標(biāo)準(zhǔn),

    2024年02月08日
    瀏覽(8)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包