【问题标题】:How Can a Programming Language be both Statically-Typed and Dynamically-Typed?编程语言如何同时具有静态类型和动态类型?
【发布时间】:2011-02-09 07:02:01
【问题描述】:

原则上,静态类型语言和动态类型语言似乎是相反的概念。但是,像 Objective-C 这样的语言怎么能同时兼具这两种特性呢?在我看来,Objective-C 比动态更静态。有人能解释一下这是怎么可能的吗?

【问题讨论】:

  • 怎么样?以牺牲两种范式为代价。

标签: objective-c dynamic static typing


【解决方案1】:

我相信您混淆了静态打字和动态方法解析。 Objective-C 绝对是强静态类型的。与 C 一样,所有变量都必须声明和类型化(甚至没有像其他现代静态类型语言那样的类型推断)。编译器根据变量的类型生成代码,该类型不能在运行时改变。

然而,Objective-C 方法调用使用消息传递范例,其中消息名称和目标在编译时进行编码,但要执行的代码的地址由 Objective-C 运行时库在运行时查找。

【讨论】:

  • 我实际上想知道同样的问题,因为在 Apple Objective-C 文档中指出,由于动态方法解析,Objective-C 是动态类型的。我同意文档不应该因为它是基于此功能的动态类型而使人们感到困惑。
  • 它不是“可选类型”吗,考虑到如果你愿意,你可以让所有 Obj-C 对象类型 id 并完全忽略类型C 原语,比如 int 如果你正在使用它们?
  • @orange80, id 一种类型。事实上,Objective-C 中的所有对象实例——对编译器来说——类型为idstruct objc_object*)。静态类型在 C 和 Objective-C 中都不是可选的。
  • 我很困惑...来自文档:Cocoa Core Competencies “当在编译时未检查它指向的对象的类型时,变量是动态类型的。Objective-C 使用 id数据类型来表示一个对象的变量,而不指定它是什么类型的对象。这称为动态类型。动态类型与静态类型形成对比,静态类型在其中系统在编译时显式标识对象所属的类。”那么obj-c能不能动态类型呢?
【解决方案2】:

Objective-C 实际上(在概念上)只是 C 语言本身的一个层,因此可以同时具有静态和动态类型。如果您使用的是 base-C 的东西,则为静态,如果您使用的是 Objective-C 扩展,则为动态。

但是 C 也提供了这个特性。如果您只考虑 C 中的 void * 类型,您会发现它可以指向任何类型,因此为您提供了一种(非常粗略的)动态类型语言。

例如:

int i;
float f;
double d;
void *p = &i;
p = &f;
p = &d;

在上面对p 的所有分配中,它指向不同的类型。如果你的代码足够聪明,你甚至可以在 C 中模拟 RTTI 和多态性。

我会考虑一种语言主要是静态类型还是动态类型,具体取决于它用于什么。

【讨论】:

    【解决方案3】:

    如果您问的是支持这两种习语的技术能力,那并不是一个特别有趣的问题。只需看看大多数现代语言,看看它们是如何做到的。通常,它是通过某种包罗万象的动态类型(VB 中的Object,C# 中的dynamic,C 中的void*,等等)。

    在形而上学/本体论层面,这个问题要有趣得多……

    物理学中的理论可能会提出违背直觉的行为,导致人们问:“这怎么可能?”例如,波粒二象性超越了任何关于现实如何或应该如何的常识性概念,因此它让我们思考不可估量的问题。

    然而,编程语言并不是现实的模型。它们是头脑的发明,旨在为我们的目的服务。因此,思考编程语言如何成为它的样子是没有意义的。之所以如此,是因为我们希望它是那样的;因为它符合我们的目的。没有其他理由是必要或保证的。

    所以请理解,当我回答一种语言可以是动态的和静态的只是因为它可以并且因为这很有用时,我并不是轻率或不屑一顾。再试探是没有希望的。

    【讨论】:

    • 这是我在 SO 上见过的最讨厌、最无益的答案之一。
    • 我从这一切中理解的是,这是因为人们这样做了......也许用太多的词。
    【解决方案4】:

    C 是一种静态类型语言,但它可以灵活地将类型重新转换为其他类型,并使用泛型指针(void* 类型)。 void* 类型表示“指向未指定数据类型的指针”。 Objective-C 通过使用这些 void* 类型来实现其动态类型,尽管通常这被多层次的定义、类型定义等抽象出来。

    【讨论】:

      【解决方案5】:

      Objective-C 混合了静态和动态类型。普通的 C 对象是静态类型的,但 Objective-C 对象是动态类型的。 Objective-C 运行时并不关心对象是什么类型,只要您发送给对象的消息被对象识别即可。

      【讨论】:

        【解决方案6】:

        静态类型语言和动态类型语言确实是对立的——至少在这些术语的正常使用方式上。

        静态类型语言是一种在编译期间(或至少在代码执行之前)包含类型检查(和报告)阶段的语言。 Objective C 当然有这个,所以是静态类型的。

        动态类型语言是缺少这种类型检查阶段的语言。因此,Objective C 不是由这个定义动态类型化的——我认为这是最标准的定义。

        然而,Objective C 有时被称为动态类型(除了静态类型之外),因为它允许程序员在部分代码中指定减少的静态类型检查——尤其是通过特殊静态类型id 的对象。就我个人而言,我认为说它是一种对动态类型对象有很好支持的静态类型语言并不那么令人困惑。

        请注意,几乎所有静态类型语言都包含对动态类型的一些支持,因为例如,它们使用运行时检查来捕获除以零错误、数组边界错误、向下转换错误等。这样的事情不能证明调用是合理的动态类型的语言,否则几乎所有语言都必须称为动态类型。

        【讨论】:

          猜你喜欢
          • 2016-09-26
          • 2011-05-20
          • 1970-01-01
          • 1970-01-01
          • 2011-02-11
          • 2011-10-29
          • 1970-01-01
          相关资源
          最近更新 更多