Static and dynamic是指解决某些编程元素的时间点的行话。Static表示解析是在程序构建时发生的。Dynamic表示解析是在程序运行时发生的。
静态和动态打字
Typing指由于数据值之间的差异而导致程序结构的变化:整数、字符、浮点数、字符串、对象等。这些差异可能会产生许多影响,例如:
- 内存布局(例如,int 为 4 个字节,double 为 8 个字节,对象更多)
- 执行的指令(例如,添加小整数的原始操作、添加大整数的库调用)
- 程序流程(简单的子程序调用约定与多方法的哈希调度)
静态类型意味着在构建时生成的程序的可执行形式将根据程序中找到的数据值的类型而变化。动态类型意味着生成的代码将始终相同,无论类型如何——执行中的任何差异都将在运行时确定。
请注意,很少有真正的系统要么纯粹是其中一种,要么纯粹是另一种,这只是哪个是首选策略的问题。
静态和动态绑定
Binding指的是程序文本中的名称与其所引用的存储位置的关联。在静态绑定,这种关联是在构建时预先确定的。和动态绑定,这种关联直到运行时才确定。
真正的静态绑定几乎已经绝迹。例如,早期的汇编程序和 FORTRAN 会完全预先计算所有变量和子例程位置的确切内存位置。这种情况并没有持续多久,随着变量的堆栈和堆分配以及子例程的动态加载库的引入。
因此,我们必须对定义采取一定的自由度。这里重要的是这个概念的精神:静态绑定程序尽可能多地预先计算存储布局,这在现代虚拟内存、垃圾收集、单独编译的应用程序中是实用的。动态绑定的程序会尽可能晚地等待。
一个例子可能会有所帮助。如果我尝试调用一个方法MyClass.foo()
,静态绑定系统将在构建时验证是否存在一个名为MyClass
该类有一个名为的方法foo
。动态绑定系统将等到运行时才查看其中一个是否存在。
对比
静态策略的主要优点是程序翻译者更了解程序员的意图。这使得更容易:
动态策略的主要优点是它们更容易实施,这意味着:
创建工作动态环境的成本仅为静态环境的一小部分
添加静态检查可能非常困难的语言功能更容易
更容易处理需要自修改代码的情况
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)