Compiler construction 程序设计语言中类型化的含义

Compiler construction 程序设计语言中类型化的含义,compiler-construction,types,casting,theory,Compiler Construction,Types,Casting,Theory,我正在学习一门C课程,下面的话题突然出现在我的脑海中,希望是时候摆脱它了:在编程语言中,类型化的含义是什么 当我问自己,构建类型安全语言的意愿背后的原因/主题是什么时,最终的答案也许是我唯一想到的:在语言中定义类型的能力允许我们对我们在程序中使用的数据强制执行编译时约束,因此,IDE/编译器可以帮助我们防止/检测错误,否则我们可能会错过这些错误,而且可能要等很久才能发现,这当然是一个问题。这些错误包括无效操作、无效成员访问等 如果我在这一点上是正确的,那么我会问:在诸如C这样的语言中,铸造意味着

我正在学习一门C课程,下面的话题突然出现在我的脑海中,希望是时候摆脱它了:在编程语言中,类型化的含义是什么

当我问自己,构建类型安全语言的意愿背后的原因/主题是什么时,最终的答案也许是我唯一想到的:在语言中定义类型的能力允许我们对我们在程序中使用的数据强制执行编译时约束,因此,IDE/编译器可以帮助我们防止/检测错误,否则我们可能会错过这些错误,而且可能要等很久才能发现,这当然是一个问题。这些错误包括无效操作、无效成员访问等

如果我在这一点上是正确的,那么我会问:在诸如C这样的语言中,铸造意味着什么/实际上发生了什么?假设我有一个使用Object类型的参数定义的方法,我将该类型的任何派生传递给它,即任何类型-此时在幕后发生了什么

我倾向于认为,键入还为我提供了在任何给定对象实例中可以访问哪些成员的限制。换句话说,我假设编译器总是查看变量的类型,而不是它接收的实例,以执行/应用其验证规则,然后触发或不触发错误消息。是这样吗?在我下面给出的示例中,由于变量类型是Object,编译器将不允许我访问任何实例成员,除非我对实例的类型执行强制转换。我想在这里澄清的一点是,无论是否执行强制转换,实例过去是并且将始终保留其类型。按照我的理论,cast是必要的,只有这样编译器——一个帮助我们工作的工具——以及我们在构建程序的每一步中都得到的认可——才能接受这段代码是100%可信/安全的

然后我想到了前面提到的应用于多态性的方法,这似乎是有意义的:一个更一般的类型持有一个更特殊类型的实例不会导致编译器错误,因为访问一个没有在更一般的类型中定义的实例成员没有风险,因为更专业的一个继承了它们,不管是否覆盖它们,甚至隐藏它们。另一方面,当类型比实例更专业化时,就会出现问题,因为程序员很可能会错误地访问实例中不存在的专业成员

最后一点,我想每个实例都分配一块内存,我想知道是否一定是连续的——在大小上,它的每个类型成员的内存需求加上更多的元数据/头信息的总和,不管怎样,每个成员定义都会生成一个特定的内存地址,在访问一个实例以访问任何给定的成员(无论是变量、方法等)时使用

上述任何假设都是错误的吗?
或者我应该问一下。。。他们中有谁是对的吗

您的答案显示了对我们在编程语言中使用类型的原因的良好理解。

您的答案显示了对我们在编程语言中使用类型的原因的良好理解。

您可能感兴趣;特别是,关于动态类型和静态类型的部分与您的问题非常相关。谢谢,我实际上认为这一讨论是在我阅读之后开始形成的,但我肯定没有彻底阅读,或者至少没有阅读您提到的所有部分。我会看一看。你可能会感兴趣;特别是,关于动态类型和静态类型的部分与您的问题非常相关。谢谢,我实际上认为这一讨论是在我阅读之后开始形成的,但我肯定没有彻底阅读,或者至少没有阅读您提到的所有部分。我来看看。