编译器递归测试
编译器递归测试,是一種由计算机科学家高德纳提出,用來评价ALGOL 60编程语言实现的手段。该测试的目的是识别出能够正确实现“递归和非本地引用”的编译器。
(目前只有少数的ALGOL 60解释器能够正确处理递归和非本地引用,所以我认为設計一段小程序去测试编译器的递归功能是有价值的。因此我写了這段简单的代码,以便区分“年幼的”编译器和“成熟的”编译器。) Knuth的例子begin
real procedure A (k, x1, x2, x3, x4, x5);
value k; integer k;
begin
real procedure B;
begin k:= k - 1;
B:= A := A (k, B, x1, x2, x3, x4);
end;
if k <= 0 then A:= x4 + x5 else B;
end;
outreal (A (10, 1, -1, -1, 1, 0));
end;
这将形成一棵由B调用帧组成的调用树,包含了每一B调用帧和嵌套的A调用帧,每一帧均含有相应B调用产生时的k值副本。试图在纸上演算出最后结果可能是徒劳的,在原文中高德纳推测答案是-121,但正确的结果是-67, 附录里有一篇由查尔斯H林赛审校的论文,其中包含一个带有不同初始值的表格。 对于较大的[來源請求]k[來源請求]值,即使是现代计算机也会很快用完所有堆栈空间。
说明在这个程序中,有三个ALGOL特性是编译器中比较难正确实现的:
所有这些都不是该测试的主要意义,他们仅仅是测试的先决条件。该测试的真正意义在于能否将对B函数的另一个引用定位到正确的B的实例上去——另一个同样能够同样访问到本地的A的引用。一个所谓的“男孩”编译器,(可能)会使得B总是访问最顶层的A调用帧。 参见外部链接
参考文献(略)
|
Portal di Ensiklopedia Dunia