基本(简单)数据类型的规约 简单数据对象包含单个数据值,这类数据对象称为基本数 据类型。 虽然不同的语言有不同的基本类型集合,但整数、实数、 字符、布尔、枚举、指针等基本都是有的。但各自精确的 规约对不同语言会有差异。 属性 对象的基本属性(如类型和名字)通常在生命期中是不 变的。 有的属性可存放在描述子中,作为数据对象的一部分在 运行时出现 有的属性只用于确定其存储表示,在执行中不显式地出 现。 属性值和数据对象的值是不同的
基本(简单)数据类型的规约 简单数据对象包含单个数据值,这类数据对象称为基本数 据类型。 虽然不同的语言有不同的基本类型集合,但整数、实数、 字符、布尔、枚举、指针等基本都是有的。但各自精确的 规约对不同语言会有差异。 •属性 对象的基本属性(如类型和名字)通常在生命期中是不 变的。 有的属性可存放在描述子中,作为数据对象的一部分在 运行时出现。 有的属性只用于确定其存储表示,在执行中不显式地出 现。 属性值和数据对象的值是不同的
值 数据对象的类型确定了它可包含的可能值集,但在执行 中任一点,只包含一个来自该集合的单值。 基本数据类型定义的值集通常是有序集,有最小值和最 大值。 操作 确定数据对象被处理的方式。操作可能是原操作,也可 是用户定义操作,本章强调语言固有的原操作。 操作是一个数学函数,对一给定输入参数,有定义的、 唯一确定的结果。每个操作有作用域,值域。操作的动 作定义了对给定参数的结果 算法可用于刻划操作的动作,但其他规约也是可以的。 如可用乘法表来刻划乘法的动作
•值 数据对象的类型确定了它可包含的可能值集,但在执行 中任一点,只包含一个来自该集合的单值。 基本数据类型定义的值集通常是有序集,有最小值和最 大值。 •操作 确定数据对象被处理的方式。操作可能是原操作,也可 是用户定义操作,本章强调语言固有的原操作。 操作是一个数学函数,对一给定输入参数,有定义的、 唯一确定的结果。每个操作有作用域,值域。操作的动 作定义了对给定参数的结果。 算法可用于刻划操作的动作,但其他规约也是可以的。 如可用乘法表来刻划乘法的动作
操作的基调( signature)定义了操作的作用域中参 数的数量、顺序和类型,以及结果值域的顺序和类型。 数学记号: OP: typel X type2×. typen→tpe也称为函数原形 操作有单元、二元和多元。 动作的精确规约需要比参数类型更多的信息。 特别地,参数类型的存储表示通常确定那些参数如何 被操作,如:二进制数的乘法和10进制数的乘法有很 大不同 这样,在操作的规约中,常给出动作的非形式的描述 日参数的存储表示确定,动作的精确规约是操作实现 的一部分
操作的基调(signature)——定义了操作的作用域中参 数的数量、顺序和类型,以及结果值域的顺序和类型。 数学记号: OP:type1×type2×…typen→type—也称为函数原形 操作有单元、二元和多元。 动作的精确规约需要比参数类型更多的信息。 特别地,参数类型的存储表示通常确定那些参数如何 被操作,如:二进制数的乘法和10进制数的乘法有很 大不同。 这样,在操作的规约中,常给出动作的非形式的描述。 一旦参数的存储表示确定,动作的精确规约是操作实现 的一部分
有时难于确定操作的精确规约为数学函数,有四个主要 因素。 1、操作对某些输入无定义, 2、隐含的参数—操作会访问其他隐含参数(全局 变量;非局部变量)。 3、副作用(隐含结果)——可能修改其他数据对象 4、自我修改(历史敏感性)——操作修改自己的内 部结构、或是执行中保持的局部数据、或是代码 操作的结果还依赖于历史调用。 例:随机数产生器。 LISP中可自我修改代码
有时难于确定操作的精确规约为数学函数,有四个主要 因素。 1、操作对某些输入无定义。 2、隐含的参数——操作会访问其他隐含参数(全局 变量;非局部变量)。 3、副作用(隐含结果)——可能修改其他数据对象。 4、自我修改(历史敏感性)——操作修改自己的内 部结构、或是执行中保持的局部数据、或是代码。 操作的结果还依赖于历史调用。 例:随机数产生器。 LISP中可自我修改代码
子类型 指一个类型是某大类的一部分(子类型—超类型) 如: PSCAL中的子域机制,O0中的继承机制。 但从理论角度看,子类型有严格定义: 凡是超类型对象可存在的地方(可承受的操作), 子类型对象同样适用,子类型对象继承超类型对象 的行为
•子类型 指一个类型是某大类的一部分(子类型——超类型) 如:PSCAL中的子域机制,OO中的继承机制。 但从理论角度看,子类型有严格定义: 凡是超类型对象可存在的地方(可承受的操作), 子类型对象同样适用,子类型对象继承超类型对象 的行为