- 自己动手构建编程语言:如何设计编译器、解释器和DSL
- (美)克林顿·L.杰弗瑞
- 1001字
- 2024-05-11 19:45:02
2.3.2 复合类型
复合类型(composite type)是帮助使用者以协同的方式分配和访问多个值的类型。语言对复合类型的语法支持程度有很大差异,有些只支持数组和结构体,并要求程序员在它们之上构建自己的所有数据结构。许多语言通过库提供所有高级复合类型。然而,有些高级语言提供了许多复杂的数据结构作为内置的语法支持。
最常见的复合类型是数组(array)类型,通过它可以访问多个使用整数索引的数字连续范围的值。你所设计的编程语言中可能有些类型也像数组。你的主要设计考虑应该是索引如何指定,以及如何处理组合值大小的变化?大多数流行的编程语言使用从零开始的索引。从零开始的数组索引简化了索引计算,对于语言发明家来说更容易实现,但它们对初级程序员不够直观。有些语言使用从1开始的索引,或允许程序员指定从非0的任意整数开始的索引范围。
关于大小的变化,一些编程语言不允许更改其数组类型的大小,而一些编程语言让程序员跳过障碍,在现有数组的基础上建立不同大小的新数组。其他语言的设计使往数组中添加值成为一种廉价且简单的操作。没有一种设计适合所有应用程序,因此设计者只需选择某一种设计并承担相应的后果,可以设计支持用于不同目的的多个类似数组的数据类型,或者设计一种非常聪明的类型,以很好地覆盖一系列常见应用。
除了数组以外,我们还应该思考需要哪些复合类型。几乎所有的语言都支持记录、结构体或类类型,这些类型用于将几种不同类型的值组合在一起,从而通过名为字段的名称来加以访问。在这方面做得越精细,编程语言实现就越复杂。如果编程语言中需要适当的面向对象设计,就得在编写编译器和运行时代码上花费更多时间。作为一名设计者,我的提醒是设计要保持简单;但作为一名程序员,我不想使用一个没有以某种形式赋予我所需能力的编程语言。
你可能还会想到其他几种对编程语言至关重要的复合类型,这非常好,特别是如果它们要在我们关心的程序中大量使用的话。这里将讨论另一种具有很大实用价值的复合类型:(hash)表数据类型,通常也称为字典类型。表类型介于数组和记录类型之间。我们使用名称来对值进行索引,这些名称是不固定的,程序运行时可以计算新名称。任何省略这种类型的现代编程语言都只会把许多潜在用户排除在外。为此,你的编程语言可能希望包含表类型。复合类型是用于组装复杂数据结构的万能“胶水”,但还是应该考虑某些专用类型(原子类型或复合类型)是否属于我们的编程语言,以支持难以用通用编程语言编写的应用程序。