2014-06-14 160 views
5

我正在學習操作系統和我不明白的東西是堆棧和堆棧。我知道每種方法的優點和優點,但在動態語言的情況下,我無法弄清楚堆棧是如何分配的。在PHP中堆棧和堆?

在靜態類型化語言中,所有原始數據類型都存儲在堆棧中,因爲它們很小,並且會按照它們分配的順序或多或少地重新分配,但是像PHP這樣的語言在運行時纔會知道。那麼堆棧大小和變量分配可能如何?

如果我理解正確,堆棧大小是通過分析原始數據類型的數量和一些偏移量在編譯時確定的。該過程如何在PHP或其他動態語言中完成?

如果這個問題是踢在黑暗中,請給我一些導遊如何瞭解這個

+1

我將標記動態編程固定爲動態語言 – Jack

回答

2
  1. 如果我理解它正確,所有的PHP數據類型是zvalzval基於幾個「Z」數據類型(在C中定義)。有「真實」數據類型的限制數量。我相信他們存儲在堆棧中。

    因此雖然用戶可以創建新的數據類型,但它們不是「真實」的數據類型,而是不同的zval值。 「真實」數據類型的數量和定義是穩定的。因此堆棧的大小和內容在運行時不會改變。

  2. 內存大小有限。 PHP必須積極做reference counting和垃圾收集。欲瞭解更多詳情,請閱讀this slide about PHP memory management

1

dynamic programming language的情況下,該解釋器負責處理該問題。解釋行爲大致就像一臺電腦。我們假設在32位機器上運行一個類C的解釋性編程語言:

c = 10;

基本上會發生以下情況的每一個表達式,在最小的解釋:

  • 譯隱式推斷c變量類型爲整數;
  • c標識符被置於表達的symbol table
  • 右側進行評價,並將結果關聯到c標識符。

當你寫這樣的表達式:

a = c * 2 

一個符號表查找被執行,尋找c標識符,如果找到,從符號表中保持基準例如此條,其中我們的10值存儲在內存中。這個10值被加載,然後在表達式中被「替換」。

+0

未分配值的值如何? – gorgi93

+1

他們仍然活在記憶中。 –

+0

作爲什麼類型或類型的變量? – gorgi93