解释语言与编译语言的动态绑定

时间:2014-03-18 01:05:57

标签: programming-languages language-design dynamic-binding interpreted-language static-binding

所以目前正在阅读关于绑定......基于我可以想到的示例以及在网络上找到的示例,似乎动态绑定主要发生在解释语言中而不是在编译语言中发生。 Java中也会出现一些问题,但java不是一种“纯粹”的编译语言。我读过 - http://en.wikipedia.org/wiki/Dynamic_binding_(computing)

我的问题是 - 对于类,方法和对象,动态绑定首先在对象级别发生,然后跟踪到方法,类等吗?此外,是否存在以编译语言在对象级别进行动态绑定的实例?

3 个答案:

答案 0 :(得分:1)

不,动态绑定可以在编译语言中发生,比如C ++:

https://en.wikipedia.org/wiki/Dynamic_binding_%28computing%29

请注意,Java也会编译为字节码,然后由JVM解释。有时,解释语言和编译语言之间的区别可能会变得模糊(例如使用动态调度的C ++)。

答案 1 :(得分:1)

您的问题有一系列定义问题。对于动态绑定,您可以考虑:

  • 函数重载(C ++)
  • vtable dispatch(C ++)
  • 动态名称查找和类调度(Smalltalk,ruby,python等)
  • 动态名称查找和对象分派(Javascript)
  • 后期绑定(VB6 COM)
  • 动态调度(Lisp,Dylan)

对于编译与解释,您可以考虑:

  • 编译为机器代码(C / C ++)
  • 编译为字节码,然后JIT编译(C#,Java)
  • 使用VM(Java,Python)编译为字节码
  • 解析并标记化(?)

通常,很少有语言被编译为机器代码,并且大多数语言没有动态名称查找或对象继承。编译了许多语言(但不是机器代码),其中许多语言具有动态名称查找,具有类或对象继承。

所以答案是,这取决于。

答案 2 :(得分:1)

编译语言和解释语言是一种错误的二分法,会在编程语言社区引起很多混乱。许多现代语言实现平台包括解释器和编译器。即使语言的原始和长期实现是编译器,但这并不意味着某人以后可以为它编写解释器。那里有不止一个C解释器以及十几个Lisp编译器。