为什么局部变量不能在声明和全局变量分配?

问题描述:

在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

全局变量的值由编译时常量表达式分配,并存储在程序的数据段中。也就是说,这些变量的空间在物理上分配在EXE文件中,所以当操作系统加载程序时,这些变量将被隐式加载。编译器可以确保这些变量在运行时没有执行任何代码的情况下被初始化。它只是将它们的初始值存储在EXE文件中。

另一方面,局部变量直到运行时才会存在。在EXE中没有物理空间,总是引用这些变量。为了初始化它们,编译器将不得不生成代码来为它们赋值。

全局变量可以初始化,因为它是在早期的编译器来实现技术上容易的事情,它本质上是在运行时免费功能,不需要由CPU的任何指​​令的执行。

如果你想初始化局部变量,你可以自由地编写代码;该代码可以完全执行任何编译器插入的代码。

+1

非常教学:) – PSyLoCKe

+0

你错过了一点。全局变量只有一个实例,但可能有一百万个局部变量的实例。 –

+0

然而,对于键入'const'的情况并非如此 - 使状态完全子例程相当怪异的方式:-D –

Niklaus Wirth是一位计算机科学家,负责研究和教授语言和编译器的设计。当他设计Pascal语言和编译器时,他的一些设计目标是使编译器小巧快速高效,并且对任务进行分区,以便编译器执行对编译器来说很容易的事情,程序员做的事情很容易程序员。

为了符合这些目标,他设计了一个单通道编译器,它只需读取一次源代码,并在第一次通过时了解所有内容。他还用一个非常简单的状态机设计了一个编译器:一切都按顺序完成,按正确的顺序,只按正确的顺序。通过这样做,与C编译器相比,他非常容易获得一个非常小巧,快速,高效和正确的编译器,而C编译器是非常困难,不正确和低效的编译器,而FORTRAN编译器又慢又大。

在程序开始时执行一次静态常量分配是这些设计决策之一,它允许您编写小型,快速,高效且正确的编译器。几十年前,Borland编写了一个体积小,速度快,效率高,正确的Pascal编译器,并且成功地从其他公司(如MS)获得更昂贵的产品,允许无序声明和其他通用的以及使编译器变得更加缓慢和困难的有用选项,但是使编程更容易。

换句话说,MS选择不同于Borland/Wirth的编译器和用户之间的任务划分。

MS Pascal编译器在很久以前就被丢弃了。但Borland编译器继续作为Delphi。

计算机现在比以前要快很多,但编写小型,快速,高效,正确的编译器的任务仍然相同。新功能不是免费的。增加编译的复杂性需要付出代价。即使是一个简单的功能,如果必须从一开始就将其作为一个例外添加到整个编译器和语言的设计中,那么这个功能也很麻烦。

+0

非常好! Thanks3 – PSyLoCKe