哪些高级/安全语言具有未装箱的复合类型?

时间:2016-09-19 10:04:07

标签: generics programming-languages boxing

大多数语言都有某种复合类型,例如:结构或类。在大多数情况下,在更高级语言中,这些语言被实现为指向包含复合数据的单独分配的内存块的指针。假设我们有一个类型Foo:

struct Foo {
    int bar;
    float baz;
}

在C中,如果我们创建一个Foos数组,则数组本身将在单个内存块中连续包含bar和baz值。如果我们定义另一个包含Foo的结构,那么它的bar和baz也将直接嵌入到包含的结构中。

在Java或Python等许多高级语言中,如果我们要创建一个Foos数组或列表(必须是类或其他东西),底层内存块将包含指向单独分配的实例的指针。 FOOS。

对于涉及大型数据集的一些使用模式,与直接嵌入相比,这可能是一个巨大的开销。存在内存开销,因为每个单独分配的对象通常都有一个头,并且有自己的指针。然后由于额外的高速缓存行未命中以及数据的更加糟糕的位置而存在大的速度成本,这可能超过一百倍。

大多数(或所有)低级/系统编程语言允许这种嵌入而不装箱,但大多数是不安全的(即需要手动内存管理并且具有未定义的行为)。大多数高级语言都需要拳击。

对于大型数据集处理任务,我想使用一种不需要装箱复合数据类型的语言,但没有低级系统语言的程序员时间开销。到目前为止,我只知道C#/ .NET,并且在某种程度上Go可以做到这一点,但它们有其自身的局限性。还有其他选择吗?

我所知道的:

无盒装复合材料&安全

  • C#具有上述行为并且安全的结构。如果他们选择,.NET上的任何语言都可以有未装箱的复合材料,我希望F#也有未装箱的复合材料,但我不知道细节。这与泛型很好地结合,因此在定义包含类型时,您不需要知道要嵌入的东西的类型。
  • Go可能有未装箱的嵌入式结构,但我不确定细节。接口始终是盒装的,因此,由于没有泛型,它只有在您知道要嵌入的结构的确切类型时才有效。
  • Rust是一个边缘案例,它是一种低级系统语言,具有未装箱的复合材料,但它是安全的。内存管理是部分自动的,部分是手动的,但你需要向编译器显示你正在做的是正确的,所以不会有内存错误。

不安全:

  • 低级语言(如C,C ++,汇编程序等)都具有未装箱的复合材料,但需要手动内存管理并且具有未定义的行为。
  • D也是边缘情况。核心语言包含不安全的功能,但有一个明确可以选择加入的安全子集,但是你无法在安全的D中编写完整的程序。

需要拳击:

  • Python,Ruby,PHP,一般的大多数脚本语言。
  • Java和JVM语言。在JVM上,唯一的组合功能是始终装箱的类和数组。虽然有一个project可以改变它。
  • OCaml仅具有未装箱的整数和类型,在内存级别上表示为整数。其他任何东西都装箱了,不过浮标有一些例外。 (这让我感到很惊讶,因为OCaml被称为一种非常快速的编译语言。)
  • Haskell,虽然有未装箱的类型作为有限的特殊情况。

(许多这些拳击语言都有允许使用未装箱数据的库或扩展,但这通常是一种特殊用途的功能,与其他语言不能很好地融合。)

安全+未装箱的复合材料类别中还有哪些其他语言?

0 个答案:

没有答案