【问题标题】:What is a unified type system?什么是统一类型系统?
【发布时间】:2017-05-11 16:54:09
【问题描述】:

我读过comparison of C# and Java,名单上的第一件事是“单根(统一)类型系统”。

您能描述一下单根(统一)类型系统的含义吗?

【问题讨论】:

    标签: c# java type-systems


    【解决方案1】:

    C# 有一个统一的类型系统。 所有 C# 类型,包括原始类型,例如 int 和 double,从单个根 object 类型继承。与类对象不同,这些原始类型是值类型。它们不是单独在堆上分配的,而是按值传递的。

    当 C# 值类型(例如原始 int 或用户定义的结构)被放置在参数集合中时,它存储在没有指针的密集数组中。这是可能的,因为 C# 为所需的每个不同参数“大小”进行了自定义参数实例化。这意味着当您实例化 C# List<int> 时,底层数组列表存储密集的 int 数组。

    来源:http://www.pin5i.com/showtopic-24376.html

    Java有几种基本类型(int、long、double、byte 等)- 但是,它们的特殊之处在于它们 不是对象-面向,它们不能使用语言本身来定义。它们是值类型,不是堆分配的,而是按值传递的。

    来源:Comparison of C# and Java - Unified type system(*)

    同时,Java 也有面向对象的原始“包装”类型(Integer、Long、Double、Byte 等),通常称为boxed 类型。这些是通过引用传递的堆分配对象,与上面提到的原始类型并行存在。

    在 Java 的较新版本中,基本类型会在必要时自动装箱为对象类型。这减轻了管理它们的大部分负担,但也可能导致细微的错误(另请参阅auto-boxing)。

    与 C# 相比,在 Java 中,内置的 JDK Collections 框架始终管理对象指针的集合。为了使它们以向后兼容的方式参数化,Java 执行了一种称为类型擦除的技术,其中(在运行时)所有内容都被视为容器内的对象(在编译时执行参数化类型检查)。

    这意味着你不能制作Java List<int>,你只能制作List<Integer>。而且,上面的列表实际上存储了一个指向装箱 Integer 对象的指针数组,它的大小是 C# 版本的两倍,性能也大大降低。对于大多数用例来说,这种大小和性能的差异是无关紧要的。

    在尺寸和性能相关的用例中,有两个选项可用:

    1. 如果您事先知道列表的大小,请使用原生类型数组,例如int[]。本机类型的数组被打包在内存中,因此它们消耗的内存更少,性能更高。
    2. 如果您事先不知道列表的大小,请使用一些包装原生数组的第 3 方列表实现,以便在创建后向其中添加元素(一些示例:TroveColtFastutil, Guava)。

    【讨论】:

    • 我曾经读过一个大学项目,其中一种编程语言使用统一的类型系统,既有原始类型也有对象,但是,原始类型有隐藏的继承,基础对象和原始类型类型,其中隐藏根类型的子类
    • lol,听起来很熟悉,这个项目umlcat怎么了lol
    • @brumScouse:不知道。我失去了链接。我开始在自定义宠物项目中应用我学到的东西。 Java 和 C# 都不仅仅是对象 prog。 lang.,我认为拥有原始类型和统一的类型系统是可以的,它独立于面向对象。
    • System.Int32 类型的堆对象是System.Object 的一个实例,但System.Int32 类型的存储位置既不包含System.Object,也不包含对其的引用。 C# 假装堆对象类型和存储位置类型是同一个东西,但这是一个有点泄漏的抽象,与实际工作的方式不匹配。 ECMA 规范 ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf (I.8.9.7) 明确指出,值类型定义可作为两种不同事物的模板:存储位置类型和堆对象类型。
    【解决方案2】:

    这实际上也不适用于 C#,并非所有类型都派生自对象,就像其中 99.9% 一样。有几个非常奇怪的类型不能变成对象。 唯一官方支持的是指针。 还有 3 个不受支持,例如 TypedReference、RuntimeArgumentHandle 和第三个,它的名字让我无法理解。这 3 种类型与 C++/C 中具有可变长度方法的互操作一起使用。我不会太担心他们。

    【讨论】:

    • 探索这个神话的细节真是令人伤脑筋here你能找出第三种不受支持的类型吗?顺便说一句,在将指针转换为 System.IntPtrSystem.UIntPtr 值类型之前,甚至不支持指针。
    最近更新 更多