20

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

4

6 回答 6

31

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

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

于 2010-04-18T06:24:06.433 回答
11

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 和多态性。

我会考虑一种主要是静态类型或动态类型的语言,具体取决于它常用的用途。

于 2010-04-18T02:34:25.537 回答
1

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

在形而上学/本体论层面,这个问题更有趣......

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

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

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

于 2010-04-18T02:54:51.830 回答
1

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

于 2010-04-18T03:21:49.327 回答
0

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

于 2010-04-18T18:24:07.777 回答
-1

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

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

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

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

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

于 2011-12-03T00:54:59.710 回答