我们如何确定一种语言是动态的还是静态的?一个例子是Swift

时间:2019-03-18 01:15:17

标签: objective-c swift oop

我一直在阅读一些帖子,这总是让我感到困惑。

1,有人说,通过在运行时或编译时确定type的方式,语言是静态/动态的。但是我们应该说语言是static/dynamic typing language而不是static/dynamic language吗?

2,在Swift与Objective-C的比较中。我们知道Objective-C使用其运行时来进行动态方法分配。有人以此为理由说language/objective-c is dynamic是真的吗?!

3,有时我对OOP的多态性感到困惑,有人说为了使它可行,该语言必须支持方法动态调度。是这样吗?

4,我很快就知道它是一种静态的键入语言,但是它是静态的还是动态的方法调度语言?整体上是静态还是动态语言?

2 个答案:

答案 0 :(得分:1)

  1. Swift是一种静态的“类型化”语言,这意味着它会在运行时之前执行类型检查。
  2. Swift根据不同的情况使用直接分派,带有其见证人表的表分派或消息分派(obj-c),您可以看一下本文:https://www.raizlabs.com/dev/2016/12/swift-method-dispatch/一些示例已经过时,但是概念将变得更加清晰
  3. 静态分派不支持多态,因为它需要知道在编译时将执行方法的哪种实现。 希望这会有所帮助。

答案 1 :(得分:1)

  1. 我从没听说过“静态语言”或“动态语言”。我听说过的常用术语是“静态类型语言”或“动态类型语言”。

  2. 在此情况下,“动态”不是定义的术语,因此在这里没有太多要说的。

  3. 多态性有多种不同的含义,所以我假设您的意思是subtype polymorphism。在那种情况下,是的,必须进行动态调度。整个想法是,您希望不同类型的对象以相同的方式响应相同的消息(方法调用)。唯一的方法是使消息和函数调用脱钩,以便可以在运行时根据消息的接收者的类型调用适当的函数。

  4. 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,这是不兼容的。

    对象的运行时类型决定了要调用的方法实现。