9 月 13 日,2025 Inclusion・外滩大会「开源嘉年华」正在限量报名中! 了解详情
写点什么

给 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:394278
用户头像

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

关注

评论

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

[Python]介绍

謓泽

Python 2月月更

学生管理系统的架构设计

凌波微步

「架构实战营」

Pulsar 职位广场 | 腾讯、华为云、虾皮、众安保险、StreamNative 等多个热招岗位

Apache Pulsar

开源 架构 云原生 招聘 Apache Pulsar

鲲鹏DevKit & BoostKit直播解密:如何“做开发者的开发者”

科技热闻

学生管理系统架构设计文档

阿卷

架构实战营

好用不卡,这些插件和配置让你的 Webstorm 更牛逼!

前端下午茶

前端 工具 webstorm

基于CC2530设计的智能风扇

DS小龙哥

2月月更 智能风扇

[Python]第一章(建议收藏)

謓泽

Python 2月月更

eBPF 完美搭档:连接云原生网络的 Cilium

火山引擎边缘云

边缘计算 ebpf 云原生网络 cllium

数据库读写分离如何保证主从一致性?

蜜糖的代码注释

MySQL 数据库 2月月更

VIPKID基于Karmada的容器PaaS平台落地实践

华为云原生团队

开源 Kubernetes k8s多集群管理 混合云 分布式云

开源| 直播推拉流2.0升级了什么

anyRTC开发者

开源 音视频 屏幕共享 视频直播 美颜滤镜

C++异常处理机制

正向成长

c++ 异常处理

80%的软件环境管理问题,根因都在这里 | 研发效能提升36计

阿里云云效

阿里云 DevOps 云原生 持续交付 部署

工作想法小计(2):2/14 - 2/18

非晓为骁

个人成长

UMEM:友盟统计自定义事件多应用一键同步 & 批处理工具

SamgeApp

Docker Vue 友盟助手 友盟自定义事件批处理 友盟统计

用简单例子带你了解联合索引查询原理及生效规则

华为云开发者联盟

sql 索引 查询 联合索引

十年所学,梦想终至,不负时光 | 《云端架构》新书首推发布,来自极度努力的吕校长

博文视点Broadview

大厂偏爱的Agent技术究竟是个啥

捉虫大师

架构 agent

OpenHarmony移植案例与原理:如何适配服务启动引导部件bootstrap_lite

华为云开发者联盟

OpenHarmony 移植 bootstrap_lite startup 系统服务

Python 中的数组哪去了?

宇宙之一粟

Python 数组 2月月更

面试突击25:sleep和wait有什么区别?

王磊

java面试

上海市宝山区委书记陈杰一行参访旺链科技

旺链科技

区块链 产业区块链 Vone新闻

ko在数栈中的应用

袋鼠云数栈

凡泰极客成为W3C成员并加入MiniApps工作组,将积极参与小程序快应用技术标准化进程

FinClip

小程序

学生管理系统的架构文档

卡西毛豆静爸

「架构实战营」

关于MVVM和MVC,面试看这篇就够了

山河已无恙

mvc 全栈 MVVM 2月月更

Nginx跨域解决配置示例

nginx 跨域

盘一盘常见的6种索引失效情况

华为云开发者联盟

MySQL 索引 字符串 查询 索引失效

如何打造一个能自动回复的钉钉机器人

老表

Python 机器人 Linxu 跟老表学云服务器

CSS实现阮大佬博文的阅读进度功能

战场小包

CSS css3 前端 2月月更

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