2013-06-25 160 views
2

在Delphi中,我們可以這樣做:爲什麼局部變量不能在聲明和全局變量分配?

interface 
var 
    test: string = 'this is a test!'; { compiler accepts that } 

但是,我們不能做到這一點:

implementation 
procedure showTest; 
var 
    internal_test1; { compiler accepts that } 
    internal_test2: string = 'another test'; { compiler error } 

我希望從英巴卡迪諾一些用戶可以回答這個問題。 :-)

+0

http://docwiki.embarcadero.com/RADStudio/XE4/en/Memory_Management_on_the_Win32_Platform – bummi

+1

你根本就做不到。編譯器不允許它。還有什麼人可以說呢? –

+1

如果你真的想要一致性,犧牲掉純Pascal:http://wiki.oxygenelanguage.com/en/Minor_Language_Differences_compared_to_Delphi :) – lurker

回答

9

全局變量的值由編譯時常量表達式分配,並存儲在程序的數據段中。也就是說,這些變量的空間在物理上分配在EXE文件中,所以當操作系統加載程序時,這些變量將被隱式加載。編譯器可以確保這些變量在運行時沒有執行任何代碼的情況下被初始化。它只是將它們的初始值存儲在EXE文件中。

另一方面,局部變量直到運行時纔會存在。在EXE中沒有物理空間,總是引用這些變量。爲了初始化它們,編譯器將不得不生成代碼來爲它們賦值。

全局變量可以初始化,因爲它是在早期的編譯器來實現技術上容易的事情,它本質上是在運行時免費功能,不需要由CPU的任何指​​令的執行。

如果你想初始化局部變量,你可以自由地編寫代碼;該代碼可以完全執行任何編譯器插入的代碼。

+1

非常教學:) – PSyLoCKe

+0

你錯過了一點。全局變量只有一個實例,但可能有一百萬個局部變量的實例。 –

+0

然而,對於鍵入'const'的情況並非如此 - 使狀態完全子例程相當怪異的方式:-D –

3

Niklaus Wirth是一位計算機科學家,負責研究和教授語言和編譯器的設計。當他設計Pascal語言和編譯器時,他的一些設計目標是使編譯器小巧快速高效,並且對任務進行分區,以便編譯器執行對編譯器來說很容易的事情,程序員做的事情很容易程序員。

爲了符合這些目標,他設計了一個單通道編譯器,它只需讀取一次源代碼,並在第一次通過時瞭解所有內容。他還用一個非常簡單的狀態機設計了一個編譯器:一切都按順序完成,按正確的順序,只按正確的順序。通過這樣做,與C編譯器相比,他非常容易獲得一個非常小巧,快速,高效和正確的編譯器,而C編譯器是非常困難,不正確和低效的編譯器,而FORTRAN編譯器又慢又大。

在程序開始時執行一次靜態常量分配是這些設計決策之一,它允許您編寫小型,快速,高效且正確的編譯器。幾十年前,Borland編寫了一個體積小,速度快,效率高,正確的Pascal編譯器,並且成功地從其他公司(如MS)獲得更昂貴的產品,允許無序聲明和其他通用的以及使編譯器變得更加緩慢和困難的有用選項,但是使編程更容易。

換句話說,MS選擇不同於Borland/Wirth的編譯器和用戶之間的任務劃分。

MS Pascal編譯器在很久以前就被丟棄了。但Borland編譯器繼續作爲Delphi。

計算機現在比以前要快很多,但編寫小型,快速,高效,正確的編譯器的任務仍然相同。新功能不是免費的。增加編譯的複雜性需要付出代價。即使是一個簡單的功能,如果必須從一開始就將其作爲一個例外添加到整個編譯器和語言的設計中,那麼這個功能也很麻煩。

+0

非常好! Thanks3 – PSyLoCKe