Types 关于数据类型、编译器、硬件数据表示和静态与动态类型的混淆

Types 关于数据类型、编译器、硬件数据表示和静态与动态类型的混淆,types,compiler-construction,dynamic-typing,static-typing,data-representation,Types,Compiler Construction,Dynamic Typing,Static Typing,Data Representation,我试图理解静态和动态类型,但我真的很难看到所有东西是如何结合在一起的 这一切都是从数据类型开始的。据我所知,数据类型是非常抽象的概念,“在”编译器中存在,以便对数据进行分类,从而验证对各种类型数据的操作(即,试图阻止您将字符串添加到整数中),并为值的硬件解释生成正确的机器代码。即,假设我们有以下内容: int myInt = 5; char myChar = '5'; Console.WriteLine(myInt); Console.WriteLine(myChar); 两者最终都会向控制

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

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

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

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

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

我的理解哪里出了问题,有人能解释一下关于上述论点的静态和动态类型吗?正在发生的事情的大局是什么


我试图通过一篇文章来理解这一点,因此参考书籍或在线资源会很有用:)谢谢。

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


这不仅在动态类型语言中是如此,而且在大多数静态类型语言中也允许在运行时查询类型信息(例如Java和C#中的
instanceof
/
is
getClass
/
GetType
)或可能在运行时失败的强制转换(就像OO语言中的降级).

事实上,编译器会留下关于什么是“类型”的线索。请注意,处理器知道整数和“浮点”数。编译后的输出通常是对不同子例程的调用,这些子例程知道如何检查和处理不同的类型。动态类型变量是一种“结构”,它保存了不同类型的变量数据当前存储在其中,“运行时系统”使用它来确定如何处理它们。