Objective-C 的由来 转自维基百科

来源:互联网 发布:linux内核启动流程 编辑:程序博客网 时间:2024/05/01 08:13

点击打开链接  

 Objective-C是一种通用、高级、面向对象的编程语言。它扩展了标准的ANSI C编程语言,将Smalltalk式的消息传递机制加入到ANSI C中。它是苹果的OS X和iOS 操作系统,及其相关API、Cocoa和Cocoa Touch的主要编程语言。

  Objective-C最初源于NeXTSTEP操作系统,之后在OS X和iOS继承下来。目前主要支持的编译器有GCC和LLVM(采用Clang作为前端),苹果公司在Xcode 4.0之后均采用LLVM作为默认的编译器。最新的Objective-C特性也都率先在Clang上实现。

  

历史

1980年代初,Stepstone 公司的 Brad Cox 与 Tom Love 发明了 Objective-C。 1981年,当他们两人还在ITT公司技术中心任职时,接触到了一个名为 SmallTalk-80 的语言,恰巧 Cox 当时对软件设计中的重用问题非常感兴趣,于是他马上就意识到了 SmallTalk-80 这个语言在软件建构中无法衡量的巨大价值,但同时 Cox 与 Love 也明白,在目前的ITT公司中,引入技术最重要的关键是与 C 语言兼容。

于是 Cox 开始撰写一个 C 语言的预处理器,打算使 C 语言具备些许 Smalltalk 的本领。Cox 很快实现出了一个可用的 C 语言扩展,此即为 Objective-C语言的前身。到了 1983 年,Cox 与 Love 合伙成立了 Productivity Products International(PPI)公司,将 Objective-C 及其相关库商品化贩售,并在之后将公司改名为 StepStone。1986年,Cox 出版了一本关于 Objc 的重要著作《Object-Oriented Programming, An Evolutionary Approach》,书内详述了 Objective-C 的种种设计理念。

1988年,乔布斯(Steve Jobs)离开苹果公司后成立了 NeXT Computer 公司,NeXT 公司买下 Objective-C 语言的授权,并扩展了著名的开源编译器GCC 使之支持 Objective-C 的编译。并基于 Objective-C 开发了 AppKit 与 Foundation Kit 等等库,作为 NeXTSTEP 的的用户接口与开发环境的基础。虽然 NeXT 工作站后来在市场上失败了,但 NeXT 上的软件工具却在业界中被广泛赞扬。这促使 NeXT 公司放弃硬件业务,转型为销售NeXTStep(以及OpenStep)平台为主的软件公司。

1992年,自由软件基金会的 GNU 开发环境增加了对 Objective-C 的支持。1994年,NeXT Computer公司和Sun Microsystem联合发布了一个针对 NEXTSTEP 系统的标准典范,名为 OPENSTEP。OPENSTEP 在自由软件基金会的实现名称为 GNUstep。1996年12月20日,苹果公司宣布收购 NeXT Software 公司,NEXTSTEP/OPENSTEP环境成为苹果操作系统下一个主要发行版本OS X的基础。这个开发环境的该版本被苹果公司称为Cocoa。

语法

Objective-C是C语言的严格母集合,意思是任何原始的C语言程序不经修改就可以直接通过Objective-C编译器,在Objective-C中使用C语言代码也是完全合法的。Objective-C形容自己是盖在C语言上的薄薄一层,因为Objective-C的原意就是在C语言主体上加入面向对象的特性。Objective-C的面向对象语法源于Smalltalk信息传递风格。所有其他非面向对象的语法,包括变量类型,预处理器(preprocessing),流程控制,函数声明与调用皆与C语言完全一致。

Hello World

这里示范了一个基础的Hello World程序。基于Xcode 4.3.1 xcode:

#import <Foundation/Foundation.h> int main(int argc, char *argv[]) {     @autoreleasepool {        NSLog(@"Hello World!");    }    return 0;}

信息传递[编辑]

Objective-C最大的特色是承自Smalltalk的信息传递模型(message passing),此机制与今日C++式之主流风格差异甚大。Objective-C里,与其说对象互相调用方法,不如说对象之间互相传递信息更为精确。此二种风格的主要差异在于调用方法/传递模型这个动作。C++里类型与方法的关系严格清楚,一个方法必定属于一个类型,而且在编译时(compile time)就已经紧密绑定,不可能调用一个不存在类型里的方法。但在Objective-C,类型与信息的关系比较松散,调用方法视为对对象发送信息,所有方法都被视为对信息的回应。所有信息处理直到运行时(runtime)才会动态决定,并交由类型自行决定如何处理收到的信息。也就是说,一个类型不保证一定会回应收到的信息,如果类型收到了一个无法处理的信息,程序只会抛出异常,不会出错或崩溃。

C++里,送一个信息给对象(或者说调用一个方法)的语法如下:

obj->method(argument);

Objective-C则写成:

[obj method: argument];

此二者并不仅仅是语法上的差异,还有基本行为上的不同。

这里以一个汽车类(car class)的简单例子来解释Objective-C的信息传递特性:

[car fly];

典型的C++意义解读是“调用car类型的fly方法”。若car类型里头没有定义fly方法,那编译肯定不会通过。但是Objective-C里,我们应当解读为“发提交一个fly的信息给car对象”,fly是信息,而car是信息的接收者。car收到信息后会决定如何回应这个信息,若car类型内定义有fly方法就运行方法内之代码,若car内不存在fly方法,则程序依旧可以通过编译,运行期则抛出异常。

此二种风格各有优劣。C++强制要求所有的方法都必须有对应的动作,且编译期绑定使得函数调用非常快速。缺点是仅能借由virtual关键字提供有限的动态绑定能力。Objective-C天生即具备鸭子类型之动态绑定能力,因为运行期才处理信息,允许传送未知信息给对象。可以送信息给整个对象集合而不需要一一检查每个对象的型态,也具备消息转送机制。同时空对象nil接受信息后默认为不做事,所以送信息给nil也不用担心程序崩溃。

Objective-C的方法调用因为运行期才动态解析信息,一开始信息比C++ virtual成员函数调用速度慢上三倍。但经由IMP高速缓存改善,目前已经比C++的virtual function快上50%[来源请求]



0 0