- 内容提要
- 序 1:程序里的世界
- 序 2:最后一层表象
- 关于本书
- 致谢
- 引言:简单的本源
- 篇一:计算系统
- 第 1 章 数,以及对数据的性质的思考
- 第 2 章 逻辑
- 第 3 章 抽象
- 篇二:语言及其面临的系统
- 第 4 章 语言
- 第 5 章 从功能到系统
- 篇三:程序设计的核心思想
- 第 6 章 数据结构:顺序存储
- 第 7 章 数据结构:散列存储
- 第 8 章 执行体与它在执行过程中的环境
- 第 9 章 语法树及其执行过程
- 第 10 章 对象系统:表达、使用与模式
- 篇四:应用开发基础
- 第 11 章 应用开发的背景与成因
- 第 12 章 应用开发技术
- 第 13 章 开发视角下的工程问题
- 第 14 章 应用程序设计语言的复杂性
- 篇五:系统的基础部件
- 第 15 章 分布
- 第 16 章 依赖
- 第 17 章 消息
- 第 18 章 系统
- 篇六:系统的基本组织方法与原理
- 第 19 章 行为的组织及其抽象
- 第 20 章 领域间的组织
- 附一:主要编程范式 及其语言特性关系
- 附二:继承与混合,略谈系统的构建方式
- 附三:像大师们一样思考——从 UML 何时死掉 谈起
- 附四:VCL 已死,RAD 已死
9.2 从静态到动态
相反地,一个语言环境中也可能存在四种与上述 静态语言 约定不相容的情况。
其一,在执行之前存在标识但没有任何已知的值,代码运行时该标识存有绑定任何值的可能,称为 动态绑定4 。例如下面的代码行在 JavaScript 中表示环境中有一个标识 age
,但直到该行代码执行时, age
所指示的存储中才会有值 20:
1 2 |
|
与此相对,我们称标识在运行之前就具有了值和类型的情况为 静态绑定 。例如在 Delphi/Pascal 中:
1 2 |
|
其二,对于已经(动态或静态)绑定过的标识,如果通过写值的方式能够使之具有新的数据类型含义,我们称为 动态重写5 。对此前的示例 1,我们可以有如下代码:
age = "unknown";
这会导致 age
具有新的数据类型,而这在 Delphi/Pascal 中会被视为违例。
其三,动态绑定或是动态重写导致标识具有不同数据类型含义的情况,称为 动态类型 。示例 1 中的 age
在动态绑定发生之后,JavaScript 环境允许使用 typeof()
取得其类型为 Number
,但在绑定发生前则是未定义的 6 。
其四,如果允许将(任意或特定数据类型的)数据作为代码片段加以执行,则称为 动态执行 。例如:
eval("dynamic_code_text");
当然,这也意味着多数脚本语言具有动态执行的性质,只要它们能读取文本文件内容并执行。
对于支持上述(“静态绑定”是显然被排除在外的)四种性质中的一种或多种性质的语言,我们就称为 动态语言 。
所以我们此前将部分讨论限定在“静态的、编译型”语言之中,实在是有着严苛的条件:既要能直接编译成机器语言,又要能明确有标识和数据类型含义。接下来,我们的讨论则要广泛得多。不过此前讨论的那些性质,在后续讨论中也仍然是合用的——这本来就是我们构划这样一个讨论路径的原因。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论