13.3.5 绑定的时机

正如我们刚刚看到的,操作系统使用多种类型的名字来引用对象。有时在名字和对象之间的映射是固定的,但是有时不是。在后一种情况下,何时将名字与对象绑定可能是很重要的。一般而言,早期绑定(early binding)是简单的,但是不灵活,而晚期绑定(late binding)则比较复杂,但是通常更加灵活。

为了阐明绑定时机的概念,让我们看一看某些现实世界的例子。早期绑定的一个例子是某些高等学校允许父母在婴儿出生时登记入学,并且预付当前的学费。以后当学生长大到18岁时,学费已经全部付清,无论此刻学费有多么高。

在制造业中,预先定购零部件并且维持零部件的库存量是早期绑定。相反,即时制造要求供货商能够立刻提供零部件,不需要事先通知。这就是晚期绑定。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

程序设计语言对于变量通常支持多种绑定时机。编译器将全局变量绑定到特殊的虚拟地址,这是早期绑定的例子。过程的局部变量在过程被调用的时刻(在栈中)分配一个虚拟地址,这是中间绑定。存放在堆中的变量(这些变量由C中的malloc或Java中的new分配)仅仅在它们实际被使用的时候才分配虚拟地址,这便是晚期绑定。

操作系统对大多数数据结构通常使用早期绑定,但是偶尔为了灵活性也使用晚期绑定。内存分配是一个相关的案例。在缺乏地址重定位硬件的机器上,早期的多道程序设计系统不得不在某个内存地址装载一个程序,并且对其重定位以便在此处运行。如果它曾经被交换出去,那么它就必须装回到相同的内存地址,否则就会出错。相反,页式虚拟内存是晚期绑定的一种形式。在页面被访问并且实际装入内存之前,与一个给定的虚拟地址相对应的实际物理地址是不知道的。

晚期绑定的另一个例子是GUI中窗口的放置。在早期图形系统中,程序员必须为屏幕上的所有图像设定绝对屏幕坐标,与此相对照,在现代GUI中,软件使用相对于窗口原点的坐标,但是在窗口被放置在屏幕上之前该坐标是不确定的,并且以后,它甚至是可能改变的。