【问题标题】:Beginner question: What is binding?初学者问题:什么是约束力?
【发布时间】:2010-04-23 13:19:27
【问题描述】:

我试图了解早期绑定和后期绑定之间的区别,并在此过程中意识到绑定的概念对我来说是模糊的。我认为我知道它与数据作为记忆的单词与类型作为语言集的关联方式有关,但我不确定那些是正确的概念。另外,深入理解这一点如何帮助人们成为更好的程序员?

请注意:这个问题不是“什么是后期与早期绑定”或“两者之间的权衡是什么”。这些已经存在在这里。

谢谢,

JDelage

【问题讨论】:

  • 注意什么是绑定与什么是链接也很有意义。例如。 Ada 对这些使用单独的步骤,而 C 合并/混淆它们。

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


【解决方案1】:

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

至于权衡:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

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

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

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

        【讨论】:

          【解决方案5】:

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

          "数据绑定是 之间建立连接 应用程序 UI 和业务逻辑。如果 绑定具有正确的设置 并且数据提供了适当的 通知,然后,当数据 改变它的价值,元素 绑定到数据反映变化 自动地。数据绑定也可以 意味着如果一个外部表示 元素中的数据发生变化, 那么基础数据可以是 自动更新以反映 改变。例如,如果用户编辑 TextBox 元素中的值, 基础数据值自动 更新以反映这一变化。”

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

          【讨论】:

            猜你喜欢
            • 2020-01-04
            • 2020-11-23
            • 2015-03-16
            • 2012-04-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多