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

时间:2013-06-25 16:15:53

标签: delphi

在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 }

我希望Embarcadero的一些用户可以回答这个问题。 : - )

2 个答案:

答案 0 :(得分:9)

全局变量的值是从编译时常量表达式赋值的,它们存储在程序的数据段中。也就是说,这些变量的空间在物理上分配在EXE文件中,因此当OS加载程序时,这些变量会被隐式加载。编译器可以确保初始化这些变量,而无需在运行时执行任何代码。它只是将它们的初始值存储在EXE文件中。

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

全局变量可以初始化,因为它在早期编译器中实现技术上很容易,并且在运行时它本质上是一个 free 功能,不需要CPU执行任何指令。

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

答案 1 :(得分:3)

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

为了实现这些目标,他设计了一个单通道编译器,只需要读取一次源代码,并在第一时间理解所有内容。他还设计了一个带有一个非常简单的状态机的编译器:一切都按顺序完成,顺序正确,只有正确的顺序。

通过这样做,他能够轻松地获得一个非常小,快速,高效和正确的编译器,与C编译器相比,这是非常困难,不正确和低效的编译器,以及FORTRAN编译器,它们很慢而且很大。

在程序开始时执行一次静态常量分配是这些设计决策之一,它允许您编写一个小型,快速,高效,正确的编译器。

几十年前,Borland写了一个小巧,快速,高效和正确的Pascal编译器,它再次成功地竞争了其他公司(如MS)的更昂贵的产品,这些产品允许无序声明和其他通常有用的有用的选项使编译器更加缓慢和困难,但使编程更容易。

换句话说,MS选择以不同于Borland / Wirth的方式对编译器和用户之间的任务进行分区。

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

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