绑定的概念、静态绑定与动态绑定、存储绑定

2019-10-24  本文已影响0人  zlrs

绑定就是一种关联。绑定发生的时间称为绑定时间。在程序设计语言语义中,绑定和绑定时间是相当重要的概念。

绑定时间

绑定时间 例子
程序设计时 星号(*)与乘法的绑定
语言实现时 C语言中的int与其取值范围的绑定
编译时 变量与类型的绑定
载入时 变量与存储单元的绑定
链接时 函数调用和函数的绑定
运行时 C++虚函数调用语句和函数地址的绑定 / Java方法中声明的变量和其类型的绑定

类型的静态绑定和动态绑定

静态绑定

显示声明或隐式声明的变量,变量名在编译时绑定到其类型。
显示声明:int a, b, c, d;
隐式声明:通过缺省转换而不是声明语句将变量名和类型关联。Fortran就具有隐式声明,如果标识符的开头字母是I, J, K, L, M, N和它们的小写字母,变量便被隐式地声明为Int类型,否则就被声明为Real类型。

动态绑定

动态类型绑定是说,变量的类型既不是由声明语句说明的,也不是通过名字的拼法隐式声明的,而是在赋值语句执行时,变量名才与赋值语句右边表达式的类型绑定。
动态绑定的语言举例:JavaScript、PHP、Python

动态绑定的优点 动态绑定的缺点
可以编写灵活的程序/函数。一个函数可以同时处理多个类型的形参。 动态绑定的代价相当大。类型检测必须在运行时进行。任何变量必须有一个相关的运行时描述符来维护当前类型。变量的存储空间必须可变等等。
解释器发现错误的能力较弱。这一点也部分地出现在C,C++,Java等有隐式类型转换的语言中。

对变量进行动态类型绑定的语言通常使用解释器而不是编译器来实现。因为在编译时,计算机指令的操作数类型必须是已知的;如果编译时不清楚A+B的操作数类型,那么就不能为表达式生成机器指令。静态类型绑定的语言较少通过单纯的解释器来实现,因为编译器的实现较为容易。

存储绑定

静态变量

静态变量是在程序运行之前就被绑定到存储单元上,且直到程序结束之前仍保持绑定在相同存储单元上的变量。如static局部变量、全局变量。

栈动态变量

栈动态变量:在变量声明语句被执行后才产生存储绑定,而类型是静态绑定的。C++和Java的一些实现会在函数开始执行时将函数体内声明的所有栈动态变量绑定到栈上的存储空间。(注意:变量只是生存期改变,作用域不变,也就是说依然遵循先声明后使用的规则。这和和JS的变量提升不同)

显式堆动态变量

显式堆动态变量是无名的存储单元,通过显式运行时指令(new, delete)来分配和释放存储空间。

隐式堆动态变量

隐式堆动态变量在它们被赋值时才被绑定到堆存储空间。如JavaScript中
highs = [74, 84, 86, 90, 71];

上一篇下一篇

猜你喜欢

热点阅读