後記:變數是寫程式中司空見慣的東西,可是到了機器層面,一切都消失了,只剩下地址,地址,地址。所以CPU和記憶體非常疑惑,變數到底是什麼東西?
熟悉C語言的同學可能對漫畫中的組合有點疑惑,因為C語言程式碼(x+y)*z沒有出現指標,怎麼也都變成地址了 ?其實在硬體層面,都是地址,這裡展示的是一個C語言函數
int cal(int x, int y,int z){
return (x+y)*z;
}
對於函數呼叫來說,轉化成組合以後,會對應一個個的棧幀,當前的棧幀(例如函數cal)開始地址儲存在ebp這個暫存器當中, 而函數cal的引數儲存在上一個棧幀中(也就是呼叫者的棧幀當中),所以可以用8(%ebp), 12(%ebp),16(%ebp)來參照,意思是把暫存器ebp中的地址加上8,加上12,加上16,所以,一起都是地址。
對於Java虛擬機器器來說,雖然它執行的是位元組碼,但是在執行的時候,位元組碼也得靠機器指令來實現,最底層都是地址。
更多精彩技術漫畫,盡在碼農翻身