初学者问题:什么是约束力?

时间:2010-04-23 13:19:27

标签: data-binding data-structures programming-languages language-features

我试图理解早期和晚期绑定之间的区别,并且在此过程中意识到绑定的概念对我来说是模糊的。我认为我理解它与数据作为内存字的方式与类型为一组语言特征的方式有关但我不确定那些是正确的概念。另外,如何理解这一点有助于人们成为更好的程序员?

请注意:这个问题不是“什么是迟到的早期约束”或“两者之间的权衡取舍”。那些已存在于此。

谢谢,

JDelage

5 个答案:

答案 0 :(得分:4)

最简单的,绑定是程序中的符号与内存中的地址的关联。

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

当程序链接时,对象模块将合并为一个程序文件,不再需要符号名称。 如果程序链接到已知的绝对地址,则所有地址引用都可以绑定到此阶段的绝对地址。

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

使用重定位信息在加载时完成

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

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

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

答案 3 :(得分:1)

如果您更多地谈论数据绑定,那么我会说微软在Data Binding Overview中使用的定义非常有效:

  

“数据绑定就是这个过程   在...之间建立联系   应用程序UI和业务逻辑。如果   绑定具有正确的设置   并且数据提供了正确的   通知,然后,当数据   改变它的价值,即那些元素   必然会有数据反映变化   自动。数据绑定也可以   意味着如果是外在的表示   元素中的数据变化,   然后基础数据可以   自动更新以反映   更改。例如,如果用户编辑   TextBox元素中的值,   基础数据值是自动的   更新以反映这一变化。“

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

答案 4 :(得分:1)

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

至于权衡:

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

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

总的趋势是后来的绑定,因为更快的处理器和更好的技术(例如JIT编译),它变得更加可行。