我想知道如果你能幫助我知道的背後的價值是通的想法,並通過引用傳遞編譯器需要做,什麼是涉及的步驟?我會非常有益的,如果你能給我一隻手搭在這一點,因爲我工作的一個項目,這是一個小型的編譯器。編譯器如何實現按值傳遞和按引用傳遞?
0
A
回答
2
它完全取決於編譯器如何處理變量(可以稱爲「環境」)。
當變量被轉換爲內存引用(例如在C編譯器中)時,可以通過在後臺使用指針來實現傳遞引用,編譯器會生成必要的代碼以取消引用指針。按值傳遞通過複製數據來處理,然後參照副本。
如果編譯器使用一個符號表(這是更典型的解釋比編譯器)通過按值可以通過複製現有的符號表條目到一個新的用於新的變量來實現,而通過逐引用只是簡單地使用現有的條目。
其他環境中需要其他方法。
3
按值傳遞是傳遞的最基本形式。而且所有事情都是按照價值傳遞來實現的。
如果你問什麼,當一個函數被調用和參數按值傳遞實際上發生,這個因平臺而異。每個平臺都有自己的「調用約定」。大部分時間發生的事情是,前幾個參數存儲在處理器寄存器中。任何剩餘的參數將被存儲在被調用函數的堆棧幀中的預定義位置,類似於局部變量。 (如何局部變量都存儲在堆棧幀在編譯時,編譯器決定。),因此,當一個函數被調用時,需要被存儲在堆棧上被複制有任何參數;並且任何需要存儲在寄存器中的參數都被加載到那裏。然後控制傳遞給函數。
至於傳遞引用,如果語言有指針,通過引用傳遞可以通過按值傳遞指針來完成。編譯器可以只是有一個預處理步驟,其中它「消除」按引用傳遞通過進行以下轉換:
- 對於每一個功能參數,其通過引用傳遞,它變成一個指針,它指向類型通過值傳遞(例如
void func(int &foo)
- >void func(int *foo)
) - 對於每一個使用該函數內的是通過按引用參數的,它更改爲一個顯式的指針引用(例如
foo
- >*foo
)(例外情況是,如果它通過引用傳遞再次,不要取消對它的引用) - 每次調用該函數,無論是傳遞給傳址指ence變量,明確指出它的地址(例如,
func(bar)
- >func(&bar)
)
相關問題
- 1. Objective-C:NSLog傳遞值(按引用傳遞與按值傳遞)
- 2. C++按引用傳遞並按值傳遞副作用?
- 3. 包裝類是按值傳遞還是按引用傳遞?
- 4. Java是傳遞按值傳遞按引用兩個
- 5. python - 按值或按引用傳遞
- 6. Ç - 按值傳遞和引用傳遞不一致
- 7. 困惑於通過引用傳遞和按值傳遞#
- 8. PHP:按引用傳遞
- 9. 區分傳遞引用和傳遞值
- 10. c#對象通過引用傳遞或按值傳遞
- 11. Java數組:Java通過引用傳遞並按值傳遞?
- 12. 按值傳遞char *
- 13. 按值傳遞與傳遞參考
- 14. Java按值或通過引用傳遞?
- 15. RCPP通過引用傳遞與按值
- 16. VB6按值傳遞並通過引用
- 17. 通過引用或按值傳遞
- 18. 何時按價值傳遞?
- 19. 哪些類型按引用傳遞,哪些類型按值傳遞?
- 20. 按值傳遞字符串vs按值傳遞每個字符
- 21. 按值傳遞vs按多態傳遞參考
- 22. Java API設計 - 按對象傳遞或按值傳遞
- 23. 按值傳遞基元
- 24. C99常量傳遞按值
- 25. onclick傳遞按鈕的值
- 26. 瞭解Java按值傳遞
- 27. lua userdata按值傳遞
- 28. C程序按值傳遞
- 29. 通過引用傳遞與值傳遞
- 30. 如何實現「傳遞」DataBinding?
這是一個非常廣泛的,非特異性的問題。喜歡的東西[龍書(http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools)可能是一個更好的起點...... –