0

我想知道如果你能幫助我知道的背後的價值是通的想法,並通過引用傳遞編譯器需要做,什麼是涉及的步驟?我會非常有益的,如果你能給我一隻手搭在這一點,因爲我工作的一個項目,這是一個小型的編譯器。編譯器如何實現按值傳遞和按引用傳遞?

+3

這是一個非常廣泛的,非特異性的問題。喜歡的東西[龍書(http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools)可能是一個更好的起點...... –

回答

2

它完全取決於編譯器如何處理變量(可以稱爲「環境」)。

當變量被轉換爲內存引用(例如在C編譯器中)時,可以通過在後臺使用指針來實現傳遞引用,編譯器會生成必要的代碼以取消引用指針。按值傳遞通過複製數據來處理,然後參照副本。

如果編譯器使用一個符號表(這是更典型的解釋比編譯器)通過按值可以通過複製現有的符號表條目到一個新的用於新的變量來實現,而通過逐引用只是簡單地使用現有的條目。

其他環境中需要其他方法。

3

按值傳遞是傳遞的最基本形式。而且所有事情都是按照價值傳遞來實現的。

如果你問什麼,當一個函數被調用和參數按值傳遞實際上發生,這個因平臺而異。每個平臺都有自己的「調用約定」。大部分時間發生的事情是,前幾個參數存儲在處理器寄存器中。任何剩餘的參數將被存儲在被調用函數的堆棧幀中的預定義位置,類似於局部變量。 (如何局部變量都存儲在堆棧幀在編譯時,編譯器決定。),因此,當一個函數被調用時,需要被存儲在堆棧上被複制有任何參數;並且任何需要存儲在寄存器中的參數都被加載到那裏。然後控制傳遞給函數。

至於傳遞引用,如果語言有指針,通過引用傳遞可以通過按值傳遞指針來完成。編譯器可以只是有一個預處理步驟,其中它「消除」按引用傳遞通過進行以下轉換:

  • 對於每一個功能參數,其通過引用傳遞,它變成一個指針,它指向類型通過值傳遞(例如void func(int &foo) - >void func(int *foo)
  • 對於每一個使用該函數內的是通過按引用參數的,它更改爲一個顯式的指針引用(例如foo - >*foo)(例外情況是,如果它通過引用傳遞再次,不要取消對它的引用)
  • 每次調用該函數,無論是傳遞給傳址指ence變量,明確指出它的地址(例如, func(bar) - >func(&bar)