Aaron Hillegass 是知名的Objective-C开发者和布道者,他于90年代在NeXT公司工作,后来专注技术布道,是 Big Nerd Ranch 的创始人兼CEO。他撰写了多本Objective-C书籍,在苹果发布Swift后,目前他开始将布道重心转向Swift。在6月8日举办的 AltConf2015 上,他向与会者做了《 给Objective-C的悼词 》的演讲,回顾了Objective-C的发展和它的影响,但在最后他话锋一转,说明了为什么Objective-C没有真正死亡。
要回顾Objective-C真正的起源,我们需要从1962年谈起。在那个连互联网都没有的年代,在NR计算中心的两个小伙为了改善 ALGOL ,创造了 Simula ,并在1967年发布了Simula-67. 它第一次使用了点式语法,从此你使用对象方法就用小圆点去调用了。
稍后, Smalltalk 团队开始打造另外一个面向对象语言,到1980年他们推出了“标签:变量”风格的语言Smalltalk。Smalltalk做了很多超前的事情,它不仅仅是一个语言,还包括一个完整的操作系统。方括号也是它引入到编程语言中的,Smalltalk使用它处理变量,Objective-C则用它来放置消息。
研发Smalltalk的那群人后来去了施乐帕洛阿图研究中心,继续鼓捣他们感兴趣的东西。
Smalltalk十分超前,对后来者有很大的影响,但它的问题在于,使用Smalltalk需要完全抛弃以前的东西,并需要你成为它的一部分,这无论对于开发者还是用户都不是很友好。
后来一个叫 Brad Cox 的人来了,他认为与其进行语言革命,不如进行渐进式的创新。他拿一个大家熟悉的系统级编程语言,然后给它加上面向对象的Smalltalk风格的消息传递,这就是Objective-C的由来。Brad Cox在他的书籍《 Object-Oriented Programming: An Evolutionary Approach 》中解释了这些。
Brad Cox和Objective-C的联合创始人 Tom Love 为这门语言创建了公司以专门支持它,这就是Stepstone。但是,Stepstone版本的语言仅仅是一个C语言的预处理器或者说编译器,它会将消息传递转换为C语言的函数。此时它还没用引用计数等功能,其标准库为ICpak 210.
此时它也并不叫Objective-C,等到NeXT从Stepstone购买下这个语言的商标时,它才改名叫“Objective C”,并且加入了点式语法。
NeXT将Objective-C作为它编写GUI的工具,毫无疑问这是物尽其用的,因为GUI天生适合使用面向对象的语言来编写——GUI里的控件就是一个一个的对象。
NeXT的GUI系统包含一个PostScript服务器,里面都是用Objective-C编写的GUI对象。不过当时的系统还很粗糙,当项目逐渐变大后出现了很多问题。
此时Scott Ritchie、Steve Naroff、Blaine Garst等人出来拯救世界。他们给Objective-C带来了更多的特性和更好的性能。诸如blocks、动态机制、缓存机制等特性都是他们创造的。
由于引入了Smalltalk中的很多理念和特性,在那个年代,Objective-C在很多方面很先进,甚至超越时代。
Objective-C的一个美妙的地方是它的动态特性。这给我们带来很多好处。比如在很早的时候它就有内省(introspection),但直到Java出了这个API并给它命名之后我们才知道它是什么;然后是弱类型,最初所有变量的类型都是id对象,后来才称这种类型为NSArray*,它对于unarchiving和target-action模式很有用;然后是isa-swizzling,faulting机制就是利用它来提高性能;以及在运行时创建类的能力,虽然一般编程中很少用到,但KVO正是依靠了这个机制。
另外还有一个特性现在人们认为非常好,但当时认为简直是疯了,那就是category。它改变了我们编程的方式,以及对frameworks的看法,不过因为它违反了当时人们认为的面向对象编程的教条,当时Java派的人不是很喜欢它。
自Objective-C被NeXT收购后,介绍Objective-C的书籍纷纷出炉。当时有《 Objective-C: Object-Oriented Programming Techniques 》和《 Object-Oriented Programming and the Objective-C Language 》,后者有NeXT出品,是当时介绍Objective-C最好的书籍。
当NeXT意识到语言中存在的问题后,它们开始重写OpenStep操作系统,这次他们给Objective-C加上了引用计数、前缀、更多的类型等。OpenStep还被授权给Sun公司使用,作为交易的一部分,OpenStep需要以某种方式开源,于是他们创建了 GNUstep项目 ,这是OpenStep的一个实现,继承了OpenStep的大部分API。
但是,改进后的Objective-C仍然存在问题,就是它的基类很脆弱,里面定义了大量的实例变量,导致后期无论是对基类进行修改还是另建基类都很困难。
Objective-C 2.0的出现解决了这个问题,它还添加了快速枚举、GC以及后面的ARC等。但是,有些历史遗留问题仍然没有得到解决。
但是,无论如何改进,改变不了Objective-C已经存在几十年的事实,有些历史遗留问题无法解决,有些语言特性也已经落后时代。只有另起炉灶才能彻底消灭这些问题,而苹果陷入有魄力去做这一件事。
Swift相对于Objective-C是一个很大的进步,它的C语言风格更少,更加现代,因此我们可能会损失一些底层的编程能力,但它也给开发者工具带来了更多创新的可能性,比如Playgrounds。
但Swift也并不是毫无缺点,为了保持和Objective-C的互操作性,在有些地方不得不做妥协,苹果在继续发展Objective-C和彻底抛弃UIKit之间选择了一条中间道路,这就是Swift。
但是,Objective-C并没有真正死亡,苹果在Objective-C的库上投入了很多,如UIKit、AppKit、Foundation等。所有苹果软件都基于Objective-C编写,并且苹果仍在积极的改进这门语言,比如最近添加的模板、non-nil类型,毫无疑问Objective-C仍将在苹果的生态系统中存在很长时间。
并且,Aaron Hillegass认为,Objective-C仍然是编写与C/C++语言代码交互的最佳选择,Swift更适合高级别一些的事情。
不过,就连Aaron Hillegass本人都转向了Swift的布道,这说明Swift值得目前就投入精力去学习和研究。
Objective-C自从NeXT时代开始,就深深打上了苹果的烙印,它具体还能走多远,还要看苹果对它的支持,但至少目前,它还没有死亡。