《编程原本 》一1.3 对象

1.3 对象

一个存储(memory)就是一集存储字(word),其中每个字有一个地址(address)和一项内容(content).地址是一种固定大小的值,这个大小称为地址长度.而内容是另一固定大小的值,其长度称为字长.通过装载(load)操作可以取得一个地址的内容.通过保存(store)操作改变一个地址所关联的内容.存储的实例如计算机主存里的一组字节,或磁盘驱动器里的一组区块.
一个对象(object)就是一个具体实体的表示,并且是作为某个存储里一个值.对象有状态(state),其状态就是某个值类型的一个值.对象的状态可以改变.对于给定的与某个具体实体对应的一个对象,其状态对应于该实体的一个快照.一个对象拥有一集资源(resource),用于保存其状态,如一些存储字或者文件里的一些记录.
即使某对象的值是一个连续的0/1序列,保存这些0/1的资源也可以不是连续的.相应的解释能给出这个对象的整体.看一个例子:两个double 可以解释为一个复数,为此并不要求它们紧邻存放.一个对象的资源也完全可以位于不同的存储里.但是本书只处理位于一个具有统一地址空间的存储里的对象,这里的每个对象有一个唯一的起始地址(startingaddress),从它出发可以找到该对象的所有资源.
一个对象类型(objecttype)是一种在存储中保存和修改值的模式.与每个对象类型相对应的有一个描述该类型对象的状态的值类型.每个对象属于某一个对象类型.作为对象类型的例子,请考虑按32位模二补码方式,采用小尾格式和4字节边界对齐表示的整数.
值和对象扮演着互补的角色.值不会改变,与在计算机里的特定实现方式
1.3 对象
无关.对象可以改变,具有与具体计算相关的实现方式.在任何一个时间点,一个对象的状态都可以描述为一个值.原则上说,这个值可以写在纸上(做出一个快照)或者序列化(serialize)后通过通信链路传输.用值的方式描述对象的状态,在讨论相等性时就可以抽象掉对象的具体实现方式.函数式程序设计处理的是值;而命令式程序设计处理的是对象.
我们用值来表示实体.因为值是不变的,它们可以表示抽象实体.也可以用值的序列来表示某具体实体的一些快照的序列.对象保存着代表实体的值.由于对象可以变化,因此可以用于表示具体实体,并通过令其不断取得新值的方式表示该实体的变化.也可用对象表示抽象实体,这时它们将保持不变,或者取相应抽象实体的一些不同近似值.
在计算机里使用对象,有如下三个原因.
1.对象能模拟可以改变的具体实体,例如工资系统里的雇员记录.

2.对象为实现值上的函数提供了强有力的支持,例如写一个用迭代算法实现浮点数平方根的过程.

  1. 带存储的计算机是目前唯一可用的通用计算设备.

值类型的某些性质也可用于对象类型.一个对象是良形式的(well-formed),当且仅当其状态是良形式的.一个对象类型是真部分的(properlypartial),当且仅当其值类型是真部分的;否则它就是全的(total).一个对象类型是唯一表示的(uniquelyrepresented),当且仅当其值类型是唯一表示的.
由于具体实体有标识,表示它们的对象也要有与之对应的概念.一个标识符号(identitytoken)是一个唯一值,它表示相应对象的标识,可以从相应对象的值及其资源的地址计算出来.标识符号的例子如对象的地址,或者到保存着该对象的数组里的下标,或者人事记录里的雇员编号.对标识符号的相等检查对应于实体标识的相等检查.在应用系统运行期间,一个特定对象有可能在一个数据结构里移动,也可能从一个数据结构移动到另一个,这种移动有可能改变对象的标识符号.
同样类型的两个对象相等(equality),当且仅当它们的状态相等.如果两个对象相等,我们就说其中的一个是另一个的拷贝(copy).修改一个对象并不会对它的任何拷贝产生影响.
本书将使用一种编程语言,在该语言里不能脱离对象和对象类型去描述值和值类型.由于这种情况,从现在开始,只要提到类型时没加修饰词,那么就是指对象类型.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编程原本》提供了有关编程的一种与众不同的理解。其主旨是,实际的编程也应像其他科学和工程领域一样基于坚实的数学基础。本书展示了在实际编程语言(如C++)中实现的算法如何在最一般的数学背景中操作。例如,如何定义快速求幂算法,使之能使用任何可交换运算。使用抽象算法将能得到更高效、可靠、安全和经济的软件。 这不是一本很容易读的书,它也不是能提升你的编程技能的秘诀和技巧汇编。本书的价值是更根本性的,其终极目标是提升你对编程的洞察力。要想从中大获裨益,你需要从头到尾认真学习:阅读代码,证明引理,完成练习。到结束之时,你将看到如何把这里讨论的演绎方法应用到你的程序中,保证你做出的软件部件能一起工作,并表现出它们所应该表现的行为。 书中给出的算法和需求针对某些被操作的类型。有关这些描述的代码(也可以通过Web得到)采用C++的一个小子集书写,这样做是为了让所有有经验的程序员都能理解。这个小子集可以看做一种特殊语言,是由Sean Parent和Bjarne Stroustrup一起设计的。 无论你是一位软件开发者,还是其他以编程作为一项重要活动的专业人员,或者是一名在校的学生,你都会逐渐理解本书的经验丰富的作者多年来一直在教授和阐释的道理:数学对于编程是绝好的东西,理论对于实际是绝好的东西。
本书将演绎方法应用于程序设计,讨论程序与保证它们能正确工作的抽象数学理论之间的联系。书中把理论的规程、基于这些理论写出的算法,以及描述算法性质的引理和定理一起呈现给读者。 第1章 基础 1 1.1 理念范畴:实体,类别,类属 1 1.2 值 2 1.3 对象 4 1.4 过程 6 1.5 规范类型 7 1.6 规范过程 8 1.7 概念 10 1.8 总结 14 第2章 变换及其轨道 15 2.1 变换 15 2.2 轨道 18 2.3 碰撞点 21 2.4 轨道规模的度量 27 2.5 动作 28 2.6 总结 29 第3章 可结合运算 31 3.1 可结合性 31 3.2 计算乘幂 32 3.3 程序变换 35 3.4 处理特殊情况的过程 40 3.5 参数化算法 43 3.6 线性递归 44 3.7 累积过程 47 3.8 总结 48 第4章 线性序 49 4.1 关系的分类 49 4.2 全序和弱序 51 4.3 按序选取 52 4.4 自然全序 62 4.5 派生过程组 63 4.6 按序选取过程的扩展 63 4.7 总结 64 第5章 有序代数结构 65 5.1 基本代数结构 65 5.2 有序代数结构 70 5.3 求余 72 5.4 最大公因子 76 5.5 广义gcd 79 5.6 Steingcd 81 5.7 商 82 5.8 负量的商和余数 84 5.9 概念及其模型 87 5.10 计算机整数类型 88 5.11 结论 89 第6章 迭代器 91 6.1 可读性 91 6.2 迭代器 92 6.3 范围 94 6.4 可读范围 97 6.5 递增的范围 106 6.6 前向迭代器 108 6.7 索引迭代器 113 6.8 双向迭代器 114 6.9 随机访问迭代器 115 6.10 总结 117 第7章 坐标结构 119 7.1 二叉坐标 119 7.2 双向二叉坐标 123 7.3 坐标结构 129 7.4 同构,等价和有序 129 7.5 总结 137 第8章 后继可变的坐标 139 8.1 链接迭代器 139 8.2 链接重整 140 8.3 链接重整的应用 147 8.4 链接的二叉坐标 151 8.5 结论 155 第9章 拷贝 157 9.1 可写性 157 9.2 基于位置的拷贝 159 9.3 基于谓词的拷贝 166 9.4 范围的交换 174 9.5 总结 178 第10章 重整 179 10.1 置换 179 10.2 重整 182 10.3 反转算法 184 10.4 轮换算法 188 10.5 算法选择 196 10.6 总结 200 第11章 划分和归并 201 11.1 划分 201 11.2 平衡的归约 207 11.3 归并 212 11.4 总结 218 第12章 复合对象 219 12.1 简单复合对象 219 12.2 动态序列 227 12.3 基础类型 233 12.4 总结 236 跋 237 附录 A 数学表示 241 附录B 程序设计语言 243 参考文献 253 索引 257
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值