15

我试图理解早期和晚期绑定之间的区别,并且在过程中意识到绑定的概念对我来说是模糊的。 I think我知道它涉及到将数据作为一个字的内存链接到类型作为一组语言功能,但我不确定那些是正确的概念。另外,理解如何深深地帮助人们成为更好的程序员?初学者问题:什么是绑定?

请注意:这个问题不是“什么是迟到早期绑定”或“什么是2之间的折衷”。这些已经存在。

谢谢,

JDelage

+0

它也有意义,注意什么是绑定与什么是链接。例如。 Ada对这些使用单独的步骤,而C则将它们合并/混淆。 – ndim 2010-04-23 13:44:48

回答

1

绑定通常会将名称与某个值相关联。该值不一定是数据,但可以是任何具有名称的数据,例如一个函数或一个类。

至于权衡:

  • 早期绑定使早期提供的价值。因此,例如编译器可以基于已知值应用优化,如评估常量表达式。这可能会导致更好的性能,并且不需要运行时支持来检索值。

  • 后期绑定需要稍后的值,因此它提供了更大的灵活性。更改部分代码或重新配置系统变得更容易。

总的趋势是朝后期绑定,因为更快的处理器和更好的技术(例如JIT编译)可以更频繁地实现。

4

在其最简单的,结合是一个符号的一个程序中,在存储器中的地址的关联。

例如:用C调用一个函数。当您的声明了一个函数时,编译器会记录该函数的名称及其代码在目标文件中的位置。当您从一个单独编译的文件中调用函数时,编译器会在发生调用的位置记录对该名称的引用。链接器负责绑定这两个引用,以便该调用将引用正确的内存位置。

2

“绑定”基本上是说“这个函数/属性名称对应于这一位代码”。

1

如果你谈论更多数据绑定,那么我会说,在他们的作品Data Binding Overview使用微软很好的定义:

“数据绑定是 建立 应用之间的连接过程UI和业务逻辑。如果 结合具有正确的设置 和数据提供适当的 通知,然后,当数据 改变其值,即 绑定到数据元素反映改变 自动盟友。数据绑定也可以是 的意思是如果一个元素的外部表示 的数据发生变化,则 那么底层数据可以自动更新为 以反映 的变化。例如,如果用户编辑 在TextBox元件的值,则 基础数据值是自动 更新以反映该变化。”

换句话说,它是从一个数据 - 获取数据的一种方式源(例如数据库或XML文件)并将该数据应用于接口或显示元素,例如,表单可能具有存储在数据库中的表中的值的下拉列表。过程将数据库中的值“绑定”到列表中。单向数据绑定通常是“只读”的,但双向数据绑定允许用户将值更新回基础数据源。

2

在编译器的上下文中,绑定是将地址引用更改为实际绝对地址的阶段。

当程序编译,每个符号的地址(变量,函数)与符号名称存储在符号表中例如作为相对从对象模块的开始偏移,在一起。符号名称是必需的,因为可以从另一个目标模块调用符号。

当程序是链接,目标模块被组合成一个程序文件,不再需要符号名称。 如果程序链接到已知的绝对地址中,则所有的地址引用都可以在处绑定到已经在此阶段的绝对地址。

但是,在诸如PC:s的工作站中,程序可以加载到任何地址,因此在链接时地址是未知的。 因此,附加的重定位信息存储在程序文件中,以便加载程序可以在加载时绑定地址。

绑定在加载时使用重定位信息完成。当程序将要运行的地址已知时,加载程序会使用重定位信息替换绝对地址的相对地址,该信息告诉代码中需要完成更改的位置。

对于动态对象/变量,绑定可以在运行时完成。 (我认为这通常称为后期绑定。)

通常,您不需要太在意绑定,至少在使用早期绑定时不需要太多关注。 (但是,运行时绑定可能会对性能和安全性产生负面影响。)