关于数据类型,编译器,硬件数据表示以及静态与动态类型的混淆

时间:2015-11-28 17:52:29

标签: types compiler-construction dynamic-typing static-typing data-representation

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

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

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

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

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

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

我的理解在哪里出错了,有人可以解释上面给出的论点的静态和动态类型吗?发生了什么事情的大局是什么?

我试图理解这篇文章,所以对书籍或在线资源的引用会很有用:)谢谢。

1 个答案:

答案 0 :(得分:0)

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

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