2

我试图理解静态与动态类型,但我真的很难看到所有东西是如何组合在一起的。

这一切都始于数据类型。据我了解,数据类型是非常抽象的概念,它们存在于编译器中,以便对数据进行分类,以便可以验证对各种类型数据的操作(即试图阻止您将字符串添加到整数),并且为了生成正确的机器代码用于硬件解释值。即说我们有以下内容:

int myInt = 5;
char myChar = '5';

Console.WriteLine(myInt);
Console.WriteLine(myChar);

两者最终都会将 5 写入控制台窗口,但是,由于整数和字符在内存中的表示不同,机器代码解释绑定到变量 的内存位置中的值myInt,它获取该值并将其显示在控制台窗口,与myChar. 即使Console.WriteLine()“做同样的工作”,五个的不同表示需要不同的低级代码。

所以我的问题是:如果数据类型“只存在于编译器中”——即,一旦程序被编译成机器代码,就不知道特定内存单元中的值是什么类型的数据(一切都只是 1s 和0s) - 那么如何在运行时进行任何类型检查呢?运行时肯定没有数据类型的概念吗?那么动态类型肯定与运行时发生的类型检查无关吗?

我的理解哪里出了问题,有人可以就上面给出的论点解释静态和动态类型吗?正在发生的事情的总体情况是什么?

我试图在一篇文章中理解这一点,所以参考书籍或在线资源会很有用:) 谢谢。

4

1 回答 1

0

当一种语言在运行时需要类型信息时,实现需要以存储此类信息的方式简单地表示值(或至少是那些需要类型信息的值)。例如,面向对象语言中的对象通常只包含一个存储有关其类的信息的字段。

¹ 这不仅是动态类型语言的情况,还有大部分是静态类型的语言,但允许在运行时查询类型信息(如Java 和 C# 中的instanceof/isgetClass/ GetType)或在运行时可能失败的强制转换(如 OO 中的向下强制转换)语言)。

于 2015-11-28T19:56:03.817 回答