在编译时完全类型化检查

Fully Typed Checked at Compile Time

我很难理解这个问题的答案。

给出以下代码:

int: size, size2, j;
float: x;
array[1:30] of int: nums;

对于下面的每个赋值语句,circle can or not 表示它是否可以在编译时进行完全类型检查。假设数组的下标范围被视为其类型的一部分。假设数字溢出不被视为类型错误。

 A. size = size2 + 1; --> Answer: CAN
 B. x = size; --> Answer: CAN
 C. nums[j] = 33; --> Answer: CANNOT
 D. nums[3] = nums[4]; --> Answer: CAN
 E. nums[j] = nums[j+1]--> Answer: CANNOT

现在,编译时错误发生在将程序转换为机器代码时,而 运行 时间错误发生在程序执行期间。我还阅读了以下关于编译与 运行 时间错误的堆栈溢出问题:Runtime vs Compile time。在研究了这两个主题之后,我仍然对如何得出以下答案感到困惑。任何帮助将不胜感激。

我相信问题是询问类型检查器 "can"/"cannot" 是否在编译时捕获逻辑错误。

类型检查器确定 A、D 有效而 B 无效(假设没有隐式转换),因此类型检查器可以确定这三个语句的有效性。

然而,对于 C 和 E,有效性​​取决于 j 的实际值(例如,它们在 j == 1 时有效,在 j == 100 时无效)。所以类型检查器无法确定 C 和 E 是否有效(因为 "an array's subscript range is considered part of its type")。


请注意,这些答案是基于类型检查器无法确定/不关心 j 的取值范围的假设。 Ada and Pascal 等一些语言支持 "range" 类型,因此这些类型检查器原则上可以静态检查 C(要求 j 具有类型 int range 1:30)和 E(要求 j 具有类型 int range 1:29) 是有效的。