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 }

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

4

2 回答 2

9

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

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

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

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

于 2013-06-25T16:48:03.220 回答
3

Niklaus Wirth 是一名计算机科学家,研究和教授语言和编译器的设计。当他设计 Pascal 语言和编译器时,他的一些设计目标是让编译器变得小而快速高效,并划分任务以便编译器做编译器容易做的事情,程序员做容易做的事情程序员。

根据这些目标,他设计了一个 Single-Pass 编译器,只需阅读一次源代码,第一次就能理解所有内容。他还设计了一个带有非常简单的状态机的编译器:一切都是按顺序完成的,以正确的顺序,只有正确的顺序。

通过这样做,他能够轻松地获得一个非常小、快速、高效和正确的编译器,而 C 编译器是出了名的困难、错误和低效,而 FORTRAN 编译器又慢又大。

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

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

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

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

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

于 2013-07-04T04:28:51.903 回答