返回介绍

9.2 从静态到动态

发布于 2024-12-15 23:01:47 字数 1765 浏览 0 评论 0 收藏 0

相反地,一个语言环境中也可能存在四种与上述 静态语言 约定不相容的情况。

其一,在执行之前存在标识但没有任何已知的值,代码运行时该标识存有绑定任何值的可能,称为 动态绑定4 。例如下面的代码行在 JavaScript 中表示环境中有一个标识 age ,但直到该行代码执行时, age 所指示的存储中才会有值 20:

1
2
  // 示例 1
  var age = 20;

与此相对,我们称标识在运行之前就具有了值和类型的情况为 静态绑定 。例如在 Delphi/Pascal 中:

1
2
  // 示例 1
  Var Age : Integer = 20;

其二,对于已经(动态或静态)绑定过的标识,如果通过写值的方式能够使之具有新的数据类型含义,我们称为 动态重写5 。对此前的示例 1,我们可以有如下代码:

age = "unknown";

这会导致 age 具有新的数据类型,而这在 Delphi/Pascal 中会被视为违例。

其三,动态绑定或是动态重写导致标识具有不同数据类型含义的情况,称为 动态类型 。示例 1 中的 age 在动态绑定发生之后,JavaScript 环境允许使用 typeof() 取得其类型为 Number ,但在绑定发生前则是未定义的 6

其四,如果允许将(任意或特定数据类型的)数据作为代码片段加以执行,则称为 动态执行 。例如:

eval("dynamic_code_text");

当然,这也意味着多数脚本语言具有动态执行的性质,只要它们能读取文本文件内容并执行。

对于支持上述(“静态绑定”是显然被排除在外的)四种性质中的一种或多种性质的语言,我们就称为 动态语言

所以我们此前将部分讨论限定在“静态的、编译型”语言之中,实在是有着严苛的条件:既要能直接编译成机器语言,又要能明确有标识和数据类型含义。接下来,我们的讨论则要广泛得多。不过此前讨论的那些性质,在后续讨论中也仍然是合用的——这本来就是我们构划这样一个讨论路径的原因。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文