【问题标题】:Fully Typed Checked at Compile Time在编译时检查完全类型
【发布时间】:2016-05-04 15:57:51
【问题描述】:

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

给出以下代码:

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

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

 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。在研究了这两个主题之后,我仍然对如何得出以下答案感到困惑。任何帮助将不胜感激。

【问题讨论】:

    标签: compiler-errors runtime-error typechecking


    【解决方案1】:

    我相信问题是询问类型检查器是否“可以”/“不能”在编译时捕获逻辑错误。

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

    但是,对于 C 和 E,其有效性取决于 j 的实际值(例如,它们在 j == 1 时有效,在 j == 100 时无效)。所以类型检查器不能确定 C 和 E 是否有效(因为“数组的下标范围被认为是其类型的一部分”)。


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

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 2011-02-06
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      相关资源
      最近更新 更多