代码之家  ›  专栏  ›  技术社区  ›  dkretz

早期绑定与晚期绑定:比较优势和劣势是什么?

  •  20
  • dkretz  · 技术社区  · 17 年前

    在讨论计算机语言的演变时,Alan Kay说他的Smalltalk最重要的一个属性是后期绑定;它赋予了语言可塑性和可扩展性,并允许随着时间的推移重构不适当的耦合。你同意吗?早期绑定是否有补偿优势,可以解释为什么它似乎是两种范式中占主导地位的领域,其中任何一种都可以使用?

    我个人的经验(不够广泛或深入,不足以成为权威),基于使用javascript、jQuery、jsext、actionscript、php、java、RoR和asp.net实现web应用程序,似乎表明后期绑定和减少臃肿之间存在正相关关系。我确信早期绑定有助于检测和防止一些类型安全错误,但自动补全和良好的IDE以及一般的良好编程实践也是如此。所以我倾向于在我的风险规避方面恢复我的理性观点之前,先支持后期约束方面。

    但我真的不知道如何平衡这些权衡。

    6 回复  |  直到 12 年前
        1
  •  15
  •   Travis Wilson    17 年前

    根据我对高性能软件(如游戏、数字运算)和性能中立软件(网站、大多数其他东西)的经验,有一种 巨大的 后期绑定的优点:您提到的延展性/可维护性/可扩展性。

    早期绑定有两个主要好处。第一:

    • 运行时性能

    这是普遍接受的,但通常无关紧要,因为在大多数情况下,用硬件解决问题是可行的,这更便宜。当然,也有例外(例如,如果您不拥有正在运行的硬件)。

    早期绑定的第二个好处:

    • 易于开发

    似乎被低估了。在开发人员使用其他人的组件的大型项目中,IDE可以读取早期绑定并使用它们来通知开发人员(通过自动补全、文档等)。这对于后期绑定来说不太实用,因为绑定是在运行时创建的。如果IDE可以从代码中推断出结构定义,那么使用后期绑定语言仍然是可能的,但由于结构在运行时总是可以更改的,所以它不太可靠。

    易于开发是一件大事。它最大限度地减少了昂贵的程序员时间——你的开发团队越大,它就越重要。你需要在这与后期绑定语言的灵活性之间取得平衡。

        2
  •  12
  •   Moss Collum    17 年前

    传统上,早期绑定的最大优势在于性能:后期绑定语言必须在运行时携带有关其所有数据的类型信息,并且失去了在编译时进行一些优化的机会。然而,随着计算机速度的提高,以及虚拟机在动态优化方面变得更加智能,这种差异已经变得不那么显著了。

        3
  •  4
  •   user2880665    12 年前

    迟到可以让跑步系统自我扩展。例如,系统开始了解狼。随着时间的推移,Wolf(?)中的evolveDomesticate()方法会旋转一个名为Dog的新类并实例化它,现在我们有了Dogs。Smalltalk会保存整个SYSTEM映像,因此如果您关闭并重新启动它,狗在重新启动后仍然存在。一旦你进化到在特定硬件上运行并连接到网状网络中的对象,整个生态系统就不会真正关闭(直到Sun爆发)。我想这就是Alan Kay所说的后期绑定的优势,成为上帝。

        4
  •  3
  •   ConcernedOfTunbridgeWells    17 年前

    早期绑定与晚期绑定实际上是语言架构的一个功能。早期绑定意味着可以构建代码,其中机器指令只是跳转到一个地址并从那里开始执行(可能通过查找表)。后期绑定要求每次访问都要查找符号和类型引用(通常是哈希表查找),这会减慢语言的速度。

    虽然一些基于VM的语言(如Java)是早期绑定的,但本机机器代码只能直接进行早期绑定。为了进行后期绑定,它必须执行与动态语言解释器相同的哈希查找。然后,后期绑定需要执行一段代码来获取地址(这就是OLE自动化的工作原理)。它不能直接由CPU完成,必须执行代码。

    请注意,执行后期绑定的代码在哈希查找函数等中实际上会有自己的早期绑定分支目标。因此,从这个角度来看,对于任何要由CPU直接执行的代码,早期绑定都是必要的。后期绑定必须在软件中完成。

    早期绑定对于各种各样的代码优化也是必要的。

    可以说,像C这样的架构在编写接近金属的代码方面有一个最佳点。在您想要这样做的地方,早期绑定方面几乎是语言架构所固有的。在Python等后期绑定语言中,后期绑定也是固有的。有些语言同时提供这两种功能,但使用的特定类型将与正在执行的特定构造相关联。

        5
  •  2
  •   Peter Gfader    17 年前

    我认为有更好的方法/模式来避免不适当的耦合,比如控制反转、依赖注入、工厂等。..

    但是,我喜欢后期绑定的“易于使用”的版本独立性
    只需使用

    var excel = CreateObject("Excel.Application");
    

    后期绑定会弄清楚,是什么样的Excel。应用程序,以及从哪里获取。..

        6
  •  -1
  •   vanita    14 年前

    在编译期间执行链接的编译时绑定称为早期绑定

    动态绑定,其中在调用函数时执行的函数链接称为后期绑定