gpt4 book ai didi

objective-c - 我们如何确定语言是动态的还是静态的?一个例子是 swift

转载 作者:行者123 更新时间:2023-11-28 11:36:29 24 4
gpt4 key购买 nike

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

1,有人说语言是静态/动态的,取决于 type 在运行时或编译时的确定方式。但是我们应该说该语言是静态/动态类型语言而不是静态/动态语言吗?

2,swift 与 objective-c 的一些比较。我们知道 objective-c 使用其运行时来进行动态方法调度。有些人以此为理由说 language/objective-c 是动态的,这是真的吗?!

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

4、对于swift,我知道它是一种静态类型语言,但它是一种静态方法调度语言还是动态方法调度语言呢?总体而言,它是一种静态语言还是动态语言??

最佳答案

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

  2. “动态”在此上下文中不是一个定义的术语,因此这里没有太多要说的。

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

  4. Swift 是一种彻头彻尾的静态类型语言。这可能会被类型推断所掩盖。如果你有这样的表达

     func someFunction() -> Int { return 123 }
    let x = someFunction()

    类型推断并不意味着“x 具有某种将在运行时计算出来的类型。”相反,它意味着“可以在运行时推断出 x 的类型,因为我们已经知道 someFunction 的类型。”

    Swift 中的所有类型在编译时都是已知的。在最坏的情况下,a 必须至少有 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() 函数,因为尽管它的运行时类型是 SportsCar,但它的编译时类型是 Car,这是不兼容的。

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

关于objective-c - 我们如何确定语言是动态的还是静态的?一个例子是 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55213572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com