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

时间:2010-08-10 13:46:23

标签: .net language-agnostic types strong-typing

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

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

现在我想知道:“类型”的意思是什么??在某种程度上,我们可以观看&触摸。

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

非常感谢您的回复。

添加-1

来自MSDN的一些引文:

  

Marshaling简单,快乐   跨越的结构   管理/非管理边界首先   需要每个的托管版本   原生结构被定义。这些   结构可以有任何合法的名称;   之间没有任何关系   这两者的原生和托管版本   结构以外的结构   布局。因此,至关重要的是   托管版本包含字段   大小相同,相同   订购本机版本。 (有   没有确保的机制   托管和本机版本   结构是等价的,所以   不兼容性不会成为   表明直到运行时间。它是   程序员有责任确保   两个结构有相同的   数据布局。)

就编组而言,布局很重要。

10 个答案:

答案 0 :(得分:15)

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

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

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

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

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

答案 1 :(得分:3)

在许多语言中,物理上这些类型仅在编译时存在。对于较旧的语言尤其如此。我猜想在程序运行时,C有这样的类型,在内存中根本不存在

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

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

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

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

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

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

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

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

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