在 90 年代,苹果努力将最初的 Mac OS(1984 年为资源受限的 Macintosh 128K 机器编写)提升到现代操作系统的标准。OS X 的诞生故事本身就令人激动,但简而言之,苹果最终收购了史蒂夫·乔布斯的第二家电脑公司 NeXT,并将其 NeXTSTEP 操作系统用作新一代 Mac 的基础。
苹果于 1996 年 12 月 20 日宣布收购 NeXT,指出希望获得 NeXT 的面向对象的软件开发技术及其操作系统专业知识。作为交易的一部分,乔布斯重返苹果,最终接任首席执行官,并将该公司打造成当今的消费电子巨头。十六年后,NeXT 开发或倡导的几种技术仍在 OS X 及其移动版本 iOS 中幸存。本周,我们回顾了其中一些继续为苹果设备的关键功能提供动力的技术。
**UNIX**
我们咨询了几位了解 NeXTSTEP 和 OS X 的开发人员;他们一致认为,NeXTSTEP 的一个关键特性,使 OS X 和 iOS 成为今天的样子,就是其底层的 UNIX 根源。在所有光滑的窗口、图标、滚动列表和按钮之下,都隐藏着一个坚如磐石的、经过认证的 UNIX 操作系统。
UNIX 最初由贝尔实验室的肯·汤普森于 1969 年为 PDP-7 小型机构想。它在 70 年代初的发展导致汤普森的同事丹尼斯·里奇开发了 C 编程语言。UNIX 的核心目的是成为当时大型计算机的强大操作系统,但开发人员也可以使用简单的视频终端轻松地对其进行编程和控制。
相同的系统驱动着您桌上的 Mac 和口袋里的 iPhone。通过将 OS X(以及后来的 iOS)建立在 UNIX 基础上,Mac 最终能够享受受保护的内存、抢占式多任务处理和基于守护程序的服务等重要的操作系统功能。
老一辈的人可能还记得经典 Mac OS 的日子。一些错误的 Photoshop 插件可能会导致整个 Mac 崩溃,或者 Mac OS 在您浏览菜单寻找某些神秘命令时可能会停止响应。受保护的内存意味着大多数 OS X 上的应用程序崩溃将不再导致整个机器崩溃。抢占式多任务处理意味着即使一个应用程序可能由于使用系统资源而被占用,您的计算机也可以继续执行其他任务。
使用抢占式多任务处理,基于 UNIX 的操作系统还可以使用守护程序,即在后台持续运行的小程序。守护程序在后台等待信号以采取行动;它们处理大多数后台任务,例如连接到 Mac 上的网络打印机或在您在 iPhone 上玩 Words With Friends 时播放音乐。
此外,由于 OS X 完全符合 POSIX 标准(所有 UNIX 操作系统都遵循的一组定义的标准),因此将免费提供的工具或开源软件移植到 OS X 相对简单。例如,最初为 Linux 开发的流行的 FFmpeg 音频/视频编码器也为 OS X 的某些视频编码应用程序(如 Handbrake)提供支持。
**Objective-C**
Objective-C 编程语言用于开发 NeXTSTEP 操作系统的软件,并延续到 OS X 和 iOS。它是一种面向对象的编程语言,作为原始 C 语言的超集开发,以便在同一程序中组合面向对象的 Objective-C 代码和过程式 C 代码。
史蒂夫·乔布斯是面向对象编程的坚定支持者,他主要围绕为开发人员提供以这种风格编程的工具来构建 NeXT。在高级别,面向对象编程使用一组在代码中定义的“对象”,这些对象具有某些特征和功能。然后,开发人员可以混合和匹配这些对象,将消息从一个对象传递到另一个对象,以完成特定任务。开发人员不需要了解对象的底层代码,只需要知道对象响应哪些消息以及它可以生成哪些响应。
(想象一个“添加”对象,您可以向其发送包含两个数字的消息;它的响应自然可能是这两个数字的总和。)
虽然 Objective-C 有其批评者——主要是由于其冗长的、Smalltalk 风格的语法——但苹果一直在努力通过添加点语法、块和自动引用计数等功能来改进该语言。该公司还通过用 Clang 和 LLVM 替换传统的 C 编译器 gcc 来显著改进了编译代码。(下面是一个简单的 Objective-C 程序。)
乔布斯在 1995 年(仍在 NeXT 时)的一次采访中表示,与之前 20 或 30 年相比,面向对象开发将彻底改变我们创建软件的方式。我们交谈过的开发人员倾向于同意他的预测。
“Objective-C 直接启发了 Java 和 C#,并且改变了几乎所有人的编程方式,即使他们不是为 Apple 的机器编写程序,”开发人员 Wil Shipley 说,他开始在 NeXT 计算机上编写软件。“我们在 NeXTSTEP 上看到了万维网的发明。这并非巧合;这是一台非常适合编程的机器。”
Shipley 还指出,我们今天仍在 OS X 上使用的几个应用程序是受最初为 NeXT 平台开发的软件启发或改编的,包括 Numbers(原名 Parasheet)、Keynote(原名 Concurrence)、Pages 和 OmniGraffle(原名 Diagram!)
**AppKit 框架**
除了使用 Objective-C 语言之外,NeXT 还开发了预构建对象的集合,开发人员可以使用这些对象来构建软件。其中许多都包含在 AppKit 框架中,苹果将其改编为 OS X 的 Cocoa,后来又改编为 iOS 的 Cocoa Touch。这些框架有助于消除应用程序开发中通常需要的某些繁琐的重复编码,让开发人员专注于核心功能和可用性。
Cocoa 和 Cocoa Touch 框架包含大多数现代软件所需的所有基本构建块和功能,但 Cocoa 的 NeXTSTEP 根源仍然在像 NSArray 这样的对象类名中很明显,这些类名仍然以“NS”前缀开头。
“我一直相信,如果你给程序员一些帮助,你将会看到惊人的东西,”Shipley 解释道。“如果没有 [2008 年] 推出的 SDK,iPhone(和 iOS)今天会是什么样子?我认为它只会是一款 iPod——仍然是一款畅销产品,但并没有改变我们生活的方方面面。”
开发人员 Mike Lee 在 Delicious Monster 和 Apple 的开发者关系部门与 Shipley 共同工作,然后在 New Lemurs 独自创业,他这样解释了 OS X 和 iOS 的 UNIX 基础、Objective-C 编程语言和 Cocoa 框架之间的联系:
这里列出的大多数事物之间都存在关联。计算机是 UNIX,而 C 是 UNIX 的语言。Objective-C 是一种面向人类的语言(变体),Smalltalk 在 C 中实现。AppKit 及其 Cocoa 亲属让我们能够像与机器交流一样轻松地与用户交流。我们(开发人员)是人和计算机之间的外交官。
**Interface Builder**
一个重要的 NeXTSTEP 开发工具至今仍然存在,那就是 Interface Builder。这个应用程序允许开发人员只需将用户界面元素拖放到视图中,即可创建应用程序的用户界面。需要一个按钮来访问某个功能?拖一个进来。需要一个下拉列表让用户从几个选项中进行选择?点击一下,它就出现了。
Interface Builder 与 Project Builder 一起打包。这两个应用程序共同为即使是新手开发人员提供了从头开始构建 GUI 应用程序所需的一切。
更好的是,开发人员 Gus Mueller 对 Ars 说,价格也是如此。“这就像一个昂贵的 IDE,他们免费提供给人们,”他说。
Interface Builder 作为 NeXTSTEP 和 OS X 的一部分,多年来一直是一个独立的应用程序。苹果此后将其功能直接集成到其改进版本的 Project Builder 中,现在称为 Xcode。除了分析和调试工具之外,苹果仍然免费提供构建 Mac、iPhone 或 iPad 应用程序所需的一切。
**显示 PostScript**
并非所有在 OS X 或 iOS 中延续的 NeXT 技术都以开发人员为中心。用户可以看到的一项明显的技术(尽管它在今天以完全不同的形式存在)是 Display PostScript。
90 年代带有图形用户界面的计算机(包括 Mac OS)使用像素网格在屏幕上绘制所有内容。每个窗口、按钮、文本块等都将逐个像素以一对一映射的方式绘制。
NeXTSTEP 反而使用 Display PostScript(Adobe 用于激光打印机的页面描述语言的变体)来绘制屏幕上的窗口和文本。这意味着文本和基于矢量的元素将始终以尽可能清晰的分辨率绘制,而与连接的图形卡或显示器无关。实际上绘制字体和其他元素的过程被抽象化,直到最终在屏幕上呈现。
OS X 和 iOS 使用一种不同的技术,称为 Quartz,但它基于类似的概念。Quartz 的核心是 PDF 页面描述语言,而不是 PostScript。除了生成清晰的窗口和文本外,该系统还使 OS X 用户能够以原生方式查看和创建 PDF 文件。
**捆绑包**
OS X 和 iOS 都使用 NeXTSTEP 中的一个概念,称为“捆绑包”。捆绑包只不过是包含特定应用程序或文件类型所需多个文件的特殊文件夹。操作系统在底层将这些捆绑包视为包含文件(或更多文件夹!)的文件夹,但在高级别,用户将捆绑包视为由图标表示的单个文件。
用户在桌面上经常交互的两个常见捆绑包是应用程序和 iWork 文件。应用程序捆绑包包含可执行代码文件以及自定义图形资源、图标、配置文件等。类似地,Keynote 演示文稿将包含一个二进制布局文件,以及嵌入的图形、自定义字体和在 Keynote 中打开和重新创建演示文稿所需的模板元素。(您可以在 Finder 中按住 Control 键并单击捆绑包以浏览其内容。)
**列文件浏览**
从 NeXTSTEP 延续到 OS X 的一个重要的界面元素是列文件浏览器。在 OS X 之前,经典的 Mac OS Finder 窗口可以显示特定文件夹中包含的文件的图标网格或排序列表。虽然 Apple 在 Finder 中保留了这些视图,但它还添加了一个分层浏览视图,该视图使用一系列列来深入文件夹。
在列视图的左侧,您通常会选择一个根源,例如“Macintosh HD”或您自己的“文档”文件夹。单击文件夹将在右侧打开一个包含该文件夹内容的列。单击另一个文件夹,其内容将在右侧打开一个新列。您可以继续单击文件夹以导航特定文件夹或磁盘驱动器的有时复杂的组织结构。
**服务**
在 NeXT 开发的最后一个面向用户的特性通常在 OS X 中被忽略,那就是“服务”。应用程序和系统组件可以告诉 OS X 它们可以对某些数据元素(如文本、图像或其他数据位)执行某些操作。选择其中一些数据后,您可以单击应用程序 > 服务,查看可用于该数据哪些选项。
例如,如果在 TextEdit 中选择了一些文本,则可能的服務包括:在词典中查找文本、使用 Twitter 发布文本、使用所选文本在正文中创建新电子邮件或使用 OS X 的文本转语音功能将文本转换为 iTunes 中的语音轨道。
一些服务可通过上下文菜单使用,因此您可能之前通过按住 Control 键并单击某些文本或其他数据看到了其中一些选项。某些服务甚至有键盘或手势快捷方式,例如 Cmd-shift-3 截屏,或者用三个手指点按某个单词以进行词典查找。
这些服务并不总是被广泛宣传,并且并非所有服务都显示在上下文菜单中。但是服务菜单始终存在,为那些愿意查找服务的人提供额外的功能或节省时间的快捷方式。
**回顾过去,展望未来**
此处描述的许多技术是在 80 年代后期和 90 年代初期开发的(UNIX 可追溯到 1969 年!)。然而,即使在 Apple 收购 NeXT 16 年后,这些技术以及更多技术也为我们提供了许多仍在 OS X 中使用的功能。还有我们没有提到的其他您(Mac 用户)心爱的功能吗?请告诉我们这些功能是什么以及它们对您的日常生活意味着什么。