《JavaScript语言精髓与编程实践》精简版

2020-03-01 58浏览

  • 1.讲述语言的本质及其应用 《JavaScript 语言精髓与编程实践》精简版 周爱民 著
  • 2.免费在线版本 (非印刷免费在线版) 登录China-Pub网站购买此书完整版 了解本书更多信息请登录本书的官方网站 InfoQ 中文站出品 本书由 InfoQ 中文站免费发放,如果您从其他渠道获取本书,请注册 InfoQ 中文站以支持作 者和出版商,并免费下载更多 InfoQ 企业软件开发系列图书。 本书主页为http://infoq.com/cn/minibooks/javascript-practise注:封面图片选自http://www.flickr.com/photos/shannonmary/243076870/,此图片为 CC 授权
  • 3.QCon 全球企业开发大会(QCon Enterprise Software Development Conference)是由 C4Media 媒体集团 InfoQ 网站主办的全球顶级技术盛会,每年在伦敦 和旧金山召开。自 2007 年 3 月份在伦敦召开首次举办以来,已经有包括金融、电信、互 联网、航空航天等领域的近万名架构师、项目经理、团队领导者和高级开发人员参加过 QCon 大会。 2009 年,这一在全球企业开发领域享有盛名的大会将首次来到亚洲,来到北京和东京。 QCon北京大会将在 2009.4.7~4.9 在清华科技园国际会议中心举行。秉承QCon伦敦、 QCon旧金山的高品质特性,QCon北京大会将不仅是一次顶级技术盛宴,还是一次众星云 集的大会! QCon 北京大会将围绕着企业软件开发领域的几大热点主题展开,其中包括:Java、 敏捷、云计算、架构、互联网应用等。大会邀请到了迄今为止、国内软件开发领域最大阵容 的国际讲师团,其中包括,Spring 创始人 Rod Johnson、Agile 领域伟人和 ThoughtWorks 首席科学家 Martin Fowler、全球知名电子商务网站 eBay 的架构师 Randy Shoup、技术 领先公司 Amazon 的云计算负责人 Jeff Bar 等。此外,结合本地实践与案例,大会还邀请 了国内众多知名专家与讲师,其中包括,Google、IBM、西门子、盛大、淘宝网、腾讯、 搜狐、豆瓣等国内公司有多年经验的架构师或技术负责人,以及在技术领域享有盛名的专家 学者。 相关网站: QCon Beijing QCon Global QCon News
  • 4.目录 目录................................................................................................................................................. 1 世界需要一种什么样的语言? 精简版·序 ............................................................................... 3 要有光..................................................................................................................................... 3 语言......................................................................................................................................... 4 分类法..................................................................................................................................... 4 特性与技巧............................................................................................................................. 6 这本书............................................................................................................................................. 8 导读................................................................................................................................................. 9 命令式语言................................................................................................................................... 10 1、命令式语言的发展综论................................................................................................. 10 1、命令式语言与结构化编程..................................................................................... 10 2、结构化的疑难......................................................................................................... 11 3、“面向对象语言”是突破吗?............................................................................... 14 4、更高层次的抽象:接口......................................................................................... 16 5、再论语言的分类..................................................................................................... 17 2、语法及作用域问题......................................................................................................... 19 3、变量作用域及生存周期问题......................................................................................... 22 4、原型继承的基本原理与实质......................................................................................... 24 5、原型继承的问题与继承方式的选择............................................................................. 27 函数式语言................................................................................................................................... 29 1、函数式语言基础............................................................................................................. 29 1、从代码风格说起..................................................................................................... 29 2、为什么常见的语言不赞同连续求值..................................................................... 30 3、函数式语言的渊源................................................................................................. 31 2、函数式语言中的函数..................................................................................................... 32 3、从运算式语言到函数式语言......................................................................................... 33 1、运算式语言............................................................................................................. 33 2、函数在运算式语言中的价值................................................................................. 34 3、重新认识“函数”................................................................................................. 35 4、当运算符等义于某个函数..................................................................................... 36 4、函数式语言..................................................................................................................... 37 动态语言....................................................................................................................................... 39 1、动态语言概要................................................................................................................. 39 1、动态数据类型的起源............................................................................................. 39 2、动态执行系统的起源............................................................................................. 40 3、脚本系统的起源..................................................................................................... 40 4、脚本只是一种表面的表现形式............................................................................. 42 2、动态执行......................................................................................................................... 42 3、重写................................................................................................................................. 44 1
  • 5.4、包装类,以及“一切都是对象”................................................................................. 44 5、关联数组:对象与数组的动态特性............................................................................. 46 6、值运算:类型转换的基础............................................................................................. 47 综述............................................................................................................................................... 49 2
  • 6.世界需要一种什么样的语言? 精简版·序 要有光 我从未停止过对语言的思考。 曾经很长的一段时间里,在临入睡前我的脑海中总会响起一种声音“我解决了语言问题” , 而睡醒时,我仍觉得自己是无知小儿。编程十余年,我写过《Delphi 源代码分析》 ,我从中看 到了一门语言如何从代码变成操作系统中可以运行的程序。我也写过《大道至简——软件工 程实践者的思想》,我在其中说“语言不过是(工程的)细微末节”,而成书之后,我便又投 入了新的、当前你所看的这本书的撰写之中。 语言于我,是一个死结。我一直在寻求尽头,或展望于将来,或求源于过往。我在一道 大河的中间,前后观望,时而俯首所得的,不过是一掬破碎的倒影。 倒影中,还是我的迷惘。 我也在实现着一种语言,我用 JavaScript 来做这件事情。我选择它只是因为熟悉,以及它 足够的表现力。我用它来做面向对象、面向切面、面向接口编程等等的尝试,也用它来模拟 操作系统的调度机制,或构架业务系统的技术框架。在另一些代码中,我也看到过用 JavaScript 代码来模拟 CPU 的指令流水线,或者实现真实的虚拟机……但我认为没有必要向您去解说一 种语言是何等的强大(或者专业、优秀与特异) ,完全没有必要。 因为,它不过是一种语言。一种语言只是一种思想的表现,而不是思想本身。 什么才是决定语言的未来的思想呢?或者我们也可以换个角度来提出这个问题:世界需 要一种什么样的语言? 特性众多、适应性强,就是将来语言的特点吗?我们知道现在的 C#与 JAVA 都在向这条 道路前进。与特定的系统相关,就是语言的出路吗?例如曾经的 VC++,以及它面向不同的平 台的版本。当然,在类似的领域中,还有 C,以及汇编等等…… 我们回顾这样的例举,其实都是在特定环境下的特定语言,所不同的无非是环境的大小。 这其实也是程序员的心病:我们到底选 Windows 平台,还是 Java 平台,或者 Linux 系统,再 或者是……我们总是在不同的厂商及其支持的平台中选择,而最终这种选择又决定了我们所 使用的语言。这与喜好无关,也与语言的好坏无关,不过是一种趋利的选择罢了。所以,也 许你是在使用着的只是一种“并不那么‘好’”,以及并不能令你那么开心地编程的语言。你 越发辛勤地工作,越发地为这些语言摇旗鼓噪,你也就离语言的真相越来越远。 当然,这也不过是一种假设。但是,真相不都是从假设开始的么? 语言有些很纯粹,有些则以混杂著称。如果编程世界只有一种语言,无论它何等复杂, 也必因毫无比较而显得足够纯粹。所以只有在多种语言之间比较,才会有纯粹或混杂这样的 效果:纯粹与混杂总是以一种或多种分类法为背景来描述的。我们了解这些类属概念的标准、 原则,也就回溯到了种种语言的本实:它是什么、怎么样,以及如何工作。这本书,将这些 分类回溯到两种极端的对立:命令式与说明式,动态与静态。我讲述了除开静态语言(一般 3
  • 7.是指类似 C、C++、Delphi 等的强类型、静态、编译型语言)之外的其它三种类型。正是从根 底里具有这三种类型的特性,所以 JavaScript 具有令人相当困扰的混合语言特性。分离它们, 并揭示将它们混沌一物的方法与过程,如历经涅磐。在这一经历中,这本书就是我的所得。 多年以来,我在我所看不见的黑暗与看得见的梦境中追寻着答案。这本书是我最终的结 论,或结论面前的最后一层表象:我们需要从纯化的语言中领悟到我们编程的本质,并以混 杂的语言来创造我们的世界。我看到:局部的、纯化的语言可能带来独特的性质,而从全局 来看,世界是因为混杂而变得有声有色。如果上帝不说“要有光” ,那么我们将不能了解世象 之表;而世象有了表面,便有了混杂的色彩,我们便看不见光之外的一切事物。我们依赖于 光明,而事实是光明遮住了黑暗。 如同你现在正在使用的那一种、两种或更多种语言,阻碍了你看到你的未来。 语言 语言是一种交流的工具,这约定了语言的“工具”本质,以及“交流”的功用。“工具” 的选择只在于“功用”是否能达到,而不在于工具是什么。 在数千年之前,远古祭师手中的神杖就是他们与神交流的工具。祭师让世人相信他们敬 畏的是神,而世人只需要相信那柄神杖。于是,假如祭师不小心丢掉了神杖,就可以堂而皇 之地再做一根。甚至,他们可以随时将旧的换成更新或更旧的神杖,只要他们宣称这是一根 更有利于通神的杖。对此,世人往往做出迷惑的表情,或者欢欣鼓舞的情状。今天,这种表 情或情状一样地出现在大多数程序员的脸上,出现在他们听闻到新计算机语言被创生的时刻。 神杖换了,祭师还是祭师,世人还是会把头叩得山响。祭师掌握了与神交流的方法(如 果真如同他们自己说的那样的话) ,而世人只看见了神杖。 所以,泛义的工具是文明的基础,而确指的工具却是愚人的器物。 计算机语言有很多种分类方法,例如高级语言或者低级语言。其中一种分类方法,就是 “静态语言”和“动态语言”——事物就是如此,如果用一对绝对反义的词来分类,就相当 于概含了事物的全体。当然,按照中国人中庸平和的观点,以及保守人士对未知可能性的假 设,我们还可以设定一种中间态:半动态语言。你当然也可以叫它半静态语言,这个随便你。 所以,我们现在是在讨论一种很泛义的计算机语言工具。至少在眼下,它(在分类概念 中)概含了计算机语言的二分之一。当然,限于我自身的能力,我只能讨论一种确指的工具, 例如 JavaScript。但我希望你由此看到的是计算机编程方法的基础,而不是某种愚人的器物。 JavaScript 的生命力可能足够顽强,我假定它比 C 还顽强,甚至比你我的生命都顽强。但它只 是愚人的器物,因此反过来说:它能不能长久地存在都并不重要,重要的是它能不能作为这 “二分之一的泛义”来供我们讨论。 分类法 新打开一副扑克牌,我们总看到它被整齐的排在那里,从 A 到 K 及大小王。接下来,我 们将它一分为二,然后交叉在一起;再分开,再交叉……但是在重新开局之前,你是否注意 到:在上述过程中,牌局的复杂性其实不是由“分开”这个动作导致的,而是由“交叉”这 个动作导致的。 所以分类法本身并不会导致复杂性。就如同一副新牌只有四套 A~K,我们可以按十三牌 4
  • 8.面来分类,也可以按四种花色来分类。当你从牌盒里把它们拿出来的时候,无论它们是以哪 种方式分类的,这副牌都不混乱。混乱的起因,在于你交叉了这些分类。 同样的道理,如果世界上只有动态、静态两种语言,或者真有半动态语言而你又有明确 的“分类法” ,那么开发人员将会迎来清醒明朗的每一天:我们再也不需要花更多的时间去学 习更多的古怪语言了。 然而,第一个问题便来自于分类本身。因为“非此即彼”的分类必然导致特性的缺失— —如果没有这样“非此即彼”的标准就不可能形成分类,但特性的缺失又正是开发人员所不 能容忍的。 我们一方面吃着碗里,一方面念着锅里。即使锅里漂起来的那片菜叶未见得有碗里的肉 好吃,我们也一定要捞起来尝尝。而且大多数时候,由于我们吃肉吃腻了嘴,因此会觉得那 片菜叶味道其实更好。所以首先是我们的个性,决定了我们做不成绝对的素食者或肉食者。 当然,更有一些人说我们的确需要一个新的东西来使我们更加强健。但不幸的是,大多 数提出这种需求的人,都在寻求纯质银弹 1 或混合毒剂 2 。无论如何,他们要么相信总有一种 事物是完美武器,或者更多的特性放在一起就变成了魔力的来源。 我不偏向两种方法之任一。但是我显然看到了这样的结果,前者是我们在不断地创造并 特化某种特性,后者是我们在不断地混合种种特性。 更进一步地说,前者在产生新的分类法以试图让武器变得完美,后者则通过混淆不同的 分类法,以期望通过突变而产生奇迹。 二者相同之处,都在于需要更多的分类法。 函数式语言就是来源于另外的一种分类法。不过要说明的是,这种分类法是计算机语言 的原力之一。基本上来说,这种分类法在电子计算机的实体出现以前就已经诞生了。这种分 类法的基础是“运算产生结果,还是运算影响结果”。前一种思想产生了函数式语言(如 LISP) 所在的“说明式语言”这一分类,后者则产生了我们现在常见的 C、C++等语言所在的“命令 式语言”这一分类。 然而我们已经说过,人们需要更多的分类的目的,是要么找到类似银弹的完美武器,要 么找到混合毒剂。所以一方面很多人宣称“函数式是语言的未来”,另一方面也有很多人把这 种分类法与其他分类法混在一起,于是变成了我们这本书所要讲述的“动态函数式语言”— —当然,毋庸置疑的是:还会有更多的混合法产生。因为保罗· 格雷厄姆(Paul Graham) 3 已经做过这样的总结: 二十年来,开发新编程语言的一个流行的秘诀是:取 C 语言的计算模式,逐渐地 往上加 LISP 模式的特性,例如运行时类型和无用单元收集。 然而这毕竟只是“创生一种新语言”的魔法。那么,到底有没有让我们在这浩如烟海的 语言家族中,找到学习方法的魔法呢? 我的答案是:看清语言的本质,而不是试图学会一门语言。当然,这看起来非常概念化。 甚至有人说我可能是从某本教材中抄来的,另外一些人又说我试图在这本书里宣讲类似于我 那本《大道至简》里的老庄学说 4 。 1 2 3 4 参见《人月神话》,美国弗雷德里克•布鲁克斯(Frederick P. Brooks, Jr.)著。 参见《蓝精灵》,比利时皮埃尔•居里福特(Pierre Culliford,Peyo)著。 保罗•格雷厄姆是计算机程序语言Arc的设计者,著有多本关于程序语言,以及创业方面的书籍。 这是一本软件工程方面的书,但往往被人看成是医学书籍或有人希望从中求取养生之道。 5
  • 9.其实这很冤枉。我想表达的意思不过是:如果你想把一副牌理顺,最好的法子,是回到 它的分类法上,要么从A到K整理,要么按四个花色整理 5 。毕竟,两种或更多种分类法作用 于同一事物,只会使事物混淆而不是弄得更清楚。 因此,本书从语言特性出发,把动态与静态、函数式与非函数式的语言特性分列出来。 先讲述每种特性,然后再讨论如何去使用(例如交叉)它们。 特性与技巧 无论哪种语言(或其他工具)都有其独特的特性,以及借鉴自其他语言的特性。有些语 言通体没有“独特特性” ,只是另外一种语言的副本,这更多的时候是为了“满足一些人使用 语言的习惯” 。还有一些语言则基本上全是独特的特性,这可能导致语言本身不实用,但却是 其他语言的思想库。 我们已经讨论过这一切的来源。 对于JavaScript来说,除了动态语言的基本特性之外,它还有着与其创生时代背景密切相 关的一些语言特性。直到昨天 6 ,JavaScript的创建者还在小心翼翼地增补着它的语言特性。而 本书的主要努力之一,就是分解出这些语言原子,并重现将它们混合在一起的过程与方法。 通过从复杂性到单一语言特性的还原过程,让读者了解到语言的本实,以及“层出不穷的语 言特性”背后的真相。 所谓技巧,是“技术的取巧之处” 。所以根本上来说,技巧也是技术的一部分。很多人(也 包括我)反对技巧的使用,是因为难以控制,并且容易破坏代码的可读性。 技巧的使用取决于具体的目标,以及“需要、能够”维护这个代码的人对技巧的理解。 这包括:  技巧是一种语言特性,还是仅特定版本所支持或根本就是 BUG;  技巧是不是唯一可行的选择,有没有不需要技巧的实现;  技巧是为了实现功能,而不是为了表现技巧而出现在代码中的。 即使如此,我仍然希望每一个技巧的使用都有说明,甚至示例。如果维护代码的人不能 理解该技巧,那么连代码本身都失去了价值,更何论技巧存在这份代码中的意义呢? 所以本书中的例子的确要用到许多“技巧”,但我一方面希望读者能明白,这是语言内核 或框架内核实现过程中必须的,另一方面也希望读者能从这些技巧中学习到它原本的技术和 理论,以及活用的方法。 然而对于很多人来说,本书在讲述一个完全不同的语言类型。在这种类型的语言中,本 书所讲述的一切,都只不过是“正常的方法” ;在其他类型的一些语言中,这些看起来就成了 技巧。例如在 JavaScript 中要改变一个对象方法指向的代码非常容易,并且是语言本身赋予的 能力;而在 Delphi/C++中,却成了“破坏面向对象设计”的非正常手段。 所以你最好能换一个角度来看待本书中讲述的“方法” 。无论它对你产生多大的冲击,你 应该先想到的是这些方法的价值,而不是它对于“你所认为的传统”的挑战。事实上,这些 方法,在另一些“同样传统”的语言类型中,已经存在了足够长久的时间——如同“方法” 之与“对象”一样,原本就是那样“ (至少看起来)自然而然”地存在于它所在的语言体系之 5 6 不过这都将漏掉了两张王牌。这正是问题之所在,因为如果寻求“绝对一分为二的方法” ,那么应该分为“王牌”和“非王 牌”。但这往往不被程序员或扑克牌玩家们采用,因为极端复杂性才是他们的毕生目标。 在JavaScript 2——这种把银弹涂上毒剂以试图用单发手枪击杀恐龙的构想发布之前的“昨天”。 6
  • 10.中。 语言特性的价值依赖于环境而得彰显。横行的螃蟹看起来古怪,但据说那是为了适应一 次地磁反转。螃蟹的成功在于适应了一次反转,失败(我们是说导致它这样难看)之处,也 在于未能又一次反转回来。 7
  • 11.这本书 本电子书是由电子工业出版社出版的《JavaScript 语言精髓与编程实践》一书的迷你版本。 但本电子书不包括该纸质书中的有关 JavaScript 语言的绝大部分内容,而只是摘选了其中关于 语言范型的论述,并由此组织成文。故本电子书定名为《动态函数式语言精髓》。 本书的部分内容曾以电子文档的形式发布为《主要程序设计语言范型综论与概要》。 本电子书由作者周爱民先生亲自摘选编撰,由 InfoQ 中文网站独家在线发布。在此,感 谢电子工业出版社、博文视点资讯有限公司(武汉分部)予以许可。 8
  • 12.导读 《JavaScript 语言精髓与编程实践》这本书,最初的名字是叫《动态函数式语言精髓与编 程实践》的,这才是我写那本书的原意。确切地说,我并非是想讨论 JavaScript 作为一种语言 工具的用法或特性。我更多地是希望用一种简洁的语言来讨论动态语言、函数式语言。而为 了给这些语言范型以参照,以及讲述多范型如何“杂凑”在一起,我也讨论了 JavaScript 中的 命令式语言特性。 因此,事实上《JavaScript 语言精髓与编程实践》一书是假 JavaScript 语言之力,讨论了 我们常用的、主要的程序设计范型。而这也是该书难读的根源——很少有人会以一门确切的 语言来讨论多种语言范型。尤其在使用 JavaScript 的开发者群体里,深入了解该语言的本来就 不多,研究语言特性的就更少了。 在本电子迷你书中,我摘引了《JavaScript 语言精髓与编程实践》一书有关语言讨论的关 键章节(主要在第三、四、五章),从 JavaScript 无关的角度综论这些语言的产生发展,以及 特性的概要。作为纯语言学范畴的讨论,读者在本摘引中不需要过多地了解 JavaScript,也不 必深究某种语言的细节,作参考文论来读,便是不错。 本文主要有“命令式语言” 、 “函数式语言”和“动态语言”三个部分,均精减自《JavaScript 语言精髓与编程实践》一书的相应内容。本文最末一个部分,对几种语言作一综述,一孔之 见而已。 9
  • 13.命令式语言 《JavaScript 语言精髓与编程实践》 :第 3 章 1、命令式语言的发展综论 源于对计算过程的认识的不同而产生了不同的计算模型,基于这些计算模型进行的分类, 是计算机语言的主要分类方式之一。在这种分类法中,一般将语言分为四大类:命令式语言、 函数式语言、逻辑式语言和面向对象程序设计语言。 本节将首先讨论程序的本质,并从这个本质出发,以另一种分类法对程序语言做出分类: 命令式语言和说明式语言。 《JavaScript 语言精髓与编程实践》 一书基于该分类法讨论 JavaScript 的非函数式语言特性,有关内容组织如表 3-1 所示。 1、命令式语言与结构化编程 “命令式”这个词事实上过于学术化。简单地说,我们常见的编程语言,从“低级的” 汇编语言到“高级的”C++,以及我们常用的 Basic、Pascal 之类都是命令式语言。 命令式语言的演化分为“结构化编程”和“面向对象编程”两个阶段。无论是从语言定 义还是从数据抽象的发展来看,面向对象编程都是结构化编程的自然延伸。 结构化程序设计语言中,对结构的解释包括三个部分:程序的控制结构、组织结构和数 据结构。所谓控制结构,即是顺序、分支和循环这三种基本程序逻辑;所谓组织结构,即是 指表达式、语句行、语句块、过程、单元、包等;所谓数据结构,包括基本数据结构和复合 数据结构,且复合数据结构必然由基本数据结构按复合规则构成。 整个命令式语言的发展历程,都与“冯·诺依曼”计算机系统存在直接关系。这种计算 机系统以“存储”和“处理”为核心,而在编程语言中,前者被抽象成“内存”,后者被抽 象成“运算(指令或语句)”。所以命令式语言的核心就在于“通过运算去改变内存(中的数 据)”——我们应该注意到:软件程序与硬件系统在本质上就存在如此亲密的关系。 那么命令式语言与结构化编程在概念上有多大的相关性呢?事实上它们并不是同一层面 上的概念,前者讲的是运算范型(表达为语言) ,后者讲的是一种程序设计与开发的方法。因 此在结构化编程的整个知识域中,其实仅有“数据结构”与“命令式语言(这一编程范型) ” 在同一层面上。而所谓“数据结构” ,即是命令式语言所关注的“存储” 。 由于命令式语言的实质是面向存储的编程,所以这一类语言比其他语言更加关注存储的 方式。在程序设计的经典法则“程序=算法+结构”中,命令式语言是首先关注“结构”的— —这里是特指“数据结构(或类型系统) ”。表 3-2 说明在 Intel 计算机体系中“数据结构”上 的简单抽象。 10
  • 14.*注 1:C 语言中的“结构”类型在 Pascal 中称为“记录(record)”。为了避免与本章中所述的“算法+(数据)结 构”的结构混淆,在后文中,编程语言中的“结构”称为“结构体”。而“结构”一词,通常用来表达概念上的“数据 结构(或类型系统)”。 命令式语言在运算上也基于上述的“存储结构”来进行算法设计。例如表检索,通常认 为是在一个“连续数据块”中找到指定的、一个“基本数据单元”中的值。例如: /** * programminglanguage:JavaScript *params:* - key, a value. etc, type of byte * - table, a array. etc, type of byteArray. */ function SearchInTable(key, table) { for (var i=0; i15.在数据表达上过度的弹性带来了编程设计中的不规范,因此事实上在结构化编程时代,除了 关系型数据库之外,并没有什么一致的、规范化的编程模型出现。另一方面,结构体根本上 是面向机器世界的“存储描述” ,因此它的抽象层次明显过低。 抽象层次过低带来的问题至少包括三个方面。 其一,结构体与实体直接相关,并且将这种相关性直接呈现在使用者的面前,因此开发 人员必须面临数据的具体含义与关系。 在命令式语言中,变量(数据)的作用域首先按冯·诺依曼体系分为数据域与代码域。 然后根据编译器的约定,分为局部域、单元域与全局域。一些编译器也约定了“块”级别的 作用域,例如 C 语言中的线程锁机制。 然而,结构体本身并不具有隐藏数据域的特性。它只是忠实地反映程序系统与实际应用 环境的映射关系。例如一个对房间的描述: (** * programminglanguage:'>language:
  • 15.在数据表达上过度的弹性带来了编程设计中的不规范,因此事实上在结构化编程时代,除了 关系型数据库之外,并没有什么一致的、规范化的编程模型出现。另一方面,结构体根本上 是面向机器世界的“存储描述” ,因此它的抽象层次明显过低。 抽象层次过低带来的问题至少包括三个方面。 其一,结构体与实体直接相关,并且将这种相关性直接呈现在使用者的面前,因此开发 人员必须面临数据的具体含义与关系。 在命令式语言中,变量(数据)的作用域首先按冯·诺依曼体系分为数据域与代码域。 然后根据编译器的约定,分为局部域、单元域与全局域。一些编译器也约定了“块”级别的 作用域,例如 C 语言中的线程锁机制。 然而,结构体本身并不具有隐藏数据域的特性。它只是忠实地反映程序系统与实际应用 环境的映射关系。例如一个对房间的描述: (** * programminglanguage:'>language: