写点什么

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

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

关注

评论

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

9. 数据类型 - 列表详解

茶桁

Python

行业信创-太极信创研习院第36期ITAIP信创精华班央企专场培训在京成功举办

电子信息发烧客

【我和openGauss的故事】 openGauss 5.0.0 事务相关语法

daydayup

【开源三方库】Aki:一行代码极简体验JS&C++跨语言交互

OpenHarmony开发者

OpenHarmony

再获殊荣!AlphaSights荣获猎聘“2022年度非凡雇主”称号

科技热闻

父子线程共用线程池

soap said

【我和openGauss的故事】使用Ora2Pg迁移oracle数据到openGauss

daydayup

openGauss数据库源码解析系列文章—安全管理源码解析(五)

daydayup

【我和openGauss的故事】openGauss 5.0.0企业版x86单机安装

daydayup

大语言模型推理性能优化之七策

Baihai IDP

人工智能 大模型 白海科技 推理优化 大模型推理

Gartner 首发中国数据分析与人工智能技术成熟度曲线,TDengine 入选

爱倒腾的程序员

Java 文字转图片输出,Java 输出透明背景图片,Java文字转图片防爬虫

java易二三

Java 程序员 爬虫 计算机 电脑

【我和openGauss的故事】带有out参数的存储过程及自定义函数的重载测试

daydayup

【我和openGauss的故事】为集群增加VIP

daydayup

在 Go 语言单元测试中如何解决 Redis 存储依赖问题

江湖十年

后端 单元测试 Go 语言 redis'

盘点一对一直播源码的那些小功能

山东布谷网络科技

源码 社交APP 一对一直播

【我和openGauss的故事】可视化运维平台openGauss Datakit带你轻松玩转openGauss 5.0

daydayup

华为发布数字资产继承功能

HarmonyOS SDK

华为 HarmonyOS HMS Core

openGauss数据库源码解析系列文章—安全管理源码解析(五)

daydayup

小模型赋能大电网,手机拍照来建档

飞桨PaddlePaddle

人工智能 百度 paddle 飞桨 百度飞桨

如何在短视频中合成“虚拟数字人”?

阿里云CloudImagine

云计算 剪辑 视频云 数字人

图数据库使用及业务场景

小小怪下士

Java MySQL 数据库

倒计时2天 | 第六届openGauss技术文章征集活动最新初审合格名单(截至8.3)

daydayup

MaxCompute发布按量付费闲时版,计算成本最高节省66.66%!

阿里云大数据AI技术

MaxCompute

[腾讯云 Cloud studio 实战训练营] 制作Scrapy Demo爬取起点网月票榜小说数据

ベ布小禅

MTK 2.9.2 迁移Oracle 11g 至 openGauss 5.0.0操作指南

daydayup

5个高并发场景优化的衡量指标

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 8 月 PK 榜

仪表板修改优化实操案例

搞大屏的小北

数据看板 大屏布局 大屏设计 大屏设计优化 数据看板优化

山东布谷科技详解Android端直播应用源码保持优质直播质量的技术(三):可变比特率

山东布谷科技

android 软件开发 源码搭建 直播应用源码 可变比特率

Spring高手之路11——BeanDefinition解密:构建和管理Spring Beans的基石

砖业洋__

spring BeanDefinition Bean配置

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