編譯器如何避免生成冗餘的goto指令

避免生成冗餘的goto指令

1. 題目:

在圖6-35 中所示的i和while語句的代碼佈局中,S,的代碼緊跟在布爾表達式B的代碼之後。通過使用一個特殊標號“fall”(即“不要生成任何跳轉指令”),我們可以修改圖6-36和圖6-37中的語義規則,支持控制流從的代碼直接穿越到S,的代碼。圖6-36中的產生式S-→if(B)S,;的新語義規則將 B.true 設爲 /fall: B.tru: = fallB.false-S.nes:t= S.netS.code-B.code:llS.cwde 類似地,if-else 和 while 語匐的規則也將 B.true 設爲,fall。現在我們將修改布爾表達式的語義規則,使之儘可能地允許控制流穿越。在Btrue和B.false 都是顯式的標號時,也就是說它們都不等於/all時,圖6-39中的B-E,reE,的新規則將產生兩條指令(和圖6-37 一樣)。否則,如果.true是顯式的標號,那麼B.false 一定是fall,因此它們產生一條 if 指令,使得當條件爲假時控制流穿越到下一條指令。反過來,如果 B.false 是顯式的標號,那麼它們產生一條 ifFalse指令。在其餘情況中,B.true和B.false 都是fall,因此不產生任何跳轉指令9。

2. 解釋:

這段文本描述瞭如何修改圖6-36和圖6-37中的語義規則,以支持控制流從布爾表達式的代碼直接穿越到S的代碼。接下來,我將逐步解釋這些修改:

  1. 針對if語句的產生式S-→if(B)S1:

    • 將B.true設爲fall,表示條件爲真時的跳轉標號不生成跳轉指令。

    • 將B.false設爲S1.next,表示條件爲假時的跳轉標號是S1的下一條指令。

修改後的語義規則:

lessCopy codeB.tru: = fall
B.false: = S.nex
S.code: = B.code || S1.code
  1. 針對if-else語句的產生式S-→if(B)S1 else S2:

    • 將B.true設爲fall,表示條件爲真時的跳轉標號不生成跳轉指令。

    • 將B.false設爲S1.next,表示條件爲假時的跳轉標號是S1的下一條指令。

修改後的語義規則:

lessCopy codeB.tru: = fall
B.false: = S1.nex
S.code: = B.code || S1.code || S2.code
  1. 針對while語句的產生式S-→while(B)S1:

    • 將B.true設爲fall,表示條件爲真時的跳轉標號不生成跳轉指令。

    • 將B.false設爲S1.next,表示條件爲假時的跳轉標號是S1的下一條指令。

修改後的語義規則:

lessCopy codeB.tru: = fall
B.false: = S1.nex
S.code: = B.code || S1.code
  1. 針對布爾表達式的產生式B-→RE:

    • 如果B.true是顯式的標號,而B.false是fall,則生成一條if指令,使得當條件爲假時控制流穿越到下一條指令。

    • 反之,如果B.false是顯式的標號,則生成一條ifFalse指令。

    • 其餘情況下,即B.true和B.false都是fall,則不生成任何跳轉指令。

修改後的語義規則:

arduinoCopy codeB.true: = fall
B.false: = fall
if B.true ≠ fall and B.false = fall:
    生成 if 指令
else if B.false ≠ fall:
    生成 ifFalse 指令
else:
    不生成跳轉指令

這些修改旨在允許控制流從布爾表達式的代碼直接穿越到S的代碼,從而實現更靈活的控制流程。

3. 總結概念:

當討論編譯器生成代碼的過程時,我們需要考慮控制流的管理。控制流即程序中指令執行的順序,如條件語句和循環等結構會影響程序的控制流。在編譯器中,控制流的管理是通過在程序中插入跳轉指令(如條件分支、無條件跳轉等)來實現的。

下面我會逐步解釋上述文本中提到的各個概念及其含義:

  1. fall標籤

    • 在文本中提到了一個特殊標籤“fall”,它代表“不要生成任何跳轉指令”。這意味着編譯器在遇到這個標籤時,不會生成任何跳轉指令,而是讓程序按照順序繼續執行下去,即控制流的穿越。

  2. if語句的改進

    • 在if語句的產生式中,我們將條件爲真時的跳轉標籤設置爲fall,意味着不會生成跳轉指令。這樣,如果條件爲真,程序會直接順序執行後續的代碼,不會跳轉到任何位置。

    • 對於條件爲假時,跳轉標籤設置爲S1.next,表示控制流會跳轉到if語句後面的代碼S1處執行。

  3. if-else語句的改進

    • 對於if-else語句,同樣將條件爲真時的跳轉標籤設置爲fall,表示不生成跳轉指令。而條件爲假時,跳轉標籤仍然設置爲S1.next,與if語句類似。

    • 另外,還要考慮if-else語句後面的代碼S2,所以在產生的代碼中需要將S2的代碼也添加進來。

  4. while語句的改進

    • while語句的改進與if語句類似,將條件爲真時的跳轉標籤設置爲fall,而條件爲假時的跳轉標籤設置爲S1.next。

  5. 布爾表達式的改進

    • 對於布爾表達式的產生式,需要考慮到條件爲真和條件爲假時的跳轉標籤。如果條件爲真時的跳轉標籤是顯式的,而條件爲假時的跳轉標籤是fall,那麼會生成一條if指令,使得當條件爲假時控制流穿越到下一條指令。

    • 如果條件爲假時的跳轉標籤是顯式的,則會生成一條ifFalse指令,表示條件爲假時跳轉到下一條指令。

    • 如果條件爲真和條件爲假時的跳轉標籤都是fall,則不會生成任何跳轉指令,控制流會順序執行下去。

這些改進旨在使編譯器生成的代碼更具靈活性和效率,能夠更好地管理程序的控制流程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章