程序如何知道变量的类型?

时间:2016-01-04 15:12:12

标签: types

这个问题可能已经回答过了,但是我已经搜索了这些论坛和谷歌但是我不认为我以最简洁的方式问了正确的事情所以我道歉但我会尝试进一步解释我的问题:

例如,假设您有一个变量,我们将其称为x,它指的是一块保存二进制值01000001的内存。我想知道:这个二进制表示的类型信息在哪里?

是否有类似于字典的内存映射系统将二进制表示映射到某些预定义的类型列表,例如0000代表int0001代表char,例如?

我觉得这并非如此,因为这会引入庞大的开销,例如,会引入更多用户定义类型或创建更多变量。但我想这可能是weakly类型语言的情况。 (或者可能不是)但是strongly - 类型语言呢?

2 个答案:

答案 0 :(得分:5)

  

我想知道:这个二进制表示的类型信息在哪里?

没有必要存储它。静态类型程序编译为针对某些存储器位置的指令序列。静态类型检查验证指令是否在保存适当数据的存储器位置上运行。但是,在运行时,可以在不进行任何验证的情况下执行指令。

考虑这个简单的C函数:

void increment(int* x) {
    (*x) += 1;
}

在编译时,编译器将验证指针后面的值是否包含类型int的值。但是,指针本身只是一个数字,因此无论如何都可以进行增量操作。

因此,这个程序是很好的类型,但你失去了上述保证。

void increment(void* x) {
    (*(int*)(x)) += 1;
}

这里的关键观察是低级指令以相同的方式对所有类型的数据进行操作。

答案 1 :(得分:0)

静态确定的类型在运行时是未知的:它们仅在编译期间需要,例如解决重载并检查类型是否与您要运行的操作相匹配,因此编译器在优化时将其删除。

某些语言支持动态确定的类型,例如C ++(仅适用于具有虚方法的类)/ java / C#,还包括python和javascript。这些对象在运行时的类型的信息(即,对象的“真实”类型,而不是保持多态性的变量的类型)用于解析在运行时调用哪个方法。该信息通常存储为指向定义类型的结构的指针。具有多种类型的运行时开销是每个类的恒定内存量。它通常并不重要,但也有一些例外(例如,在Javascript中编写闭包时,您为每个构造的对象创建一个新类型,在某些浏览器中这是非常昂贵的)。在编译期间可能会有很多开销:例如,在C ++模板中会发生很多这种情况。