我一直在阅读一些帖子,这总是让我感到困惑。
1,有人说,通过在运行时或编译时确定type
的方式,语言是静态/动态的。但是我们应该说语言是static/dynamic typing language
而不是static/dynamic language
吗?
2,在Swift与Objective-C的比较中。我们知道Objective-C使用其运行时来进行动态方法分配。有人以此为理由说language/objective-c is dynamic
是真的吗?!
3,有时我对OOP的多态性感到困惑,有人说为了使它可行,该语言必须支持方法动态调度。是这样吗?
4,我很快就知道它是一种静态的键入语言,但是它是静态的还是动态的方法调度语言?整体上是静态还是动态语言?
答案 0 :(得分:1)
答案 1 :(得分:1)
我从没听说过“静态语言”或“动态语言”。我听说过的常用术语是“静态类型语言”或“动态类型语言”。
在此情况下,“动态”不是定义的术语,因此在这里没有太多要说的。
多态性有多种不同的含义,所以我假设您的意思是subtype polymorphism。在那种情况下,是的,必须进行动态调度。整个想法是,您希望不同类型的对象以相同的方式响应相同的消息(方法调用)。唯一的方法是使消息和函数调用脱钩,以便可以在运行时根据消息的接收者的类型调用适当的函数。
Swift是一门遍历的静态类型语言。这可能会因类型推断而被掩盖。如果您有类似
的表达式func someFunction() -> Int { return 123 }
let x = someFunction()
类型推断并不意味着“ x
具有某种将在运行时确定的类型。”相反,这意味着“ x
的类型可以在运行时推导,因为我们已经知道someFunction
的类型。”
Swift中的所有类型在编译时都是已知的。在最坏的情况下,一个必须至少具有类型Any
,该类型仍然是类型。这不是一种特别有用的类型(因为Any
可以做的很多,但是仍然是一种类型。
在编译时和运行时类型方面存在类型的混淆,这引起了一定的困惑。这是一个示例:
class Car {
func vroom() { print("vroom")}
}
class SportsCar: Car {
override func vroom() { print("VROOOOOM")}
}
let car: Car = SportsCar()
func driveSportsCar(_: SportsCar) { print("driving") }
// Compile types are what determine usage compatibility
driveSportsCar(car) // cannot convert value of type 'Car' to expected argument type 'SportsCar'
// Runtime types are what determine method implementations
car.vroom() // => "VROOOOOM"
在此示例中,car
的运行时类型为Car
,运行时类型为SportsCar
。编译时类型决定了它的使用方式,传递位置等。例如,您无法将car
传递给driveSportsCar()
函数,因为即使运行时类型为{{ 1}},其编译时间类型为SportsCar
,这是不兼容的。
对象的运行时类型决定了要调用的方法实现。