写点什么

给 Objective-C 的“悼词”

  • 2015-08-14
  • 本文字数:2480 字

    阅读完需:约 8 分钟

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 的发展历程

要回顾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、动态机制、缓存机制等特性都是他们创造的。

Objective-C 的先进性

由于引入了 Smalltalk 中的很多理念和特性,在那个年代,Objective-C 在很多方面很先进,甚至超越时代。

Objective-C 的一个美妙的地方是它的动态特性。这给我们带来很多好处。比如在很早的时候它就有内省(introspection),但直到 Java 出了这个 API 并给它命名之后我们才知道它是什么;然后是弱类型,最初所有变量的类型都是 id 对象,后来才称这种类型为 NSArray*,它对于 unarchiving 和 target-action 模式很有用;然后是 isa-swizzling,faulting 机制就是利用它来提高性能;以及在运行时创建类的能力,虽然一般编程中很少用到,但 KVO 正是依靠了这个机制。

另外还有一个特性现在人们认为非常好,但当时认为简直是疯了,那就是 category。它改变了我们编程的方式,以及对 frameworks 的看法,不过因为它违反了当时人们认为的面向对象编程的教条,当时 Java 派的人不是很喜欢它。

对 Objective-C 的改进

自 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 等。但是,有些历史遗留问题仍然没有得到解决。

Swift 的出现

但是,无论如何改进,改变不了 Objective-C 已经存在几十年的事实,有些历史遗留问题无法解决,有些语言特性也已经落后时代。只有另起炉灶才能彻底消灭这些问题,而苹果陷入有魄力去做这一件事。

Swift 相对于 Objective-C 是一个很大的进步,它的 C 语言风格更少,更加现代,因此我们可能会损失一些底层的编程能力,但它也给开发者工具带来了更多创新的可能性,比如 Playgrounds。

但 Swift 也并不是毫无缺点,为了保持和 Objective-C 的互操作性,在有些地方不得不做妥协,苹果在继续发展 Objective-C 和彻底抛弃 UIKit 之间选择了一条中间道路,这就是 Swift。

慢着,Objective-C 未死

但是,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 时代开始,就深深打上了苹果的烙印,它具体还能走多远,还要看苹果对它的支持,但至少目前,它还没有死亡。

2015-08-14 08:393963
用户头像

发布了 164 篇内容, 共 109.7 次阅读, 收获喜欢 392 次。

关注

评论

发布
暂无评论
发现更多内容

从互联网到国企、从一线城市到三线省会

WizInfo

具备捕获 Web2 用户能力的 PoseiSwap,治理通证$POSE再度涨超 360%

股市老人

手把手教学小型金融知识图谱构建:量化分析、图数据库neo4j、图算法、关系预测、命名实体识别、Cypher Cheetsheet详细教学等

汀丶人工智能

人工智能 深度学习 nlp 知识图谱 命名实体识别

阿里P6跟P7有什么区别?

程序员小毕

Java 阿里巴巴 程序员 后端 架构师

上个大学,竟然被割韭菜了?

Jackpop

考上211,录取到天坑专业。。。

Jackpop

基于自定义数据源的LangChain的聊天

派大星

#LangChain

金融时间序列预测方法合集:CNN、LSTM、随机森林、ARMA预测价格(适用于时序问题)、相似度计算、各类评判指标绘图(数学建模科研适用)

汀丶人工智能

人工智能 数据挖掘 机器学习 数学建模 LSTM

你可能不知道现在的Java面试有多卷!

程序员小毕

程序员 高并发 架构师 java面试 八股文

具备捕获 Web2 用户能力的 PoseiSwap,治理通证$POSE再度涨超 360%

西柚子

具备捕获 Web2 用户能力的 PoseiSwap,治理通证$POSE再度涨超 360%

BlockChain先知

【 INFINI Workshop 上海站】7 月 27 日一起动手实验玩转 Easysearch

极限实验室

上海 Workshop 极限科技

某米重新定义了985。。。

Jackpop

一些容易被忽略的测试场景

QE_LAB

移动端测试 测试场景

使用 Kind 体验 Kasten K10 备份还原 K8S 集群 (二)

吴威

Kubernetes 容器 k8s veeam 备份 & 恢复

拼多多最新面经出炉:项目+八股+算法+场景全都问了个遍

程序员小毕

程序员 算法 高并发 项目 java面试

【Redis故障排查】「连接失败问题排查和解决」带你深入分析一下Redis阻塞原因以及问题排查方案指南

洛神灬殇

redis 分布式架构 解决方案 技术分析 性能优化分析

具备捕获 Web2 用户能力的 PoseiSwap,治理通证$POSE再度涨超 360%

大瞿科技

具备捕获 Web2 用户能力的 PoseiSwap,治理通证$POSE再度涨超 360%

威廉META

QEMU之CPU虚拟化(一):CPU虚拟化介绍

Linux内核拾遗

虚拟化 qemu kvm

Dialpad 的“野心” ,不止于 2 亿美元 ARR

CnosDB

时序数据库 开源社区 CnosDB

985的分数,却毅然选择了普本。

Jackpop

给Objective-C的“悼词”_移动_徐川_InfoQ精选文章