2013-05-13 50 views
4

Java如何將變量名稱與內存中的位置相關聯?Java如何將變量名稱與內存中的位置相關聯?

我首先想到的是,必須有一個靜態表,用於所有變量名稱,它將它與它的值或它的值的位置相關聯。它是否存在並且是否存在此表的正式名稱?

+1

也許這將有助於:http://www.programmerinterview.com/index.php/java-questions/difference-between-a-primitive-type-and-a-class-type/ – javadeveloper 2013-05-13 17:54:25

+6

除非你正在實施一個JVM自己你不應該需要分配或跟蹤變量的確切內存位置。 – DuncanACoulter 2013-05-13 17:54:49

+0

變量名必須以某種方式加以限定,因爲不僅可以在不同類中使用相同名稱的變量,而且可以在同一類或方法中使用不同範圍的變量。 – asteri 2013-05-13 17:59:51

回答

4

原始類型變量的值是某個數字,而引用類型變量的值是一個引用(通常是一個內存地址)。

現在的問題是:存儲給定變量的值在哪裏。它取決於變量的種類 - 有局部變量,實例變量(字段)和類變量(靜態字段)。

編譯期間解決了當地人的姓名。每個變量在方法中變成簡單的第i個變量,它將作爲第i個變量存儲在某個方法調用的棧幀中。

例如變量會有所不同。字段名總是以字節碼存在(但通常不會出現在由JIT編譯器生成的機器碼中)。給定類的所有對象都具有相同的佈局,所以class可以存儲偏移量給定字段 - 距對象開頭的距離。解釋器可以讀取對象的地址並添加偏移量來計算存儲的變量的位置。

類變量類似於實例變量,但更簡單。在這種情況下,類存儲變量的名稱和值。

+0

你似乎專注於存儲實際對象的位置。但是,變量和對象之間的連接如何發生呢?在內存中必須存在變量存儲關於對象或原始位置的數據的地方。 – 2013-05-14 00:01:19

+2

在編譯期間,字段和局部變量名稱被解析爲表偏移量。在運行時,變量由其包含的stackframe/instance/class(用於靜態)擁有,但沒有鏈接返回 - 它們不需要。在它的stackframe/instance/etc容器之外沒有訪問變量的東西。 – 2013-05-14 00:29:52

0

從歷史上看,編譯包括創建一個符號表,該符號表將變量名與其源屬性確定的屬性相關聯。這是一個簡單的例子,但是這些原則並沒有改變,因爲FORTRAN是有用的。諸如C++和Java之類的語言中的用戶定義類型構成編譯單元的元數據的一部分,這些元數據在編譯期間收集,並在運行時可執行文件被創建或加載到內存中時一起編譯。

請注意,所有類型必須先定義,然後才能用於定義類型的對象。這是Java中的'import'和C/C++中的'#include'的用途。元數據包括方法和對象(或類)數據元素的定義,並用於確定在靜態存儲器,堆棧(塊進入/退出)或堆(動態分配)中創建的對象的大小。

在編譯時或執行過程中進行類型檢查是過去四十年來最重要的發展之一,也是我們能夠在火星,加利福尼亞高速公路或互聯網上使用自動機器人的主要原因之一。在覈心上,編程語言編譯或翻譯的核心問題是跟蹤對象的所有已知信息,並將其放置在可以在運行時正確使用的內存中。

像FORTRAN和COBOL這樣的古代語言只有一種類型的變量(靜態),它只具有基本的數據類型屬性。他們有幾乎無足輕重的符號表。最複雜的問題是將編譯單元連接在一起執行。我們已經走過了很長的一段路寶貝!

+0

問題是關於Java和內存管理,即運行時,並且這裏沒有什麼能夠真正回答它。相反,所有這些都是大約90%不相關的,包括奇怪的說「編譯的核心問題是跟蹤所有關於對象的知識」。這是很容易的部分。解析和代碼生成是中心問題。 – EJP 2013-05-14 00:51:42

+0

這個問題沒有提到內存管理。它表明對計算機科學的理解很少,我拋出了一堆關鍵字,希望你可以環顧四周,學習一些東西。 – user1295785 2013-05-14 01:03:19

+0

這個問題沒有提到內存管理。我拋出了一堆關鍵字,希望你可以環顧四周,學習一些東西。在所有類型的程序中都使用三種通用類型的數據存儲器:靜態存儲器爲每個變量使用一個單獨的存儲單元。大小由變量類型決定。高級語言還提供了文本語句塊中的局部變量。高級技術採用動態內存分配 - 信息存儲在稱爲「堆」的內存「池」中。存儲的名稱分配取決於正在使用哪些分配。 – user1295785 2013-05-14 01:10:12

相關問題