目前正在阅读绑定…根据我能想到的例子以及在网上找到的例子,动态绑定似乎主要发生在解释语言中,而不是发生在编译语言中。这种情况在Java中也会出现,但Java并不是一种"纯粹的"编译语言。我读过(http://en.wikipedia.org/wiki/Dynamic_binding_(computing)。
我的问题是,然后-对于类,方法和对象,动态绑定是否首先发生在对象级别,然后跟踪到方法,类等?此外,在编译语言中是否存在动态绑定发生在对象级别的实例?
不,动态绑定可以发生在编译语言中,如c++:
https://en.wikipedia.org/wiki/Dynamic_binding_%28computing%29注意,Java也被编译成字节码,然后由JVM解释。有时解释型语言和编译型语言之间的区别会变得模糊(比如c++使用动态分派)。
你的问题有一系列的定义问题。对于动态绑定,您可以考虑:
- 函数重载(c++)
- 虚表调度(c++)
- 动态名称查找和类调度(Smalltalk, ruby, python等)
- 动态名称查找和对象调度(Javascript)
- 后期绑定(vb6com)
- 动态调度(Lisp, Dylan)
对于编译和解释,您可以考虑:
- 编译成机器码(C/c++)
- 编译成字节码,然后JIT编译(c#, Java)
- 编译成字节码,使用VM (Java, Python)
- 已解析并标记(?)
一般来说,很少有语言被编译成机器代码,而且大多数语言没有动态名称查找或对象继承。许多语言都是编译的(但不是机器代码),其中许多语言都具有动态名称查找,具有类或对象继承。
答案是,看情况
编译语言和解释语言是一种错误的二分法,在编程语言社区中引起了很多混淆。许多现代语言实现平台都包括解释器和编译器。即使语言的原始和长期存在的实现是编译器,这并不意味着以后不能为它编写解释器。市面上不止一种C解释器,还有十几种Lisp编译器。