當前位置:首頁 » 編程軟體 » 編譯器中間代碼

編譯器中間代碼

發布時間: 2023-03-20 21:00:52

編譯程序是不是一定要產生中間代碼

是的,中間代碼的意義就是微軟推出.NET平台的意義
NET是Microsoft面向XMLWeb服務的平台,這種下一代的軟體將使用一種統一、個性化的方式將我們的信息、設備和人員緊密聯系在一起。

㈡ 正在做一個小型編譯器,請問如何把中間表達式如何生成c語言

你的意思不是很明白。
我就簡單說下一個我當時寫一個簡單編譯器的流程吧
首先你得確定文法,然後再開始寫編譯器
1. 用flex寫詞法分析程序,具體的網上有很多資料。
2. 用yacc寫語法分析程序,可以分幾步來寫
先寫一個語法樹生成程序,列印出語法樹,可以進行簡單的類型檢查;
再使用語法制導的翻譯方案,寫一個中間代碼生成程序。
3. 將中間代碼翻譯成匯編語言,優化就不做了太麻煩。

推薦龍書

㈢ 編譯程序中間代碼的生成對編譯器的前端和後端有什麼作用

編譯器粗略分為詞法分析,語法分析,類型檢查,中間代碼生成,代碼優化,目標代碼生成,目標代碼優化。把中間代碼生成及之前階段劃分問編譯器的前端,那麼後端與前端是獨立的。後端只需要一種中間代碼表示,可以是三地址代碼或四元式等,而這些都與前端生成的方式無關。也就是不論你前端是用fortran還是c/c++,只要生成了中間代碼表示就可以了,後端是不管你是用哪種語言生成的。

㈣ c程序經過編譯後獲得的中間代碼文件還需要經過

開發一個C語言程序需要經過的四個步驟:編輯、編譯、連接、運行。
C語言程序可以使用在任意架構的處理器上,只要那種架構的處理器具有對應的C語言編譯器和庫,然後將C源代碼編譯、連接成目標二進制文件之後即可運行。
1、預處理:輸入源程序並保存(.C文件)。
2、編譯:將源程序翻譯為目標文件(.OBJ文件)。
3、鏈接:將目標文件生成可執行文件( .EXE文件)。
4、運行:執行.EXE文件,得到運行結果。

㈤ 編譯器的組成及各部分的功能及作用

1. 詞法分析 詞法分析器根據詞法規則識別出源程序中的各個記號(token),每個記號代表一類單詞(lexeme)。源程序中常見的記號可以歸為幾大類:關鍵字、標識符、字面量和特殊符號。詞法分析器的輸入是源程序,輸出是識別的記號流。詞法分析器的任務是把源文件的字元流轉換成記號流。本質上它查看連續的字元然後把它們識別為「單詞」。 2. 語法分析 語法分析器根據語法規則識別出記號流中的結構(短語、句子),並構造一棵能夠正確反映該結構的語法樹。 3. 語義分析 語義分析器根據語義規則對語法樹中的語法單元進行靜態語義檢查,如果類型檢查和轉換等,其目的在於保證語法正確的結構在語義上也是合法的。 4. 中間代碼生成 中間代碼生成器根據語義分析器的輸出生成中間代碼。中間代碼可以有若干種形式,它們的共同特徵是與具體機器無關。最常用的一種中間代碼是三地址碼,它的一種實現方式是四元式。三地址碼的優點是便於閱讀、便於優化。 5. 中間代碼優化 優化是編譯器的一個重要組成部分,由於編譯器將源程序翻譯成中間代碼的工作是機械的、按固定模式進行的,因此,生成的中間代碼往往在時間和空間上有很大浪費。當需要生成高效目標代碼時,就必須進行優化。 6. 目標代碼生成 目標代碼生成是編譯器的最後一個階段。在生成目標代碼時要考慮以下幾個問題:計算機的系統結構、指令系統、寄存器的分配以及內存的組織等。編譯器生成的目標程序代碼可以有多種形式:匯編語言、可重定位二進制代碼、內存形式。 7 符號表管理 符號表的作用是記錄源程序中符號的必要信息,並加以合理組織,從而在編譯器的各個階段能對它們進行快速、准確的查找和操作。符號表中的某些內容甚至要保留到程序的運行階段。 8 出錯處理用戶編寫的源程序中往往會有一些錯誤,可分為靜態錯誤和動態錯誤兩類。所謂動態錯誤,是指源程序中的邏輯錯誤,它們發生在程序運行的時候,也被稱作動態語義錯誤,如變數取值為零時作為除數,數組元素引用時下標出界等。靜態錯誤又可分為語法錯誤和靜態語義錯誤。語法錯誤是指有關語言結構上的錯誤,如單詞拼寫錯、表達式中缺少操作數、begin和end不匹配等。靜態語義錯誤是指分析源程序時可以發現的語言意義上的錯誤,如加法的兩個操作數中一個是整型變數名,而另一個是數組名等。

㈥ 編譯器筆記34-中間代碼生成-布爾表達式的回填

基本思想:生成一個跳轉指令時,暫時不指定該跳轉指令的目標標號。這樣的指令都被放入由跳轉指令組成的列表中。同一個列表中的所有跳轉指令具有相同的目標標號。等到能夠確定正確的目標標號時,才去填充這些指令的目標標號。

B.truelist:指向一個包含跳轉指令的列表,這些指令最終獲得的目標標號就是當B為真時控制流應該轉向的指令的標號。

B.falselist:指向一個包含跳轉指令的列表,這些指令最終獲得的目標標號就是當B為假時控制流應該轉向的指令的標號。

為了處理跳轉指令的列表我們構造了三個函數

上述的布爾表達式將被翻譯成兩條跳轉指令。兩條跳轉指令的標號都不填寫因為這兩條跳轉指令的標號都在等待回填,因此我們要把它放到相應的列表中。

第一條跳轉指令的目標標號是B的真出口,因此我們把它放到B.truelist中。調用makelist函數生成一個只包含nextquad的列表,並把這個列表的指針賦值給truelist,這里的nextquad是指即將生成的下一條指令的標號,即gen('if' E1.addr relop E2.addr'goto_')這條指令的標號。

第二條跳轉指令的目標標號是B的假出口,因此把這條跳轉指令存放到B.falselist中。因此我們調用makelist函數生成一個只包含nextquad+1這樣一個標號的列表,nextquad+1標號就是gen('goto_')這條指令的標號。

這樣的話我們就將這兩條指令分別放入到B.truelist和B.falselist中。

問:list中存的是對應跳轉指令的標號?

當B定義為true時,此時可以確定布爾表達式的值為真,生成一條跳轉到B的真出口的一條指令。由於此真出口的標號不能確定有待回填,我們把它放入到B.truelist中。

當B定義為false時,此時可以確定布爾表達式的值為假,生成一條跳轉到B的假出口的一條指令。由於此真出口的標號不能確定有待回填,我們把它放入到B.falselist中。

對B的翻譯與其對應的子表達式B1的翻譯是相同的,因此B的屬性值等於B1的屬性值。

B的值與B1的值正好相反,因此將兩個非終結符的屬性進行對調。

B1.truelist中的這些指令都要跳轉到B1的真出口,當B1為真的時候整個表達式的值就是為真的,因此B1的真出口就是B的真出口。要跳轉到B1的真出口就是跳轉到B的真出口,因此B1.truelist中的指令都要放到B.truelist中。

B2.truelist的指令都要跳轉到真出口,當B2為真時整個表達式的值也為真,因此B2的真出口就是B的真出口。要跳轉到B2的真出口就是要跳轉到B的真出口,因此B2.truelist中的指令都要放到B.truelist中。

B1.falselist中的指令它們都是要跳轉到B1的假出口,當B1的值為假的時候我們要進一步判斷B2的值,因此B1的假出口就是B2的第一條指令,因此B1.falselist中的指令都要跳轉到B2的第一條指令。

B2.falselist中的指令都要跳轉到B2的假出口,當B2的值為假的時候那麼整個布爾表達式的值也是假的。因此B2的假出口就是B的假出口,要跳轉到B2的假出口也就是要跳轉到B的假出口。B2.falselist中的指令都要放置到B.falselist中。

根據此示意圖可以看出,在分析B2之前,要用B2的第一條指令的標號來回填B1.falselist中的各條指令。當然我們可以記錄下B2的第一條指令的標號在歸約時完成此回填動作。為了記下B2第一條指令的標號我們在非終結符B2之前插入一個標記非終結符M。與M關聯的語義動作它的任務就是記錄下B2的第一條語義動作的標號。我們給M設置一個綜合屬性quad,M.quad等於下一條指令的標號。因為我們把M放在B2之前,因此M.quad記錄的是第二條指令的標號。根據翻譯方案示意圖,我們要用M.quad來回填B1.falselist中的各條指令,因此調用backpatch用M.quad回填B1.falselist中的各條屬性。B.truelist是由B1.truelist和B2.truelist合並而成的,因此我們調用merge函數將B1.truelist和B2.truelist進行合並,將合並後的指針賦值給B.truelist。

註:因為這里我們定義的都是綜合屬性,從左向右掃描輸入串。makelist函數生成一個只包含下一條指令的列表,並把指針賦值給B.trulist。我們假設下一條指令從100開始。gen(『if 』 E 1 .addr relop E 2 .addr 『goto _』)中E1.address等於a,relop就是小於號,E2.address等於b,引號中的字元串按字面值傳遞。下劃線表示待回填的目標標號。

註:將棧頂中的空串歸約成一個標記非終結符M

註:有四條指令是等待回填的,在B的truelist中有兩條指令100和104,當B的真出口確定以後我們將用B的真出口的標號這兩條指令。同理當B的假出口確定以後將會用B的假出口的標號回填此兩條指令。

㈦ 什麼是中間代碼

是說編譯後生成的中間代碼嗎?
簡單說就是一種你看不懂,電腦也看不懂的代碼。
打比方,你會說中文,另缺戚一個人會說英文,如果想要他聽懂你說的話,就要伏老陵有一個懂英含瞎文又懂中文的人來翻譯,中間代碼就是這樣一個角色,他把C語言翻譯成計算機可以直接識別的語言,其實,計算機是看不懂C語言的,呵呵,整個翻譯過程有些復雜就不詳細說了。

㈧ 編譯過程中,源程序為什麼要通過中間代碼生成目標程序

源程序是指程序員編寫的代碼,可以被編譯程序編譯為目標程序。
如果是c++,那麼後綴為.cpp
目標程序是編譯程序將源程序編譯後的結果,如果是c++,那麼後綴是.o
編譯程序一般是編譯器公司(比如微軟
intel他們都生產編譯器)做的,它將源代碼轉化為機器可識別的文件,經過鏈接,生成可執行程序。
解釋程序即解釋器,它不需要經過編譯階段即可根據用戶源程序執行。
程序語言分編譯類和解釋類語言。

㈨ 有的編譯程序中可能沒有生成中間代碼

在這部分內容中,我們主要討論各類語句的翻譯,包括辯指物聲明語逗肢句、賦值語句、控制語句等。對這些語句的翻譯方法攜液直接決定了編譯器底層的實現。

㈩ C# 為什麼要弄成中間代碼

1、因為c語言也不能說真正的跨平台,只是這種語言比較低級,各個平台的實現相對一致。
c語言的東西下載時還是會分平台的,比如for linux, for windows, for Mac等,不同平台的編譯器對c的解釋都有差異,所以只能說跨平台容易一些。
2、按微軟的規劃,以後的應用程序要從網上付費下載來使用,這樣就帶來下載軟體的安全與否的問題,而C#經編譯後形成的是中間代碼,不可以在本地機器上直接執行,必須經過CLR轉換成本地代碼後才能執行。
這樣,中間碼可以順利通過防火牆,而且安全性又有CLR來保證。

熱點內容
cf手游刷級腳本 發布:2024-06-14 23:26:40 瀏覽:921
android顏色識別 發布:2024-06-14 23:20:44 瀏覽:692
osg編譯max 發布:2024-06-14 23:11:00 瀏覽:938
15個鏡頭的腳本 發布:2024-06-14 22:38:08 瀏覽:510
如何打開伺服器的防火牆 發布:2024-06-14 22:36:36 瀏覽:812
安卓版的第5人格怎麼賣 發布:2024-06-14 22:36:28 瀏覽:904
50g硬碟雲伺服器 發布:2024-06-14 22:35:49 瀏覽:479
華為java編程規范 發布:2024-06-14 22:19:31 瀏覽:576
無線伺服器更換ip 發布:2024-06-14 22:05:56 瀏覽:944
網頁登陸腳本 發布:2024-06-14 22:05:55 瀏覽:26