自己动手构建编程语言:如何设计编译器、解释器和DSL
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3.1 原子类型

原子类型(automic type)通常内置且不可改变。我们一般不会修改现有值,只会使用运算符创建新值。几乎所有语言都有内置的数字类型和一些附加类型,布尔型、空类型和字符串类型是常见的原子类型,也有其他类型。

原子类型的复杂程度由我们自己决定:对整数和实数各需要多少不同的机器表示?有些语言可能对所有数字类型只提供单一类型表示,而其他语言可能为整数提供5或10(或更多)种类型表示,而为实数提供其他几种类型表示。添加的类型表示越多,我们给使用自己编程语言的程序员的灵活性和控制力就越大,但后续的任务实现会更加困难。

同样,不可能设计某一种单字符串类型,使其能够适用于所有经常使用字符串的应用程序。但是编程语言到底要支持多少种字符串类型?一个极端情况是根本不设字符串类型,只有一个短整数类型,用于保存字符。这样的编程语言将字符串视为复合类型的一部分。也许字符串只由库支持,而不由语言支持。字符串可以是数组或对象,但即使这样的语言通常也有一些特殊的词法规则,允许字符串常量值以某种用双引号引起来的字符序列给出。另一个极端的情况是,考虑到字符串在许多应用程序域中的重要性,你可能希望编程语言为各种字符集(ASCII、UTF8等)提供多种字符串类型支持,这些字符集带有辅助类型(字符集)和特殊类型,以及支持分析和构造字符串的控制结构。许多流行语言将字符串视为特殊的原子类型。

如果你特别聪明,那么你可能会决定只支持集中内置数字和字符串类型,但要使这些类型尽可能灵活。在这些经典内置类型以及可能包含的许多其他数据类型中使用多少种数据类型上,现有的流行编程语言有很大差异。一旦超越整数、实数和字符串,唯一通用的类型就是容器类型,它允许对数据结构进行组装。

对于原子类型,必须考虑以下几个方面的问题:

❑它们有多少值?

❑如何在源代码中将所有这些值编码为字面常量?

❑哪些类型的运算符或内置函数使用操作数或参数?

上述第一个问题将告诉我们该类型在内存中需要多少个字节。第二个和第三个问题与确定语言中的单词和标点符号的规则问题有关。第三个问题可以让我们了解,在代码生成器或运行时系统方面,需要多少努力才能在编程语言中实现对该类型的支持。原子类型的实现可能更费力,也可能更省力,但它们很少像复合类型那样复杂。我们接下来将讨论这些问题。