计算机如何跟踪特定内存位置存储的数据类型?

7

我想这并不是严格意义上的“编程”问题,但我已经思考了一段时间。当你创建一个变量并赋值时,计算机会为该变量分配一定数量的字节,并存储该值,但当它在以后使用该变量时,它如何知道该内存地址中存储的数据类型呢?

3个回答

7
答案取决于你所使用的语言是解释型还是编译型,以及其他各种细节。对于像C这样的编译语言,答案是编译器在将代码转换为机器码(或汇编语言)时,具有内部数据结构来说明每个变量的类型、存储位置以及可能的优化信息等。(但是在运行代码时,所有这些信息都已经消失了;它们只是编译代码所需的,而不是运行代码所需的。)
对于一些解释型语言,答案是解释器具有类似的数据结构,每当使用变量时都会查找它。对于其他语言,解释器将所有变量都按相同方式处理,但它们的值附带有类型信息。

6
通常情况下,大多数动态语言都有类似于 typeof 的东西,因此通常会有一个“对象头”存储一些元数据,包括类型(以及其他信息,例如引用计数)。但是你仍然无法在随机的内存块中识别对象的开头(毕竟它们都是 1 和 0),因此你需要始终指向它的指针...
传统的静态/编译语言(通常)不存储这样的信息。毕竟,如果编译器知道 x 是一个 int,它就知道需要加载多少字节到寄存器中,并使用哪些操作码进行加法运算。即使添加虚函数,你仅需要编译一个函数指针表(不需要进一步的元数据 - obj->foo() 转换为“获取 vtable 的第 n 个条目并调用它”,而不是“调用此地址处的代码”)。

4

计算机并不关心数据类型。有些语言可能会给他们的数据打上类型标签(特别是动态语言,在这些语言中,任何变量都可以保存任何数据类型); 在其他语言(如C)中,您需要声明变量,并且编译器知道每当使用与该变量关联的地址空间时将该值视为特定类型。但计算机本身并不在乎这些,它只看到每个字节8个位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接