繁体   English   中英

“类型”在物理上意味着什么?

[英]What does “Type” mean, physically?

我听过很多关于“ 类型系统”,“强类型语言”等等。 目前我正在研究一些.NET COM互操作问题,它解决了“编组”问题。 而AFAIK,marshaling则是关于.NET类型和COM类型之间的转换。

在诸如编程语言的许多场景中,当谈论类型时 ,我们关注逻辑意义。

现在我想知道: “类型”在物理上意味着什么? 在某种程度上,我们可以观看和触摸。

我目前的理解是“类型”只不过是计算实体的内存表示

非常感谢您的回复。

添加-1

来自MSDN的一些引用:

在托管/非托管边界上编组简单的blittable结构首先要求定义每个本机结构的托管版本。 这些结构可以有任何合法的名称; 除了数据布局之外,两个结构的本机版本和托管版本之间没有任何关系。 因此,托管版本包含与本机版本大小相同且顺序相同的字段至关重要。 (没有机制确保结构的托管版本和本机版本是等效的,因此不兼容性在运行时才会变得明显。程序员有责任确保两个结构具有相同的数据布局。)

因此,就Marshaling而言,布局至关重要。

我认为编程中“类型”有三个方面(它们可能重叠,所以不要将其视为一种快速分离):

  • 类型是一组类型的元素,并且每个程序/程序集/单元定义这样的集合。 这是我能想到的最理论化的想法,可能对逻辑学家和数学家最有用。 它非常通用,它允许您在其上定义类型系统的想法。 例如,编程环境可以定义这些类型的关系 ,例如is-assignable-to relation。

  • 类型是语义类别。 这是一种语言或认知的想法; 换句话说,对于正在考虑如何编程计算机的人来说,它是最有用的。 类型封装了我们所认为的“属于某一类别的东西”。 类型可以由实体的共同目的来定义。 当然,这种根据目的的分类是任意的,但这没关系,因为编程中的类型声明也是任意的。

  • 类型是数据如何在内存中布局的规范。 这是我能想到的最低级别的想法。 在这种观点下,一个类型没有说明数据的目的或语义,而只是计算机将如何构建它,处理它等等。在这个想法中, 类型更像是数据编码通信协议

您选择的类型含义取决于您的域名。 正如已经暗示的那样,如果你是一位正在研究如何证明程序属性的逻辑学家,那么第一个定义将比第三个定义更有用,因为数据布局(通常)与证明无关。 如果您是硬件设计人员或CLR或JavaVM等低级系统的程序员,那么您需要第三个想法并且您并不真正关心第一个想法。 但对于那些只想继续完成任务的普通程序员来说,它可能是适用的中间程序员

在许多语言中,物理上这些类型仅在编译时存在。 对于较旧的语言尤其如此。 我猜想,C有这种类型的永远存在于内存中所有,以任何方式 ,在程序运行时。

在其他语言中 - 特别是那些允许运行时类型信息访问的语言(例如带有RTTI的 C ++,或C#,或者像Python这样的任何动态语言) - 类型只是元数据。 类型的二进制描述。 你知道,如果你试图将数据序列化为二进制流,你会得到的东西。

我会说恰恰相反。 它是内存中位和字节的语言表示。

类型是关于位和字节的元数据,它定义了如何以有意义和安全的方式操作它们。

我会说类型可以有多种含义。

我倾向于将其意义作为接口约束。 (编写良好的目标代码将所有内存数据定义为私有)。

在这种情况下,类型绝对与内存中表示无关。 相反,它只是其成员方法的合同。

“类型”是一个集合,其成员(“对象”)具有离散的有限表示和一组有用的共享属性。

对象的实际内存中表示不一定是类型定义的一部分。 也就是说,单个对象可能具有多个内存中表示。 重要的是物体可能不是无限的或模拟的。

类型的共享属性可以是任何东西。 在面向对象的系统中,属性将包括(在较低级别)数据和行为。 事件通知也很常见。 某些属性可能是有条件的而不违反类型定义(如果布尔属性X为真,则属性Y也存在),只要规则在类型中的所有对象中是一致的。

“子类型”是类型的子集,其成员具有更广泛的共享属性集。

这种思考类型的方式与你在问题中提出的方式有很大不同,我相信这种区别很重要。

如果将类型视为内存中表示,那么该表示将被视为该类型的显着特征,并且它将被视为理所当然。 Interop将通过低级转换和现有字节序列的重新解释来实现。 在某些情况下,当表示发生变化时,这可能会导致问题。

但是,如果人们根据其属性看到类型,那么从一个类型系统到另一个类型系统的转换将涉及相应对象之间的数据字段的高级转换。 确定对象是否兼容将基于其显着属性,并且问题变得不太可能。

即使在互操作的世界中,也不应该依赖对类型内部细节的了解。 也就是说,不应该使用不属于该类型定义的类型的实现的特征,就好像它们是该类型的一部分一样。

这取决于您正在使用的编程范例。 在OO类型中,可以表示现实世界对象,换句话说,计算机可以表示的现实世界对象的所有数据(或者您感兴趣的部分)。

IIRC强类型语言在编译时强制执行对象类型,例如,数字必须是int,float等类型。 在弱类型语言中,你可以说giraffe = 1 + frog * $ 100 /'May 1',并且类型在运行时被解析。 而且您通常会遇到很多运行时错误。

在数据交换情况下(如COM,CORBA,RPC等),由于二进制兼容性(big endian,little endian)和格式(如何在从一种语言传递到另一种语言时表示字符串和日期,每种语言都很难实现类型)与不同的编译器?)。 因此,编组尝试解决每个参数的类型。 ASN.1是在机器之间交换数据时构建“通用类型”框架的众多尝试之一。

类型是人类可读的逻辑蓝图,用于表示如何在内存中表示和组织数据。 这是一种允许人类以标准方式将概念如何合理化为数字序列的方式。 机器和编译器真的不关心字符串,整数,fooClass之间的区别。 这些“类型”简单地同意组织单元,所有人类程序员都将逻辑概念转换为内存中的合理数据结构。

类型是捆绑字。 当你知道什么类型的东西时,你就会知道它占用了多少内存,它是如何存储的,但更重要的是你也知道你可以用它做什么。 例如,有几种整数类型占用与指针相同的内存量。 但是,您可以将一个整数类型乘以另一个整数类型(例如,3乘4),但不能将两个指针相乘。 你可以在一些具有Foo方法的用户定义类型(struct或class)上调用Foo()方法,例如编写x.Foo(),但是你不能为不同的用户定义类型执行此操作没有Foo方法。 您可以在某些类型之间进行转换,但不能在其他类型之间转换,或者您可以将A转换为B而不是B转换为A.依此类推。 在某些语言中,也存在区别,例如它是否为常数。

编译器和运行时会携带大量信息,所有这些信息都会增加项目的类型。 它占用多少字节的物理性(或者你可以合理地声称有形的任何其他东西)实际上并不重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM