静态类型语言和动态类型语言原则上看起来像是相反的概念。但是,像Objective-C这样的语言如何同时成为这两种东西?在我看来,Objective-C比动态更静态。有人可以解释一下这是可能的吗?
答案 0 :(得分:25)
我相信您会混淆静态输入和动态方法解析。 Objective-C绝对是强有力的,静态类型的。与C一样,必须声明和键入所有变量(在其他现代的静态类型语言中,甚至没有类型推断)。编译器根据变量类型生成代码,此类型不能在运行时更改。
但是,Objective-C方法调用使用消息传递范例,其中消息名称和目标在编译时进行编码,但是要在运行时通过Objective-C运行时库查找要执行的代码的地址。 / p>
答案 1 :(得分:9)
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和多态。
我会根据大多数所用的内容,将主要主要视为静态或动态类型。
答案 2 :(得分:1)
如果你问的是支持两种习语的技术能力,那不是一个特别有趣的问题。只需看看大多数现代语言,看看他们是如何做到的。通常,它是通过某种全能动态类型(VB中为Object
,C#中为dynamic
,C中为void*
,依此类推。)
在形而上学/本体论层面,这个问题更有趣......
物理学理论可能会提出违背直觉的行为,导致人们问:“这怎么可能?”例如,波粒二象性超越了现实或应该如何的任何常识性概念,因此它让我们思考无法估量的。
然而,编程语言不是现实的模型。它们是思想的发明,旨在服务于我们的目的。因此,思考编程语言是如何形成它的方式毫无意义。就是这样,因为我们希望它是这样的;因为它符合我们的目的。没有必要或保证其他原因。所以请理解,当我回答一种语言既动态又静态,因为它可以,并且因为这是有用的,我不是轻浮或不屑一顾。试图进一步探讨是没有希望的。
答案 3 :(得分:1)
C是一种静态类型语言,但它可以灵活地将类型重新转换为其他类型,并使用通用指针(void *类型)。 void *类型表示“指向未指定类型数据的指针”。 Objective-C通过使用这些void *类型来实现其动态类型,尽管通常这是由多个定义类型,typedef等抽象出来的。
答案 4 :(得分:0)
Objective-C混合了静态和动态类型。普通C对象是静态类型的,但Objective-C对象是动态类型的。只要对象识别发送给对象的消息,Objective-C运行时就不关心对象是什么类型。
答案 5 :(得分:-1)
静态类型语言和动态类型语言确实是对立的 - 至少通常使用这些术语。
静态类型语言是在编译期间(或至少在代码执行之前)包括类型检查(和报告)阶段的语言。目标C肯定有这个,所以是静态类型。
动态类型语言是缺乏这种类型检查阶段的语言。因此,目标C不是通过这个定义动态输入的 - 我认为这是最标准的定义。
但是,Objective C有时被称为动态类型(除了静态类型),因为它允许程序员在其代码的某些部分中指定简化的静态类型检查 - 特别是对于通过特殊静态类型id
的对象。就我个人而言,我认为它是一种静态类型语言并且对动态类型对象有很好的支持会更容易让人困惑。
请注意,几乎所有静态类型的语言都包含对动态类型的一些支持,因为例如,它们使用运行时检查来捕获除零错误,数组边界错误,向下转错错误等。这样的事情不能证明调用一种动态输入的语言,否则几乎所有语言都必须动态输入。