【问题标题】:Static types and conversions静态类型和转换
【发布时间】:2017-01-29 21:01:35
【问题描述】:

假设我有一种类似算法的语言,具有静态类型和以下代码:

a := b + c * d;

其中a 是浮点数,b 整数,c 双精度和d 长整数。然后,该语言会将d 转换为long 以使用c 进行操作,并将b 转换为double 以使用c*d 结果进行操作。因此,在那之后,b+c*d 的 double 结果将被转换为 float 以将结果分配给a。但是,当它发生时?我的意思是,所有转换都发生在运行时还是编译时?

如果我有:

int x; //READ FROM USER KEYBOARD.
if (x > 5) {
    a:= b + c * d;
}
else {
    a := b + c;
}

上面的代码有条件。如果编译器在编译时转换它,某些部分可能永远不会运行。这是正确的吗?

【问题讨论】:

    标签: programming-languages language-theory algol algol68


    【解决方案1】:

    你不能在编译时进行转换,就像你不能在编译时进行加法一样(除非编译器可以确定变量的值,可能是因为它实际上是常量)。

    编译器可以(并且确实)发出带有指令的程序,这些指令将变量的值相加和相乘。如果有必要,它还会发出指令,在计算之前将存储值的类型转换为不同的类型。

    在编译时没有固定变量类型的语言必须在运行时执行检查并有条件地将值转换为不同的类型。但我认为“类 Algol”一般类别中包含的任何语言都不是这种情况。

    【讨论】:

    • 但是编译器知道变量类型,变量中的值重要吗?
    • @TomiSebastiánJuárez:编译器可以发出执行转换的代码,因为它知道变量类型是什么。但它不能进行转换,除非它也知道变量中的值。它与a+a 没有什么不同。如果编译器知道a 中的值是2,它可以进行加法并将表达式替换为4。否则,它所能做的就是发出代码来做加法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2012-07-11
    相关资源
    最近更新 更多