请选择 进入手机版 | 继续访问电脑版

苹果发烧友论坛

 找回密码
 注册
查看: 9409|回复: 47

[分享] 【连载】Mac OS X 背后的故事--MAC用户必读长知识长文

[复制链接]
发表于 2012-7-19 23:28:27 | 显示全部楼层 |阅读模式
Mac OS X 背后的故事(一)力挽狂澜的Ellen Hancock

文 / 王越

作者王越,美国宾夕法尼亚大学计算机系研究生,中国著名TeX开发者,非著名OpenFOAM开发者。

本文分9篇,连载于《程序员》杂志。


从本期开始,我们将在杂志上连载一系列关于Mac OS X发展历史的文章。本系列将为大家介绍Mac OS X的发行版本、技术历史、相关人物等内容。本文是系列连载的第一篇。


Ellen Hancock曾任苹果公司技术总监

故事还得从20世纪90年代说起。Ellen Hancock是本文的主人公,也是一位女英雄。她因在IBM的经历而被人们所熟悉。1966-1995年间,Ellen Hancock在IBM共工作了29年。1985年,她成为IBM的副主席。在1986-1988年间,Ellen Hancock担任过IBM通信产品的主席,并在1992年被选为资深副总裁。1995年9月,她被时任美国国家半导体(National Semiconductor)CEO的Gil Amelio忽悠,跳槽来到这个企业,做执行副总裁。她在这里带领团队完成了CompactRISC架构,这个架构事后成为ARM7系列的前身。很多人早已经把她忘了,也很少有人能够在回忆时将她和Mac OS X联系起来。但事实上,她是让苹果放弃Copland转而购买NeXT的关键人物。

早在1994年,Gil Amelio就找好了下家Apple,成为Apple董事会的成员。1997年2月,Gil Amelio从National Semiconductor辞职,并成为Apple的CEO。为了紧跟老板的召唤,Ellen Hancock再次被忽悠,来到了当时危机四伏的Apple。这时是1996年5月,为什么是危机四伏呢?还得从早先的事情说起。

20世纪80年代,卖可乐的John Sculley成为Apple的CEO,随之Steve Jobs被轰出Apple。毕竟可乐和计算机不是一回事,因此不管是硬件还是Mac OS,整个公司的开发项目越来越受阻。而且由于先天的不足,Mac OS从诞生之初就不具有一个现代操作系统所应有的特性。所以,在1987年,开发下一代操作系统的计划呼之欲出。具体的规划是,把新的系统所需要的功能,写在一堆卡片上。短期可实现的目标,比如增加颜色支持(当时计算机仍是黑白的),写在蓝色的卡片上;长期的目标,比如多任务功能,写在粉色的卡片上;而在可预见的未来都无法实现的长期的目标,比如加一个纯物件导向的文件系统,就写在红色的卡片上。在这样的思路下,Mac OS的开发团队马上就被分成两个组,一个叫蓝组,目标是在1991年,发布一个关于Mac OS的更新版本;另一个叫粉组,和蓝组同时工作,计划在1993年,发布一个全新的操作系统。

1991年5月13日,蓝组顺利按时完成开发任务,发布了Mac OS 7(一般被称为System 7),而粉组却没做出什么有实际用途的东西来,因此接连跳票。而且,由于Mac OS 7的发布往往缺乏人手,为了保持正常发布,常常需要从粉组抽调人员参加蓝组的开发,再加上Apple当时重心放在了和IBM等公司的合作上(Taligent项目)而不是在粉组上,最终导致了粉组项目夭折。而本来Apple指望和IBM合作的Taligent项目能开发出一个可用的新系统,但后来IBM不跟Apple继续玩了,因而Taligent的果子又吃不到,Apple相当郁闷。 这时由于Mac OS有先天不足(单任务,没有内存保护),再加上Apple以及第三方软件的无限量增加(在这段时期,单Apple自己就已经加入了QuickDraw、PowerTalk、QuickTime等软件和技术,每一个都比Mac OS本身来得大),Mac OS的问题终于大爆发。上个世纪90年代,Mac OS给人的印象就是很不稳定、经常崩溃,同Windows 95留给PC用户的印象差不多,甚至更甚。

Taligent项目挂掉后,Apple自己尝试过十多个不同的内部项目,但大多没做多久就夭折了。而这时正是Windows NT走向成熟的关键时期。眼看着日子逐渐变得不好过了,Apple开始重新开始考虑建立下一代操作系统的事情。1994年,Mac OS 7.5(Mozart)发布后,Apple推出新规划,建立一个全新的操作系统,以Copland命名(纪念 Aaron Copland,Mac OS的发布以音乐家名字命名,和Mac OS X后使用猫科动物名字很不一样),这个项目将有一个全新的内核,具有类似Windows NT 内核的所有高级特性,而老的软件都当作独立的进程模拟运行。这个项目时间紧、任务重,1995年3月公布计划,预期1996年发布。而Copland后的版本Gershwin(纪念George Gershwin),预计1997年发布,将重写Mac的所有系统主要部件,以适合新内核的各种特性。

Copland将使用微内核技术,只做任务和内存分配。除此之外的所有功能,比如文件系统、硬件驱动等作为微内核上的服务运行。而Mac OS的所有用户界面功能将成为一个独立的框架,称为蓝盒(Blue Box,今后介绍Mac OS X时,我们还会遇到这个词)。所有的任务相互独立,占用独立内存,也可以用IPC相互交流。学过操作系统的人都知道,微内核是当时的一个热词,一个系统只有被称为微内核才可被看作是先进的,当时还有针对Linux系统的著名的Tanenbaum-Torvalds笔战。但事实证明,所有本来想做成微内核系统的成功项目都放弃了原先的设计(包括NeXTSTEP、Windows NT),因为这种类似Mach微内核的系统往往难产,GNU/Mach + Hurd之类的项目做到现在经过了20年,仍未成事,一年内搞一个微内核系统谈何容易。

微内核还没搞成,Apple几乎所有开发组的成员都来添乱。大家都说自己做的东西很重要,一定要加入Copland开发组,所以QuickDraw GX、OpenDoc之类的开发组产品成为新系统的核心组件,甚至类似用户界面皮肤之类的开发组都来凑热闹,马上就使Copland成为一个无法维护的项目。开出的计划越来越长,项目越来越多,但相关进展越来越少,完成速度越来越慢。即便做出了产品,连测试人手都不够。1995年就有工程师指出,在1996年发布Copland纯粹是幻想,能1997年发布就不错了。

1996年,Gil Amelio已经掌权。在苹果电脑全球研发者大会上他开心地宣布,传说中的Copland,也就是System 8的开发版会在当年夏天发布,而正式版在秋天就可以送到每位用户手上。时任TidBITs编辑的Matt Neuburg有幸见到了这个传说中的系统。令他大吃一惊的是,这个系统在当时只能打开或关闭文件,而无法对文本文件进行编辑,甚至所有用户界面的文本框都不能输字。哪怕什么都没做,整个系统也会随机崩溃,而崩溃甚至会造成文件系统损坏。参加演示的苹果员工,则需要不断守在旁边,他们的工作是不断地格式化已崩溃的计算机磁盘,然后重装系统。那年夏天,第零个测试版送到一小簇不明真相的开发者手中,把那些脆弱的没见过世面的人吓得半死。就连Apple内部都开玩笑说Copland的正式发布日期可能得推迟到2030年。

Gil Amelio心急如焚,希望Copland快点走到正道上来。作为Gil Amelio永远的好朋友,Ellen Hancock就在这个乱糟糟的时候来到了Apple。她的职务,正是担任这个乱糟糟项目的负责人。她亲自下访各小组体察民情,了解情况。毕竟在IBM干了近三十年,她依靠自己过人的判断力在2~3个月内便得出结论,Copland这个项目是没有指望的,就按目前Apple这样的状态,Copland永远都不可能发布,还不如早点取消了好。在短期内,先把 Copland中的一些有用的成果一点点合并到老的Mac OS中,并且抓紧从外部购买一个全新系统来满足Apple的需要。正是她的这个结论,结束了Apple长达五年的纠结,使公司重新走向正轨。整个PC的黄金时代已经过去,Apple想要翻身,还有很长一段路要走。Gil Amelio支持了Ellen Hancock的计划。1996年8月,Apple取消Copland项目。开发预览版的CD封套都已制完,每个邮包上的地址都已打印就续,而CD却从未曾制出。

1996-1998年是Apple最混乱的几年。在商业上,有一阵曾传出Apple要被Sun收购的消息。更有意思的是,《连线》杂志在1997年的六月还发表了一篇文章,名为《101种拯救Apple的方法》,其中一条说最好的方式是Apple让自己被Motorola买下,成为Motorola的一个部门,做 PowerPC 系列产品。以当时的眼光来看这些建议非常讽刺好笑,以今天的眼光看更为好笑。而Ellen Hancock在这段时间内的出色工作,成功地挽救了Apple。

首先,Ellen Hancock的对内政策是继续Mac OS 7.5的开发工作,一步步把Copland中的技术并到7.5中。同时,也大量购买第三方的系统增强包,包括插件管理工具、层次化菜单等技术。Apple把它们买过来,整合到现有的系统中。整个老系统在新系统尚未完成的时候不断更新,至2000年已出到9.0版,尽可能地留住了老用户。并且,前面提到的蓝盒(Blue Box)也作为后来新Mac OS X系统的一部分,支持用户运行经典Mac OS的程序。

而对外政策更是一个大手笔。Ellen Hancock协助Gil Amelio在Apple之外找寻操作系统技术。在IBM和Microsoft合作Big Blue的经验告诉她,购买一个操作系统的使用权问题多多,最好的计划是整个一并买下来。因此,Gil Amelio开始和当时看好的Be谈,却因价格问题没有成功,最终转而收购了NeXT。而Apple合并NeXT后,NeXTSTEP就演化为Rhapsody,并最终成为Mac OS X。这些事情我们今后会详细再谈。

买完NeXT后,Steve Jobs执政,Gil Amelio因任CEO期间Apple亏损严重而被炒。Steve Jobs把信得过的人(很多是前NeXT员工)拉拢到周围,开始新政,而同Gil Amelio有关的Ellen Hancock则在人事变动中被疏远。Steve Jobs甚至在很多场合称她为“笨蛋”。Ellen Hancock最终于1998年主动辞职。事后同Gil Amelio以及Apple的创始人之一Steve Wozniak一同创业,但始终不景气,她的辉煌时代已经过去。

Gil Amelio总结他在Apple时期的工作时说:“Apple是一艘底部有洞漏水的船,而我的工作是把这船引向正道。”(Apple is like a ship with a hole in a bottom, leaking water, and my job is to get this ship pointed in the right direction. )Ellen Hancock虽然同Gil Amelio一样,不知如何去堵这个漏水的洞,但正是由于她在Apple的出色表现,不但把船引到了正道上,还找来了有能力堵这个洞的人。
 楼主| 发表于 2012-7-19 23:31:28 | 显示全部楼层
本帖最后由 紫菜 于 2013-3-23 15:06 编辑

二楼,下面继续会发上后面的8篇

昨晚看完这9篇文章的时候,已经凌晨5点了,长长的9篇文章,虽然很多专业的编程语言、名词和系统底层的东西不甚了解,但是从这9篇东西里了解了MAC OS X很多先进的技术和理念,也使过明白了为什么MAC OS X比WINDOWS强的原因所在,所以再次推荐大家阅读。


-------3013.3.23 更新-------

之前用iBooks Author将此系列文章做成了iPad\iPhone使用的电子书,还导出了PDF格式,这两个格式都可以给大家下载放到iPad或手机里慢慢阅读:

百度网盘下载
http://pan.baidu.com/share/link?shareid=158678&uk=1962985458
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-19 23:33:34 | 显示全部楼层
Mac OS X 背后的故事(二)——Linus Torvalds的短视

《Mac OS X背后的故事》系列文章将为大家介绍Mac OS X的发行版本、技术历史、相关人物等内容。本文是系列连载的第二篇,主要的故事来源是Linus Torvalds的自传《Just for Fun: The Story of an Accidental Revolutionary》。


Steve Jobs于1997年回归Apple


Steve Jobs对Mac OS X的考虑

1997年,Steve Jobs回归,开发下一代操作系统的工作被提上日程。此刻的时代背景是像Linux这样的开源软件大行其道。随着网络的发展,使得像Red Hat、VA Linux之类的企业成为爆发户,把泡沫越吹越大。Steve Jobs承认Linux的好处,甚至在若干年后介绍Mac OS X底层的Darwin时还不忘在幻灯片上写道:Darwin是类似Linux的系统。而当时精明的Steve Job在考虑下面几个问题。

第一,NeXTSTEP的内核和外围工具中,BSD代码维护起来需要大量人力,而且各分支的BSD发展显然不如Linux快。很多功能都没有,需要Apple自己做。

第二,像Apple这样的小公司,需要借力打力。Apple的主要竞争对手是Microsoft,而开源软件的矛头也是Microsoft,如果联合起来干革命,不但能让自己得到一个好名声(Apple事后一直自称是最大的开源软件公司),也可以获得可观利益,从而对Microsoft造成压力。

第三,也是最重要的,联合各开源组织能够推动Mac OS的发展。毕竟开源软件中像GCC之类都是很成熟的项目,Apple用起来省时省力,投点钱就有大效益,多好。

所以,把Linux内核作为Mac OS X的重要组成部分的想法被这位伟大的智者想了出来。Apple之前也有开发Linux的经验,比如在Steve Jobs回归之前,Apple就和OSF合作开始把Mach内核移植到PowerPC上(Apple是最大的PowerPC玩家,而OSF是最大的Mach玩家),并把Linux作为服务跑在Mach上。这个系统就是MkLinux,我们在后续的连载中还会提到这个系统,因为它不但对Linux的移植性作出了重要的贡献,也对后来的Mac OS X的XNU内核技术起到了相当重要的作用。

如果可以采用Linux作为系统重要组成部分,并且这个构想能够取得在开源软件界呼风唤雨的Linus Torvalds的认同,就能靠他在社区鼓动一大群开发者皈依Apple麾下,这是Apple很想看到的给力结局。有了这个指导思想,他便让秘书给Linux的开发者Linus Torvalds发了一个邮件,问他是不是有一到两小时的时间和Steve Jobs会面。不明真相的Linus Torvalds收到邮件后相当高兴,因为这是他第一次有机会去硅谷观摩。

无果而终的会面

Apple总部Infinity Loop终于迎来了这位稀客,Steve Jobs亲自接见,而先前任NeXT技术总监的Avie Tevanian(这人的故事我们今后会提到)也参加了这次会谈。不用多说,这次讨论的内容自然是还处于未知状态的Mac OS X。讨论算不上正式,但Linus Torvalds的愤青个性,却让谈判陷入僵局。

Steve Jobs自然搬出他1997年回归之际在MacWorld讲话时的那套理论,Apple虽然很颓,但骨子里是个牛逼的公司。全世界桌面领域的真正玩家就两个,一个是Apple,另一个是Microsoft,两者加起来,构成百分之百的桌面用户群。所以,Linus同学,你就从了我们吧,如果你从了我们,让我们把Mac架在Linux上,一大批桌面用户就是Linux用户啦,前景可是一片大好!

而Linus Torvalds那时候牛啊,诸多大公司如IBM、Red Hat都围着他转。他可是企业家中的大红人,像Apple这样的企业根本就不在他眼里。作为一个开源软件的革命家,在他的想象中Linux的潜在用户应该比Apple还多。他始终相信,按照目前开源软件的发展态势,自己很快就能在桌面领域分到一杯羹。而且这个命题在他这种古怪性格下的直接推论是,即使我能占领桌面领域,我也要摆出一副不在乎这个领域的态度来。所以实际上Steve Jobs的开场白就失败了。

接着,Avie Tevanian向Linus Torvalds介绍了整个计划。他们想把Mach和Linux内核合并起来作为Mac OS X的基础,我估计Linus Torvalds是听错了(因为Avie Tevanian很早就意识到相比于微内核,混合内核有明显优势),他以为Apple想把Linux作为Mach的一个服务来跑(当然我个人认为,即使是合并Mach和Linux成为混合内核,依Linus Torvalds的愤青性格,依然是不可能接受的),这正让他回想到先前和Tanenbaum教授的笔战。并且,他也知道Apple和IBM合搞的失败项目Taligent正是用Mach的。

Linus Torvalds对于微内核有他自己的看法,之前也曾在不同的地方表述过。若把关于微内核的笔战去掉限制级敏感词的话可概括成两方面。一方面,设计一个微内核和相关的服务,可能造成各种设计上的灾难。GNU/Hurd早在八十年代末就考虑尝试在Mach上写一系列Unix的服务层,结果他们始终无法搞明白到底是让这些服务先发消息到另几个服务呢,还是考虑其他方案。所以直到2011年我写这篇文章时,Hurd项目依然处于半死不活的状态。而另一方面,微内核的效率无法和传统内核相比,最简单的系统调用会涉及一系列底层服务的互相通信。所以很多研究者着手研究如何把微内核的效率提上去,结果就导致微内核变得更加复杂。能提高微内核效率的很多研究成果都已在Mach项目中实现了。而在Linus Torvalds看来这恰使Mach成为了一个非常复杂的项目,并且效率也不怎么高。

会谈时坐一旁的Avie Tevanian事实上是Mach最早的开发者之一,他热情地给Linus讲述Mac OS X系统蓝图。而Linus实际上早就不耐烦了。比如,Mac OS X中,有一个模拟层,可让用户使用经典的Mac OS程序。这个技术极类似于现在跑在Unix系统上执行Windows程序的Wine。Apple当时的考虑是这样,因为老的Mac OS在设计API时,就没有考虑到类似内存保护之类的问题,所以这层API必须废掉,Mac OS X中所有的新程序必须采用NeXT的那套更先进的API(根据我的考证,当时还没有Carbon这样的想法,而且事实上Carbon不管在API还是ABI上都和经典Mac OS不兼容)。而短期内已有的软件又不可能快速重写迁移至Mac OS X。所以,如果用户需要使用老版Mac OS的第三方应用程序,就可以使用Apple提供的这个兼容层。但是由于刚才提到的原因,老版程序并不享受新版程序的待遇,因为模拟器本身运行多个老Mac OS任务时,和原先老版Mac OS一样,实际上只有一个进程,没有内存保护。这样做的好处是明显的,因为一方面老的程序在Mac OS X发布之初还能用,另一方面Apple又和老技术划清了界限,逼着开发者使用新技术,技术方面的原因是最重要的。但这个看似很正确的技术在Linus Torvalds看来是古怪的,他想当然地认为,完全可以运行多个不同的模拟器进程,来执行不同的任务,使得每个任务都可以享受内存保护。这种浪漫主义情调让他无比鄙视Apple员工的智商。而事后当笔者使用早期版本的Mac OS X时,发现Linus Torvalds的想法完全是不切实际的。因为这个模拟层本来就要占用不少的内存和CPU,在处理器速度不及今日手机、内存无比精贵的90年代末,跑一堆模拟器进程无异于是和自己过不去。

Steve Jobs考虑到Linus Torvalds是开源软件的领军人物,便继续以开源为话题,动之以情,晓之以理。他告诉Linus Torvalds,我们这个系统做出来后呢,所有的Unix层(非图形界面层),都会开源,所以事实上你加入我们,也是在给开源做贡献啊!而由于在开源圈子混久了,Linus Torvalds对此丝亳不领情,他认为,有谁会想用一个底层是开源而图形界面是不开源的系统呢?所以,像笔者这样的用户被“代表”了。

Mac OS X与Linux分道扬镳

总之,这次会面完全谈崩,两人站在不同的角度去看问题,加上Steve Jobs和Linus Torvalds都是个性鲜明、唯我独尊的人,技术和商业上的考虑都不同,所以会谈中双方简直就是鸡同鸭讲。这次讨论也使得Apple放弃Linux,转而采用FreeBSD技术,并在2001年任命FreeBSD的发起者、领军人物Jordan Hubbard为BSD技术小组的经理,并在后来升为Unix技术总监。至于Apple的内核技术后来走向何方,我们下期再讲。

笔者认为,Apple和Linus Torvarlds的商谈破裂,以今天的眼光来看,是因Linus Torvarlds的自命清高和短视造成的。他不懂得尊重其他开发者的意见,并且不断抬扛。包括后来关于C++的论战。Mac OS X发布后,Linus Torvalds又数次嘲笑Mac的技术落后,并说这些他在当年和Steve Jobs开会时就预料到了。直到最近,他终于有些成熟,对Mac OS X的观点开始缓合,但还是不忘批评Mac的文件系统就是垃圾(事实上,Linux的也没好到哪去,至少Apple还搞过一阵ZFS)。这种性格最终导致在Mac OS X和iOS大行其道的时候,Linus Torvalds连兔子汤都不曾分到。

而事实上这对Apple也是件好事。Apple重要的是利益而不是折腾,即使是开源也是利益驱动。像类似Linux开发组那样自以为是但代码又写得差的开源项目,Apple事后也遇到不少,比如GCC编译器项目组[1]。虽然大把钞票扔进去,在先期能够解决一些问题,但时间长了这群人总和Apple过不去,并以自己在开源世界的地位恫吓之,最终Apple由于受不了这些项目组人员的态度、协议、代码质量,觉得还不如自己造轮子来得方便,因此Apple推动了类似LLVM这样宏伟的项目,并且在短短几年内,使其成为最领先的开源软件技术。这无异于扇了Linux小组、GCC小组一记响亮的耳光。

参考资料:
[1]来自于openbsd创始人的访谈,Theo de Raadt,Otto Moerbeek,Jem Matzan,MORE ON OPENBSD’S NEW COMPILER,Oct 15,2007。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-19 23:36:04 | 显示全部楼层
Mac OS X 背后的故事(三)Mach之父Avie Tevanian

1975年,美国罗彻斯特大学纽约分校,一组研究员正在做一个名为RIG(Rochester’s Intelligent Gateway)的项目,它由Jerry Feldman主持设计。RIG的目标是给所有本地以及远端的计算设备(比如磁盘、列印机、磁带、绘图机等)提供一组统一的访问方式,其作业系统称为Aleph。为了实现所需要的功能,Aleph的内核主要构建了一个进程交互(Interprocess Communication,IPC)的机制。RIG的各进程,只要设置了目标端口,就可以彼此间发送信息。RIG项目没过几年就被判了死刑,主要是缺少很多有用的功能,比如端口没有保护机制,一次最多只能发送2KB大小的信息(受硬件限制),也没有很好的网络支持等。不过在20世纪70年代,这个系统依然代表着当时作业系统设计的先进水平,比如除了进程交互外,每个进程还有内存保护的功能,这足以让20世纪90年代末都没有做出内存保护技术的Apple公司汗颜。



该项目后来失败了,随后在1979年,RIG的Richard Rashid博士毕业到卡内基-梅隆大学当教授,开始做Accent项目。它是一个网络作业系统,于1981年4月开始活跃开发。受RIG的影响,Accent系统的亮点也在于可以使用IPC,而且解决了很多RIG的不足。比如每个进程有4GB的虚拟内存空间,而且甚至连内核自已都可以被存入缓存页面,内存有先进的更新前拷贝(Copy-on-Write)功能,可以实现进程间大信息的传送等。读者可以把Accent理解为支持虚拟内存技术,并且具有网络透明IPC功能的RIG内核。

但过了几年,开发者们越来越对Accent失去兴趣。在1980年初,很多人觉得多核计算是计算机未来发展的潮流,但Accent内核在设计时并没有考虑到这些问题。而且,随着许多实验室纷纷购置性能更强劲的计算机,这就意味着Accent需要移植到新的目标架构上。此外,Unix正大行其道,不管是在作业系统理论上还是在用户程序上,都成为最为流行的作业系统模式,而Accent并不是一个Unix系统,所以无法享受Unix世界的诸多美好。为了解决这个问题,研究人员决定把所有设计推翻重来,于是就有了一个全新的系统。

在匹兹堡的一个雨天,卡内基-梅隆大学的Avie Tevanian,此系统的最主要开发者,正打着伞和同学们在去吃午饭的路上。他们一边绕着无数的泥塘,一边构思给这个新系统取什么名字好。灵感突来,Avadis Tevanian建议把这个系统叫作Muck,引得同学们哈哈大笑。后来,Richard Rashid和一位意大利同事Dario Giuse说起这玩笑,结果这位同事不经意地把Muck发为Mach,遂把Richard Rashid笑翻,伟大的Mach系统因此得名。

Mach是一个受Accent启发而搞出的Unix兼容系统。那年,Unix已经十六岁,而且依然是作业系统理论与实践开发的主要阵地。Unix内核由于新加入的功能越来越多,变得越来越复杂。而Mach的一个主要目标就是尽量缩减Unix的各项服务,以使内核变得简单可维护。此项目从1984年开始,目标主要是包含完整的多任务支援、良好的硬件移植性,并要把大量服务移出内核作为跑在内核上的服务,以及提供与Unix的兼容性。

Mach使用纯C编写,所以在一定程度上保证了可移植性,这事实上为后面的NeXT向PowerPC移植以及2005年的向Intel移植提供了很重要的前提。而为了缩减内核该管的任务,Mach做得很绝,只提供内存和处理器管理。类似于档案系统、网络、输入输出等功能都作为单个的系统进程,独立执行于内核之上。Mach的开发过程以4.3BSD作为起点,以RIG的Accent作为参考,采纳DEC的虚拟内存设计思路,逐步开发,以新写的代码代替BSD的代码。两年后的1986年,虽然没能把系统服务完全分离于内核之外,但已颇见成效。Mach第一版大功告成,组员发表会议论文,成为操作系统史上里程碑式的经典,引发操作系统业界的“微内核”学潮,如今学习作业系统设计的皆需学习此文,二十五年来被引用一千二百余次。

这篇文章主要讲了两方面内容:IPC和虚拟内存。在IPC方面,Mach把复杂的消息传送机制分为四个独立的清晰概念—任务、线程、端口、信息。任务是拥有一组系统资源的对象,允许线程在其中执行;线程是执行的基本单位,拥有一个任务的上下文,并且共享任务中的资源。

由于该论文的影响力,所以项目得到了OSF(Open Software Foundation)在内的很多投资。当然了,学术和工程永远存在差距,所以即使是最受欢迎的Mach 2.5其实仍然是一个包括大多数BSD服务层的单内核。但包括NeXTSTEP、OSF/1在内的很多操作系统都采用Mach作为其内核技术,原因是广大研究人员依然相信微内核代表着未来。虽然Mach 2.5的效率比传统的Unix系统稍低一些,但研究者们表示情绪淡定,因为Mach支持多处理器系统,可以利用多线程把任务处理得飞快,相比之下其他Unix内核并没有多处理器的完善支援,因此Mach效率稍低完全可以接受。但随着真正把Mach和BSD服务完全脱离的Mach 3微内核面世,研究人员们的情绪就再也淡定不起来了。因为服务和内核分离后,任务间的IPC数量暴涨,一个简单的Unix系统调用要涉及到十多个开端口、设权限、发送、收取消息的操作,哪怕是使用数年后的1997年的硬件,跑一个系统调用密集的程序,Mach的效率要比一般的Unix系统慢50%,而且根本没有什么好方法来解决这个问题。

所以Mach 3出来后,虽有少数微内核信徒继续执著地改进Mach,或者开始其他微内核比如L4的研究。但学术界对Mach的兴趣大减,因而Mach 3也成为最后一版。项目解散后,Richard Rashid去了微软研究院。

再说我们的主角Avie Tevanian,他1987年博士毕业去了NeXT。这家公司刚刚由Steve Jobs成立两年,这两年Steve Jobs啥正经事都没干,只是花了十万美元雇Paul Rand设计了一个公司商标。直到Avie Tevanian加入后,这个公司才开始干实事。1987年公司确认要开发一个面向研究人员使用的计算机工作站,于是软硬件的开发工作紧锣密鼓地展开。硬件组由领导过Apple Lisa的Rich Page原班人马负责,而软件则由Avie Tevanian负责,计划开发一个有图形界面的操作系统NeXTSTEP。由于Avie Tevanian是Mach主要的开发者,自然NeXTSTEP就基于Mach了。1988年10月12日,NeXT发布预览版(0.8版),并于1989年9月18日发布1.0版(注:http://en.wikipedia.org/wiki/NeXTSTEP)。

作为NeXTSTEP系统的内核,NeXT分支的Mach经历了不少变化。NeXTSTEP 0.8主要使用Mach 2.0版,而稍后的NeXTSTEP 1.0版主要基于Mach 2.5版,包含一个自己定制的当时最新的4.3BSD服务层。从3.1版开始,NeXT分支的Mach还包括一个全新的设备驱动框架, 名为Driver Kit,仅供x86系列的硬件使用。和Mach以及BSD代码不同,Driver Kit是使用Objective-C写的。为什么是一个面向对象的语言呢?看NeXTSTEP 3.3的DriverKit文档。读者大概就会发现,NeXTSTEP把所有硬件设备理解为对象,而我们知道,对象之间有继承关系,比如,磁盘(IODisk物件)属于输入输出设备(IODevice物件)的子物件,而磁盘(IODisk)本身又是逻辑磁盘(IOLogicalDisk)的父物件。硬件的初始化对应于每个物件的初始化(init方法),硬件又有读、写,所以可以用getter/setter的方法。因此,DriverKit是一个非常有特色的实现。而且由于Objective-C的效率很高,依赖很少(Objective-C程序可以直接被编译器翻译成等价的C语言程序并编译,而Objective-C的运行库libobjc也以高效著称),所以也是编写驱动的良好选择。几年后的IOKit其实就是个DriverKit的翻版。

这时,NeXTSTEP操作系统大获成功,风险投资商们纷纷购买,但硬件却始终卖不出去(注:Aaron Hillegass《Cocoa Programming for Mac OS X》前言),所以NeXT砍掉了硬件部门专做软件,更是使NeXTSTEP发展到了巅峰时期,同时支持68K、x86、PA-RISC和SPARC等硬件,但颇有意味的是它就是不支持PowerPC架构。它可以同时产生一个包含所有架构可执行码的二进制文件,来使开发的程序在所有平台上执行。这个功能也影响了后来Mac OS X的技术。Mac OS X 10.4时代有两件跨时代意义的事情,一件是Apple搞出了64位的Power Mac,开发者可以发布一个包含64位和32位程序的单一可执行文件,而无需让用户去区分;另一件是和Intel合作。Apple正式发表了Universal Binary技术,可以一个Mach-O文件同时包含Intel和PowerPC的指令。这非常贴心的设计(要知道,大多数电脑用户根本不知道Intel、PowerPC、64位、32位等技术)就是来自于Mach的技术。

NeXTSTEP 3.3后,NeXTSTEP因为NeXT和Sun的合作改名为OPENSTEP,1996年发布4.0版,到1997年2月4日,NeXT被Apple收购之前,期间内核改进除源码同步到Mach 3.0版外不明,而且出于不知道的原因,我手头的OPENSTEP正式版光盘中,居然找不到DriverKit的发布说明和编程文档,故不作详述。不过这段时间,Apple的活动值得好好一说。之前在《Linus Torvalds的短视》中,我们曾提到,1996年,Apple和OSF曾经合作,把Mach移到PowerPC Mac上,再把Linux作为单一的服务跑在Mach上,这个项目叫做MkLinux。在1996年发布基于Mach 3.0和Linux 1.3的预览版,并更新到2002年结束其历史使命,对Mach在PowerPC的移植性上做出了重要贡献。这个PowerPC版的Mach被叫作osfmk分支,也正是现在Mac OS X中用的分支。当然了,NeXT被合并后做了大量修改。

Apple收购NeXT后,Mach被确定作为未来的操作系统核心。Avie Tevanian被选为软件开发部的总裁。合并所有项目的号角吹响后,上层的OpenStep API和老版Mac OS的部件开始合并,而Mach也经历重大变化。主要是一方面,Mach使用了osfmk分支,但依然包含4.3BSD服务;另一方面,DriverKit被IOKit取代。这是Apple走得很被动的一步。因为当时外界普遍对Objective-C不看好,逼着Apple走老版Mac OS  API的老路。而Apple自己对Objective-C也很不自信,甚至想索性换用Java了事(我们以后会谈及这段不自信的历史)。所以IOKit是一个C++的驱动架构,来符合大众口味。这些改变最早在Rhapsody中出现(我们以后也会有一期Rhapsody的专题)。但由于C++是门很恐怖的语言,所以Apple又把C++给阉割了,去掉了多重继承、模板、运行时动态以及异常,让开发者使用这种对于Objective-C来说换汤不换药的Clean C++来做驱动。但公正地说,IOKit对于Driver Kit是有不少改进的,比如IOKit可以写在用户空间跑的驱动(虽然大多仍是跑在内核空间上的),因而驱动挂了而系统不会挂。另外IOKit考虑到了计算机发展的趋势,所以在电源管理、即插即用、动态加载上做得更好。

但各位也知道,C++程序得用专门的运行库才能跑,所以Mach中又加入了一个叫作libkern的库负责C++相关的功能,同时,还有一个libsa的库提供一些类似二分查找、排序等基本算法之类的功能。最后和硬件相关的还有一个叫作pexpert(Platform Expert)的库,负责收集硬件设备列表、检测机器种类(比如处理器速度等)、解析启动参数等杂活。

至此,Mac OS X的内核完全形成,形成BSD、IOKit、Mach osfmk三足鼎立的态势,并有pexpert、libkern、libsa作为基础。Apple称它的内核杰作为XNU。其代码开源,请读者移步http://www.opensource.apple.com/source/xnu/xnu-123.5/,每个部分的代码都独立存放在一个文件夹中,条理清晰,不妨一读。

由于4.3BSD已是过眼烟云,Apple后来投入大量资源扶持FreeBSD开发。2001年,Apple将FreeBSD的发起者、领军人物Jordan Hubbard收入麾下,并在Mac OS X 10.3时基本同步到FreeBSD 5的代码(注:http://osxbook.com/book/bonus/ancient/whatismacosx/arch_xnu.html)。

另外,Apple 的开发也同时反馈到FreeBSD小组,包括FreeBSD 6.2 内核引入的 AUDIT (man audit 或参见http://manpages.unixforum.co.uk/ ... audit-man-page.html),后来 FreeBSD 8引入的 libdispatch (http://wiki.freebsd.org/GCD, 在Apple这项技术叫Grand Central Dispatch,是Mac OS X 10.6 主推的新功能,FreeBSD基本在 Mac OS X 10.6 上市的同时就拥有这项最新技术),以及 FreeBSD-CURRENT 中的 LLVM-Clang,全是Apple的手笔。从 1999 年开始,FreeBSD 源码仓库可以搜索到 Apple 提供的大量的补丁以及新功能。

(字数限制,接下一楼)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-19 23:37:04 | 显示全部楼层
(接上一楼)

Mac OS X早期版本不太稳定,所以会内核崩溃。10.0版本会直接像Linux或者BSD那样打出回溯信息,很不美观,所以Apple在10.2版本开始设计了一个多国语言的图片告诉用户你的内核崩溃了,以让内核崩得看起来更优雅一点。由于包含四国语言,被国内用户戏称为“四国”(注:优雅的图片见http://support.apple.com/kb/ht1392),这是XNU的Mach osfmk部分的功能。但从10.3~10.4版本开始,系统越发稳定,正常使用已很少见到内核崩溃。而且,内核提供的服务也越来越多,使得Mac OS X成为一个完善的系统。

21世纪XNU架构方面的最重大改动是支持了PPC64(10.4版本时代)、x86架构(其实本来也一直支持的,以后讲Apple的Intel迁移时详谈)、x86_64(64位支持是苹果长年努力逐步展开的。10.4时代32位内核支持载入64位的用户程序,10.5系统提供64位的Cocoa框架,但系统 大部分程序都是32位的,10.6时代内核支持以64位模式启动,但在不少硬件上这是非默认的方式,但系统大量程序已被改写并编译为64位的二进制程序,10.7时代内核默认以64位模式启动。)和ARM架构(iPhone和iPad使用XNU内核)等多个新架构。

而其中ARM架构的支持别具意义。但2006年5月31日,功成名就的Avie Tevanian离开Apple另谋发展,此时,离Apple的iPhone奇迹发生,只有不到一年时间。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-19 23:39:01 | 显示全部楼层
Mac OS X 背后的故事(四)——政客的跨界

《Mac OS X背后的故事》系列文章将为大家介绍Mac OS X的发行版本、技术历史、相关人物等内容。本文是系列连载的第四篇。

2000年,美国总统大选,由于选票设计问题,时任美国副总统的 Al Gore 败北。2000年12月13日,在一番重新计票的大折腾不起作用后,曾经意气风发的 Al Gore 拖着疲惫的身子,走上讲台,发表了认输讲话(参见Al Gore《2000 Presidential Concession Speech》),从此退出政坛。一般国家领导人的退政生活其往往松愉快,出出日记,学用哲学,或者像多才多艺的李岚清不但去各地推广古典音乐,更是玩起了篆刻(参见《南方周末》2006年05月11日《老常委的卸任生活》),克林顿先生都成立个基金会来帮助社会预防和治疗爱滋。 Al Gore也没闲着,他找到了让他感兴趣的去处——Apple总部,并成为董事之一。

Mac OS X和Al Gore的双赢

2003年5月19日,Apple的启示中罕见性地登出了《前总统Al Gore加入 Apple 董事会》的快讯。文中提到,Al Gore总统是一个正宗果粉,他一直用Mac计算机,而且还会用Final Cut Pro来编辑他的视频。Al Gore也不掩饰他对Apple技术的热爱,他表示对Mac OS X的开发极感兴趣,并且也对Apple在开放源代码运动中的贡献喜闻乐见。他虚心地说,想在这个让Apple起死回生的董事会好好观摩并学习。


Al Gore的加盟让Apple一跃成为电子产品产品的代言人

苹果公司的CEO Steve Jobs表示Al Gore曾经管理过世界最大的组织——美国政府,期间显示出的经验和智慧对苹果公司是笔巨大的财富。Al Gore将成为出色的董事会主席,苹果将以他把苹果公司作为职业生涯的开始为荣。

这之后,Al Gore在Apple内部的决策究竟起了什么作用,和Mac OS X的开发有何关联,在正式的渠道很少有史料,但是他后来的各种公开活动,却给Mac OS X的技术做足了广告, 而且很多证据表明,他正是使Apple从被绿色人士攻击的众矢之的的状态,成为业界注重电子产品环保领头羊的主要推手。

Al Gore重新进入普通人的视野是在2006年,他推出了自己参与制作和演出的纪录片《An Inconvenient Truth》(《难以忽视的真相》)和同名书籍。这部长达94分钟的影片,在西方国家引起了广大的回响,以Al Gore的一场演讲和人生的回忆作为两条主线,详细、科普地向民众介绍了全球变暖问题的科学证据及美国政府掩盖问题的真相。该片以发人深省的立意、详尽的科学数据、平实的讲演风格,加上苹果高超的技术,而获得了广泛的好评并一举获得年度奥斯卡最佳纪录片奖,使得这位美国前副总统摇身一变,成为好莱坞明星。

为什么单单一场简单的讲话,就能做出一部电影,还能得到奥斯卡这样学院艺术奖的亲睐?是因为讲话内容无懈可击么?事后有很多科学家站出来表示,虽然影片内容有积极的意义,但其实也有很多被夸大的科学数据、假设和结论。试思索,该片之所以成功,甚至成为诸多演讲培训机构的重要分析案例,除了数据、观点、论述外,还有以下几个原因。

首先,这场演讲由苹果主导的技术和艺术的设计。Al Gore向来以说不清想表达的内容而著称。他经常因为讲得过于专业或者缺乏好的表述方法以致于民众完全不懂他在讲些什么。他的早期讲话用现在的眼光看就是个少将体,比如“互联网…网…我…这个…那个…那个…怎么说呢…我想这个…这…这…这…我啊…我啊…就是说…互联网是我发明的!”因此作为苹果展现公司软实力的重要机会,苹果非常重视这场讲话,请公司的图形设计小组带领完成各种所需设计,苹果甚至特地请来了专业的设计公司Duarte来进行讲稿和讲话内容的安排。因此,不管是内容安排、图形设计还是技术支持,Al Gore都有强有力的后盾,他们能够帮助Al Gore完成任何想达到的目标。不论是FinalCut还是Keynote,一旦缺少任何Al Gore想要的功能,Apple都可以给他开小灶实现。在片末的走马灯字幕中,有大量Apple的 Keynote组、Final Cut组和图形设计组的员工名字,以示鸣谢。

其次,上面这些资源的相互合作,也使得Al Gore的这场讲话的讲稿被精心制作,体现了精心设计的电子稿演讲所能达到的最高成就。苹果公司向来重视演讲,也是各大企业中最会通过演讲来营销产品的公司。每年的MacWorld和WWDC的 Steve Jobs 讲话都会吸引百万人在计算机前观看。每场讲话都好戏连连,台下的观众的欢呼和掌声不亚于著名歌星的演唱会。这种风格显然给Al Gore的讲话风格带来很大的影响。在影片中,观众看不到一个传统的bulletpoint(PowerPoint用户常爱使用的表示讲话结构的方法),取而代之的是高清的照片、视频,来展现环境的严峻性。观众不再会为枯燥无味的技术词语而搞得昏昏欲睡,因为屏幕上的一切都是如此真实,各种科学现象由动画效果配合,使其浅显易懂。另外,所有的数据、图表都精心使用软件制作,使其一目了然,表现准确而美观大方,而且Al Gore时而还会玩些小噱头,比如讲到现在的温室气体浓度是多么高时,他甚至爬上工作人员为他准备的升降机,升到舞台顶端,来告诉观众,数据已经突破图表的顶端了。现在距笔者观赏完这部影片,已经五年过去了,但影片中的灾难场景、冰川融化的影片段落、海平面上升的计算机模拟、二氧化碳浓度的数据图表,至今都记得一清二楚,足以见得其表现力是何等深入人心。甚至有人在调侃他在2000年的竞选演说是怎么回事?难道就是缺少了这些科技元素?

最后,Mac OS X的各项技术也是这部片子的重要保证。Duarte 公司的 Ted Boda表示(该幻灯片的设计师之一),Mac OS X系统本身的反锯齿功能把文字、图片、矢量图标表现得栩栩如生,使得幻灯片充满美感。QuickTime技术作为Mac OS X的一块重要基石,又使得Keynote不需任何插件就能引入任何图片和影像,所以类似使用Illustrator、Photoshop、AfterEffects等软件做出的图片、影像或动昼,不需要任何转换过程就能直接拖到Keynote中。哪怕1920×1080的高清视频,都可以轻松插入,流畅播放。他们组根本想象不出在Windows上使用PowerPoint会成什么样子。

可以说,没有Mac OS X,就没有这部电影。而实际上这部电影的作用远胜过任何一部Apple公司的广告。片中Al Gore时时拿着PowerBook的笔记本,在办公室用Safari查网页,字体渲染真实而美观,甚至在车上都不忘打开笔记本用Keynote做几张幻灯片,就更不用说电影中Keynote幻灯片曾经迷倒多少Windows用户了。向笔者推荐这部电影的好朋友了解到这些全是Apple技术的功劳时,拥有一台Mac就成为其人生梦想。

环保卫士的Apple之路

作为环保人士,Al Gore对Apple的策略的影响也不容忽视。Apple向来被各环保组织长期批评,即使Apple长年不断地改进这方面问题,但绿色人士依然不买帐。哪怕在稍后的2007年,也仍有包括GreenPeace在内的七十多个组织联名写信给Al Gore,敦促Apple更重视环境问题,信中指责Apple仍在大量使用PVC和BFRs等对环境有害的材料,也不注重对自家产品的回收。由于Al Gore是Apple董事会成员,使得这个问题受到了Apple的广泛关注。Apple在07年后史无前例地迈开大步,大力推广环保计划(要求全世界的IT制造商们逐步弃用PVC等有毒的化学用品进行生产),让Apple一跃成为注重电子产品环境保护问题的领头羊。

从制造材料上,2007年8月发布的iMac成为分水岭。这款产品的设计主要使用可完全被回收的玻璃屏和铝外框,减小了塑料等不环保物质的使用,此后苹果一发不可收拾,把这项革命进行到底,从手机到笔记本,都全番设计。2008年的MacBook Air引出的Unibody技术是这场革命的代表产品,不但在外观上还是工程上做到极致,在环保上更是让各绿色组织无可挑剔。

在造势上,Apple现在每项主要产品的都有“环境”的标签页,从制造、运输、耗电、回收等性能情况分产品详细列出。Apple甚至在包装上都动足脑筋,尽量减少每个产品的包装,使得同一架飞机可以运输更多的产品,从而在运输相同数量产品的情况下减少飞机温室气体的总排放量。

Mac OS X的各项节电功能的开发更是不用说了。休眠、调整空闲时的屏幕亮度、硬盘转速等常规功能自然越做越好。而系统的多项技术能使程序更优地分配使用中央处理器和显示卡。甚至系统还能在用户打字时,每两键之间的空隙减少处理器的占用从而节省击键之间的功耗,这使得 Mac OS X不但更节约能源,笔记本的电池使用时间也不断提高。而这一切的变化,和Al Gore似乎都有着千丝万缕的联系。

由于《An Inconvenient Truth》中的讲话让Al Gore的观点深入人心,同时也对美国政府在京都议定的决策产生重大的压力,挪威诺贝尔委员会决定把2007年的诺贝尔和平奖颁给了Al Gore,以表彰其在全球环境问题方面的努力,同时苹果的主页上全版刊发新闻,以示祝贺。贺词如下:

Al has put his heart and soul, and much of his life during the past several years, into alerting and educating us all on the climate crisis. We are bursting with pride for Al and this historic recognition of his global contributions. (Al Gore在过去几年殚心积虑,全身心地投入对公众关于气候危机的警示和教育中。我们为他这次所得的荣誉和他全球性贡献的历史性承认感到无比自豪。)

或许,由于Al Gore在计算机领域的一贯低调(他也是Google的高级顾问),他在这些企业的工作很少被报道出来,但是他在政界的跨界身份是显而易见的。Al Gore在他的人生道路将何去何从,我们不得而知,但是从各种媒体信息的披露可以看出,Al Gore对计算机事业的热衷,对环保问题的投入,可能是美国历任领导人中最突出的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-19 23:42:05 | 显示全部楼层
Mac OS X 背后的故事(五)Jean-Marie Hullot的Interface Builder神话

Interface Builder,是用于苹果公司Mac OS X操作系统的软件开发程序,Xcode套件的一部分,于1988年创立。它的创造者Jean-Marie Hullot自称是“一个热爱旅行、充满激情的摄影师”,本篇分享Hullot热爱技术的那一面——创造Interface Builder的过程。

因势而动

1981年, Jean-Marie Hullot拿到巴黎第十一大学的计算机科学博士资格后,开始了法国国家信息与自动化研究所(INRIA)的研究生活。


Jean-Marie Hullot的名字似乎不为大众所熟知,但他设计的Interface Builder 却深入人心,创造了一个个软件神话。

20世纪70年代初,正是面向对象程序设计开始走上历史舞台的时期。许多现代计算机技术的诞生地Xerox PARC(施乐帕洛阿尔托研究中心)的Alan Kay、Dan Ingalls、Ted Kaehler 、Adele Goldberg等人,从1969年开始研发一款面向对象的程序语言Smalltalk,并于1980年正式公布。这是一个完整地实现面向对象范型的编程套件,包含了一种面向对象的程序设计语言、一种程序设计库和一个应用开发环境(ADE)。

虽然当时的机器跑得巨慢无比,但Smalltalk先进的思想对其他众多的程序设计语言(Objective-C、Actor、Java和 Ruby)的产生起到了极大的推动作用,对计算机工业界的发展产生了非常深远的影响。我们将会在今后介绍Objective-C时,详细介绍Smalltalk及其对Objective-C的影响,这里先一笔带过。

Smalltalk的发布在业界一石激起千层浪,也给Jean-Marie Hullot幼小的心灵带来了巨大的震撼。他立即明白了面向对象思想所代表的先进生产力,一定会改变今后数十年的程序设计流程,他毫不犹豫地成为面向对象编程模式的早期粉丝。

SOS的助力

那时,Jean-Marie Hullot使用早期的Macintosh计算机进行开发。不过他很快就和其他开发者一样,发现虽然Mac的用户界面做得不错,但开发程序实在是太糟糕了。他说:“当Macintosh被发明出来时,计算机和先前就大不一样了,你至少需要花60%~70%的时间在用户界面部分的代码上。”在Macintosh被发明之前,用户界面是相当简单的,只需要在命令行下面打一串字符,计算机就会回应出一行行的信息。所以在那个时代,开发者完全不需要专注于用户界面。而Mac一经发布,随之而来的众多的窗口和菜单,让整个世界都不一样了。虽然对于使用最终产品的用户而言是简单方便的,但对于码工来说简直是个噩梦。每次他们需要一个窗口或者菜单,都要从零开始构建。

聪明的Hullot开始动脑筋改进Mac编写用户程序难的现状。他开发了一个程序,有点像现在Windows系统中的“画板”。一侧的工具条,是类似菜单这样的大量可重用的对象;而另一侧,则是程序员想构建的用户程序界面。只要把工具条上的工具拖放到程序界面中,那么类似“打开”、“打印”等相关的功能,就可以被添加到用户界面中。事实上,这个程序,是最早的一批能通过鼠标把控件拖入界面设计窗口实现相应功能的商业程序,是用户界面设计软件的先驱。

这个跨时代的发明被称作SOS,用Lisp语言编写【注:What are we going to called this thing中认为此时就是Interface Builder,但据The NeXTonian等多处资料表明,在Steve Jobs见到以前,该程序名为SOS】。当时,ExperTelligence开发了一种叫做ExperLisp的方言,SOS即用此语言写成【注:http://en.wikipedia.org/wiki/Interface_Builder】。

此时Hullot忽然意识到,他设计的东西事实上很强大,其重要性简直可以和Smalltalk这样的发明相比——Smalltalk让开发者尝到了面向对象语言的甜头,而SOS则是直接把对象放到了开发者手边。有了这么拽的东西,Hullot意识到如果他只在研究所窝着,那只能让十几个人享受这一成果,而如果他跳槽,把这个工具公开,那对天下的码工来说可是大福音。

诞生之源

经过不断努力,Hullot找到了一个值得推销自己发明的好地方——剑桥的苹果大学联盟(Apple University Consortium)。这个苹果和大学合作的组织看到Hullot的创作后反响很好,就推荐他去见Jean-Louis Gassee。 Jean-Louis Gassee是个法国人,时任苹果开发研究院主任,见到SOS后也认为这是个好东西,便说服他去美国闯一闯。经过几次的鼓励和推荐,加上美国对Hullot来说又不陌生,于是他就买了机票跳上飞机就奔赴美国。

不过当Jean-Marie Hullot来到美国加州苹果总部时,他却认为这不是一个工作的好地方——苹果已经是一个很庞大的企业,很难再有所创新发展。他最终决定不留在那儿,转而在美国寻找一个能把这个产品卖出去的人。四处推销之后,找到他用来写SOS的Lisp解释器的生产商,就是刚才提到的位于Santa Barbara的软件公司 ExperTelligence。

事实上,当时的ExperTelligence正在寻找合作商卖自已的Lisp,而Hullot也在找合作商卖自已的 SOS,两者一拍即合,随即打电话给 NeXT,共同推销自家的产品。

NeXT在Palo Alto总部的产品市场部人员接待了Jean-Marie Hullot和两位来自ExperTelligence的员工,被SOS的理念镇住,遂打电话请Steve Jobs下来看。Jean-Marie Hullot像复读机一样又把自己的大作秀了一遍。老谋深算的Steve Jobs事实上早就看中了SOS,但他对ExperTelligence的Lisp一点兴趣都没有。所以他装作对这场演示毫无兴致【注:这有很多引用该文的翻译译错,原文说nonplussed,字面意思为惊异,但在美国非正式表述中,此字表毫无兴致】,挥挥手就把这三个人打发走了。

但当他们一行人走到停车场时,Steve Jobs让他手下把Hullot追了回来,当他只身回到NeXT总部时,发现Steve Jobs正恭敬地等着他。

“我想要你计算机上那个程序”【注:http://rixstep.com/2/0/people/】,Steve Jobs说道:“你大概什么时候能开始给我们工作?”

Hullot回答说自己翌日就要离开去度假。

“好吧,我两周后给你打电话,”Steve Jobs说。

“不行,老乔”,Hullot表示:“我不游美国,我可要环游欧洲,你七个礼拜后再打给我吧。”

Steve Jobs虽然一骨子傲气,但他明白一个简单的道理:21世纪最缺的是什么——是人才!即使Jean-Marie Hullot玩起了大牌,这电话自然还是要打的。Hullot刚一度完假回来,Steve Jobs的电话就如期而至。

如此三顾茅庐般的热情,把Jean-Marie Hullot感动得第二天就登上了去美国的飞机。合约签了半年,但实际上他最终在NeXT整整待了十年。在NeXT工作期间,他使用Objective-C和NeXTSTEP框架重写了SOS,命名为Interface Builder。由此,Interface Builder成为NeXT集成开发环境 Project Builder标准套件之一。

进阶与探索

Interface Builder和SOS一样,提供了一个工具箱,包含一系列用户控件对象。工具箱并不是官方定死的,而是可以任意扩展的,比如如果用户想使用类似Safari中的toolbar,而这不是官方提供的,则下载第三方的PSMTabBar即可实现,甚至连Cappuccino这样的网页框架也可以用Interface Builder来完成设计。开发者只要把控件比如菜单和文本框拖入项目文件就能完成用户界面设计,节省了几乎所有和控件放置有关的代码。

开发者拖拽鼠标,将控件可提供的动作(IBAction)和另一个对象的接口(IBOutlet)连在一起, 则建立了一个绑定。这样,一旦动作被激发(比如用户点了按钮),那接口中相应的方法则会被执行。所以,大量对象关联的代码也能被省去。

有了这样的模式后,Interface Builder和Cocoa可以比后来出现的Microsoft Visual Studio或Qt Designer等软件走得更远——只要是对象,Interface Builder就能够操控它们,不需要一定是一个界面的控件。比如,数据库的数据源、队列等,都可以在Interface Builder中连接起来,于是很多原本需要上千行的复杂应用(比如用来显示、修改企业中职工姓名、部门、电话、地址、头像等信息SQL数据库的用户界面程序),数分钟内就可以写完,不用一行代码。不信?让1992年的Steve Jobs亲自做给你看【注:http://www.youtube.com/watch?v=j02b8Fuz73A, 第23分钟~第29分钟】。

NeXT被Apple收购后,苹果把下一代操作系统建立在NeXTSTEP的基础上。Objective-C和Cocoa被作为主要框架,而Interface Builder和Project Builder也因此受到重用。就官方的工具箱而言,支持Objective-C/Cocoa、Carbon的HIToolbox和WebObject。

2008年3月27日,苹果发布首个iPhone SDK,设计Cocoa Touch界面的,也正是Interface Builder。可以说,Interface Builder一直随着公司产品的发展而不断拓新。

Jean-Marie Hullot是在NeXT被收购时进入苹果的。Steve Jobs令他率领在法国的一个小团队,秘密为Mac OS X 10.2开发一个办公软件。以往这样量级的程序,都是由苹果加州总部的大班人马完成。而这次,为了向世人表明他的Interface Builder有多强大,iCal横空出世,展示复杂的界面元素(日历、可拖拽的任务、五花八门的分类)和诸多功能(网络同步、Apple Script脚本控制)可以用相当快速的时间内开发出来【注:http://www.appleinsider.com/arti ... 3_0.html&page=2】。

最后,在iCal小组打完酱油的Jean-Marie Hullot荣升苹果软件开发部首席技术官。

Project Builder在Mac OS X 10.3时被重命名为现在大家所熟知的 Xcode。Xcode 3以前,Interface Builder使用一种名为nib格式的二进制文件格式。不过由于nib不能用肉眼读,也不方便使用版本管理工具来管理,所以Xcode 3开始新加入一种名为xib的文本文件格式,最后再在项目编译阶段输出为nib格式。和产生静态界面布局代码的工具(如MSVC、QtDesigner、 Delphi等类似的软件)很不同,nib是不被转译成相应Objective-C代码的。用户程序执行时,nib文件被读入,解包,并且唤醒【注:awake,即载入 nib 会自动调用程序中awakeFromNib方法】,所以nib文件是在运行时动态加载的。

长期以来,Xcode环境和Interface Builder是两个独立但相互工作的程序。而2010年释出的Xcode 4预览版中,Xcode和Interface Builder合二为一,成为一个一体化的编程环境。所以现在,开发者甚至可以只用鼠标在用户界面和代码间来回拖拽就能完成,这样一来Interface Builder对用户代码的解释也比先前更正确。比早期分离的程序使用起来确实方便很多。

当然,一个负面的影响是,这样用一体化集成开发环境写程序,往往会发现屏幕空间是不够的,所以像我这样用11寸Air或者13寸Macbook Pro的人,出去打招呼都不好意思说自己是做Mac开发的。

下一个海阔天空

在而后的岁月里,Interface Builder创造了一个又一个应用软件神话,小到官方教程中的汇率计算器,大到苹果所有的家用、专业软件,都由Interface Builder完成。

在风起云涌的1989年,欧洲核子研究组织(CERN)工作的科学家Emilio Pagiola忽悠经费,买来研究所的第一台NeXT计算机——当时NeXT计算机在CERN可是个新鲜事物——那里的科学家们纷纷前来把玩,普通青年发现里面有全本的韦氏词典,并可自动检查用户输入的拼写错误,技术青年发现它跑的是Unix系统,还有一个可读写的光驱,文艺青年更是发现里面居然预装了莎翁全集。不过毕竟像Emilio Pagiola这样忽悠巨款买NeXT机器的青年不多,所以大家围观完了,也就回去该干嘛干嘛了。

但Tim Berners-Lee和别人不一样,他不仅围观了那台计算机,还看到了Jean-Marie Hullot设计的 Interface Builder,研究了Objective-C,发现了面向对象编程范式开发环境的最高成就。这情景让他心中漾起了巨大的波澜,最终化为激情澎湃的投入,汇成了一行行面向对象的代码,一泻千里,奔向未来。

一年后,世界首个 HTTP 服务在CERN的NeXT计算机运行起来,而使用Objective-C和Interface Builder 所编写的超文本语言编辑器兼浏览器同步发行。他给这个主从式架构起了个好听的名字——World Wide Web(万维网)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-19 23:45:31 | 显示全部楼层
Mac OS X 背后的故事(六)Cordell Ratzlaff 引发的 Aqua 革命(上)

Aqua是Mac OS X Public Beta全新用户界面的名字,英文中为水的词根,寓意以水为灵感,精心设计。Steve Jobs曾介绍说,Aqua的设计是如此之美好,初次见它甚至有想亲吻的冲动。本篇Cordell Ratzlaff 引发的 Aqua 革命(上)介绍的是Aqua的起源和来历,在下篇中,我们将展示Aqua的具体设计过程。


“Mac OS的图形界面就是你们那么业余的人设计的吗?”Steve Jobs开门见山地问。



包括Cordell Ratzlaff在内的设计师们怯怯地点头称是。“你们就是一群白痴!”Steve Jobs骂道。

这个场景发生在Steve Jobs回归不久的图形界面组组会上,前文提到的骂人的话,是他送给图形界面设计组的见面礼。【注:参见http://www.cultofmac.com/how-mac ... versary-story/87889,How Mac OS X Came To Be,Leander Kahney】

不进则退的局面

Mac OS曾是图形界面设计的先驱。

从System 1开始,Mac就打破了字符终端的模式,使用图形界面和用户交互设计。但自System 1到System 7,10年过去了,界面却始终没有显著的变化。设计组一直认为,为尊重用户的习惯,定下的规矩不要轻易改动。但同时,Microsoft的变化可以说是天翻地覆,从黑屏的DOS,到全屏幕的Windows 1,再到成熟的Windows 3,最后演变到奠定当今Windows界面基础的炫丽多彩的Windows 95。用当时的眼光来看,这个变化是相当惊人的。由于因循守旧,Mac OS在界面设计上从领先掉到了最后。旧的界面原语,一成不变的界面风格,让Mac OS的图形界面在Windows前显得黯然无光。【注:参见http://vimeo.com/21742166

于是,在图形界面组的组会上,Steve Jobs 抨击了老Mac OS界面的各种不是——几乎所有的地方都被骂了一遍。众矢之的是各种打开窗口和文件夹的方式。在Mac OS中有至少8种打开窗口和访问文件夹的方式,如弹出菜单、下拉菜单、DragStrip、Launcher、Finder等不同的程序。

Cordell Ratzlaff作为主管,他一开始担心是不是会被Steve Jobs炒掉(传闻说Steve Jobs刚进入苹果时最爱炒人,经常会发生一些“神奇”的情况,比如有员工和他一同进了电梯,等一同出电梯时,该员工已被炒掉)。不过批评大会进行到第20分钟时,Cordell Ratzlaff转为淡定,因为他意识到如果Steve Jobs要炒他,不用废那么多话,早就可以动手了。

其实Cardell Ratzlaff是Apple内部较早意识到小组设计不思进取的人之一。他意识到苹果有三个重要的设计问题【注:参见Designing Interactions 第二章My PC 附录访谈】。第一、Apple的很多界面语言不明确。例如,在老Mac OS中,删除文件的动作是把文件图标拖到废纸篓里,但当磁盘和光盘弹出时,居然也是把图标拖到废纸篓里。第二、老Mac OS不会对问题进行变通,如果有几个图标同时显示,窗口还容易操作,但如果有几十个图标或窗口,以相同的方式显示出来,那么在繁杂的页面中找寻所需内容,对使用者则是巨大的挑战。第三、Mac OS的界面过于古板,看上去还是停留在Windows 3.0阶段。总之,当时的Mac OS已经不能代表先进的生产力,也不能代表科技的前进方向,更不能让广大用户得到更多的利益。在Cardell Ratzlaff看来, Mac OS的界面面临不进则退的重大困局,非改不可。

Cordell Ratzlaff的试水

收购NeXT以后,Apple开始考虑如何把NeXTSTEP作业系统变为下一代的Apple操作系统,但界面设计组的倦怠又浮出水面。设计组认为,这是一个浩大的工程,所以他们决定照着Mac OS 8的样子改NeXTSTEP的代码,把NeXTSTEP改成System 8的样子。这并不困难,组里只需一个人就能完成这项任务,这人的工作极其无聊——像小孩子描红模,把新界面的样子临摹得和老界面一模一样。事实上,当Apple 释出Rhapsody和Mac OS X Server初版时,经典Mac OS的界面已经被学得惟妙惟肖了。

Cordell Ratzlaff认为这种混搭,是一个极其让苹果丢颜面的事情。所以,除了那个搞山寨的人以外,他召集其他人做新界面设计的图样。而由于NeXTSTEP具有强大的图形处理和动画能力,因此很多新的图样是在新系统上完成的。


Apple将“What's not a computer!”(看起来不是电脑的电脑)的 概念应用在硬件外观上,设计出具有浪漫主义气质,半透明“果冻” 式且具有艺术美感的iMac,这成了Aqua设计灵感的来源

20世纪90年代初,Apple和Microsoft的操作系统都素面朝天,色调简单,统一的矩形窗口。到1997~1998年,Apple的硬件外观设计取得重大进展:由后来成为金牌设计师的 Jonathan Ive领衔,设计出具有浪漫主义气质、五彩斑澜的、半透明外壳、具有曲线美感的iMac,这个设计成为Cordell Ratzlaff和他的同事们设计的灵感,他们马上就作出了一个全新的界面图样来。【注:参见http://en.wikipedia.org/wiki/IMac_G3

与此同时,Cordell Ratzlaff 着手解决前文提到的三个设计问题。第一、他提出了一个叫“实时状态”的概念。当用户拖动文件时,废纸保持原样,而如果拖动的是磁盘,那废纸篓的图标变成“弹出”的图标。第二、窗口的问题统一采用动画加以解决。比如窗口的最小化和还原都配有动画,告诉用户窗口的来去方向。当Dock项目有所增减时,项目长度和元素也会随之改变。第三、Mac OS一改死板面孔,呈现多彩的、小清新的图形界面,所有尖锐的直角都被打磨成圆弧,并且有像iMac外壳一样半透明的菜单。当时有评论指责Apple的设计太卡通缺乏权威感,其变化之大可见一斑。【注:参见http://www.aresluna.org/attached ... epixelsofcanvas.pdf,One thousand square pixels of canvas On evolution of icons in graphical interfaces by Marcin Wichary 第五页】

Cocoa之父Bertrand Serlet,作为Cordell Ratzlaff的上司,对新界面很满意。但当时,他们认为这个新界面实现起来难度很大,既没有时间也没有资源把这个想法在Mac OS X中付诸实现。于是先前那位孤独的照葫芦画瓢的设计者只好继续工作。

Aqua只是个设想(PS出来的图样+模拟出来的视频),还不是能用的代码。

Steve Jobs的怒火和Aqua的源头

几个月以后,Apple举办了一个所有开发小组参加的长达两天的汇报大会。Cordell Ratzlaff汇报的时间被排在两天的最后压轴出场。大多数工程师对这长达两天的大会报告早已疲倦,感叹Mac OS X剩下的的工作很艰巨,认为发布遥遥无期。于是,Cordell Ratzlaff报告成了整个报告会的最大笑场,所有工程师使出咆哮体来评价这个工作——“啊!!!你看这新界面多出位啊!!!有没有有没有!!!居然用的透明通道!!!还搞个实时的动画!!!你难道不知道你这些永远是天方夜谭不可能完成吗???我们工程师伤不起啊伤不起!!!”这个新设计就这样在所有Apple顶级工程师的鄙视下被废了。

无奈于此,只好无聊地让那位开发者继续复制全套经典Mac OS界面,而当Steve Jobs召集所有设计组负责人时,这个山寨版Mac OS的展示把Steve Jobs看得情绪激动,就发生了文章开头的那一幕。

Cordell Ratzlaff前来解释压轴报告的尴尬局面,暗示千里马常有而伯乐不常有的处境,还让Steve Jobs观摩了他的杰作。果然Steve Jobs看了这几张图例后大为惊异,拍着Cordell Ratzlaff的肩说:“很好!很强大!”然后让设计组不惜一切代价做成试验品。

在加班奋战的三周后,设计组用Macromedia Director完成了一个试验品。Steve Jobs亲自来Cordell Ratzlaff办公室视察了一下午。结果是他激动地握着Cordell Ratzlaff的手,吐露心声:“你是苹果里我见到的第一个智商是三位数字的人。”得到了Steve Jobs的支持,Apple的Mac OS X开发团队,更加紧密地围绕在以Cordell Ratzlaff为核心的界面设计概念周围,开发操作系统。

有缘千里来相会,无缘对面不相识。Steve Jobs和Cordell Ratzlaff算是相见恨晚。这样由Cordell Ratzlaff主导的新界面,在Steve Jobs的支持下,横扫一切困难,成为新版操作系统界面的最大亮点。

从这时到Steve Jobs正式在舞台上秀他的Mac OS X Public Beta,还有18个月。此时,系统界面革命的旅程已经开始,一道神秘的天光射向Infinity Loop,千古杰作Aqua就要在这里诞生,其光辉历程,我们下篇再谈。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-19 23:47:48 | 显示全部楼层
Mac OS X 背后的故事(七)Cordell Ratzlaff 引发的 Aqua 革命(下)

Mac OS X 背后的故事(六)讲到,Cordell Ratzlaff新界面方案得到Steve Jobs的高度肯定,Steve Jobs让各开发组紧紧围绕在界面设计组周围,共同建造Mac OS X。此时,离Mac OS X第一个公共测试版的发布,仅有一年半时间。这时苹果的设计构想,还仅仅是个概念,在本篇中我们将展示Aqua的具体设计过程。

设计与软件的融合

开发分设计和软件两条路并行走,“两手抓,两手都要硬”。


设计是个有趣的领域。有些人认为,设计就是产品的外观看上去什么样。但其实,如果细想一下,你会发现设计其实是有关产品如何工作的学问。
——Steve Jobs


首先,苹果定下计划,并规划整个界面设计元素的方案,把设想通过可操作性强的材料让工程师来实现。

Cordell Ratzlaff每周都要和Steve Jobs开会,向他展示界面设计小组最新成果。任何大家现在见到的各界面控件,如菜单、按钮、进度条、Steve Jobs都一一过目,毫不马虎。针对每一个控件,Cordell Ratzlaff会要求拿出多套方案来,让Steve Jobs选出他中意的。Steve Jobs也会提出各种他自己的见解和改进建议,而Cordell Ratzlaff则会根据这些回馈不断修改,直到Steve Jobs满意为止。

与此同时,软件工程师也以越来越重的比例加入到这个设计行列中。

图形界面设计小组使用的设计软件是Macromedia Director。它能做出演示用的动画,可以演示打开、关闭窗口、下拉菜单等模拟效果,但这些并不是可供用户使用的最终软件。软件工程师需要把图形界面设计师的设计,变为一行行代码,运用到Mac OS X中。所以每次会议的Macromedia Director动画演示机旁,还会有一台计算机,预装了软件工程师转换的代码。当工程师们向Steve Jobs展示最新代码如何工作时,Steve Jobs会身体前倾,鼻子快贴到荧幕上,观察细微到“像素级别”来比较软件的表现和之前的设计是否完全一致。如果他有发现任何细微的差错,一阵类似“你们全是一帮白痴”的腥风血雨就会在办公室中展开。

设计整套方案是一个令人难以置信的漫长过程,尤其是遇到追求完美的Steve Jobs。Mac OS X中有一个控件叫滚动条(NSScroller)。当需要显示的内容长于当前控件大小时就会出现滚动条,可上下翻阅内容。这是一个非常不起眼的控件,大多数时间,用户甚至注意不到它的存在,甚至在十年后的今天它都被默认不显示了(关于Lion图形界面的改动受iOS思潮的影响我们今后会提到)。但哪怕是这种不起眼的细节,Steve Jobs都偏执地当个大项目来做。Mac OS X的界面设计是有史以来最复杂的一个,需要考虑诸多因素——比如所在窗口的活动与否,都会影响这个控件的颜色等属性。就滚动条而言,箭头的大小、位置的变化、颜色的启用等全都是活动的属性,牵一发而动全身。一根看似简单得不能再简单的滚动条,设计组花了整整六个月来修改。

当时,Mac OS X的用户界面有两个重大的设计目标:第一是让老用户没有压力地迁移过来,且倍感新界面的好用;第二是让那些从未摸过Mac的人尽快上手,并称赞这界面很好很强大。所以,整个界面设计保留了老Mac OS界面元素的设计理念,但同时又对很多有问题的老设计进行了革新。比如,在老版Mac OS中,各种系统设置选项是隐藏在不计其数的系统扩展、控制面板,以及很多系统组件中的。用户要想联个网,要去五六个地方设网络、设IP、设连接设密码,而在Mac OS X中,所有这些设置都被分门别类地规类到一个单一的程序——系统首选项(System Preferences),让用户“足不出户”,就能进行一切相关设置。

精简的狂热追求和大胆的设计创新

Apple偏爱最简化的设计,而往往满屏的窗口让Steve Jobs忍无可忍。又酷又炫的Dock横空出世,巧妙地解决了这个问题。Dock的设计源于Mac OS X的前身NeXTSTEP,但在Mac OS X中完全被重写,并重定义了它的功能。Dock提供用户一个放置常用软件图标、闲置窗口、文档的场所,Steve Jobs说“任何东西都能被拉进 Dock”。但Dock真正神奇的,是它犹如多拉A梦的口袋,有无限的承载能力。当放入Dock中的东西变多时,它会自动把横向宽度变长、图标变小,可承载几十个窗口。当窗口缩入和还原时,都配有“精灵”一样的动画——在Dock的图标多的时候,每个图标很小,用户就很难找到需要的——灵动且放大动画可以让用户能快速地找到所需。

另外,起初版本的Dock中每个图标都是正方形的方块,被换成半透明的背景,看得人垂涎欲滴。这些经典的设计,影响了整整一代图形界面设计者,被各山寨界面抄了一遍又一遍,甚至又活在当今的Ubuntu Linux的Unity和 Windows 7中。

Apple追求清爽甚至到了发疯的地步,在最初版的 Mac OS X Public Beta中,每个窗口有一个按钮,只要按下,除了当前窗口外,其它一切都会飞入Dock。因此,只要一键,“整个世界都清静了”。而在后来每个版本的Mac OS X中,都有大的更新来防止窗口或其他界面元素的堆积。10.3时代的Exposé,10.5时代的Stack和Spaces,10.6时代的Exposé和Dock相结合双管齐下,到 10.7时代的Mission Control,都是用来解决果面精简这一个问题的。

而很多传统的界面控件也被赋予了新的含义。比如 Steve Jobs觉得,“最大化”一个窗口没有实际意义,而且把整个窗口最大化,也会挡住后面的窗口(直到2011年,Apple用“全屏”来重新定义传统的“最大化”)。而Mac OS X没有所谓的“最大化”,取而代之的是自动计算后调整窗口到所需大小的“最适化按钮”。而关闭一个窗口的含意也不该是关闭一个程序,而只应是结束目前的内容。Apple的许多设计都格外具有魄力,完全重写了界面设计的教科书。当然,有许多地方Apple确实做得矫枉过正,比如Apple一直是我见过的只有拖住右下角才能改动窗口大小的唯一系统。这个置用户于不顾的狂妄设计,一直在十年后发布的 Lion中,才得以改变。

Steve Jobs一直是界面设计的重要顾问。他有时候会提出一些看似稀奇古怪的意见,但往往最终又被证明是好的。比如,有一次他在会上指出,窗口左上角的“关闭”、“最小化”、“最适化”三个按钮的颜色都是一样的灰色,不容易区分他们。他建议把三个按钮变成交通灯的颜色,并且当鼠标移到附近时,显示出相应的图形指示。当Cordell Ratzlaff一群人听到这个主意后面色大变,认为简直是计算机图形设计史上最好笑的段子——谁会把电脑当交通灯使啊。不过改完后,他们对Steve Jobs心悦诚服——“红灯给用户一个终止的警示,这个窗口要被关掉;黄灯表示这个窗口要被放入等待队列,以便以后再通行;最适化则是给这个窗口大开绿灯”——这样高明的比喻,使 Cordell Ratzlaff对Steve Jobs崇拜得五体投地。
18个月转瞬即逝,“你们就是一群白痴”的骂声依旧清晰,而此时的 Mac OS X的图形界面,已今非昔彼。

“语静声息。我走上舞台。依着那打开的门,我试图探测回声中,蕴涵着什么样的未来。”(北岛翻译的帕斯捷尔纳克的《哈姆雷特》)。

18个月后的2000年1月,新世纪的钟声刚刚敲响,Steve Jobs镇定地走上 MacWorld大会的舞台,独领风骚的新世纪的经典大作Aqua,此时,就要被他揭开帷幕
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-19 23:51:15 | 显示全部楼层
Mac OS X 背后的故事(八)三好学生Chris Lattner的LLVM编译工具链

2011年12月3日,LLVM 3.0正式版发布,完整支持所有ISO C++标准和大部分C++ 0x的新特性, 这对于一个短短几年的全新项目来说非常不易。


开发者的惊愕

在2011年WWDC(苹果全球开发者大会)的一场与Objective-C相关的讲座上,开发者的人生观被颠覆了。

作为一个开发者,管理好自己程序所使用的内存是天经地义的事,好比人们在溜狗时必须清理狗的排泄物一样(美国随处可见“Clean up after your dogs”的标志)。在本科阶段上C语言的课程时,教授们会向学生反复强调:如果使用malloc函数申请了一块内存,使用完后必须再使用free函数把申请的内存还给系统——如果不还,会造成“内存泄漏”的结果。这对于Hello World可能还不算严重,但对于庞大的程序或是长时间运行的服务器程序,泄内存是致命的。如果没记住,自己还清理了两次,造成的结果则严重得多——直接导致程序崩溃。

Objective-C有类似malloc/free的对子,叫alloc/dealloc,这种原始的方式如同管理C内存一样困难。所以Objective-C中的内存管理又增加了“引用计数”的方法,也就是如果一个物件被别的物件引用一次,则引用计数加一;如果不再被该物件引用,则引用计数减一;当引用计数减至零时,则系统自动清掉该物件所占的内存。具体来说,如果我们有一个字符串,当建立时,需要使用alloc方法来申请内存,引用计数则变成了一;然后被其他物件引用时,需要用retain方法去增加它的引用计数,变成二。当它和刚才引用的物件脱离关联时,需使release方法减少引用计数,又变回了一;最后,使用完这个字符串时,再用release方法减少其引用计数,这时,运行库发现其引用计数变为零了,则回收走它的内存。这是手动的方式。

这种方式自然很麻烦,所以又设计出一种叫做autorelease的机制(不是类似Java的自动垃圾回收)。在Objective-C中,设计了一个叫做NSAutoReleasePool的池,当开发者需要完成一个任务时(比如每开启一个线程,或者开始一个函数),可以手动创立一个这样的池子, 然后通过显式申明把物件扔进自动回收池中。NSAutoReleasePool内有一个数组来保存声明为autorelease的所有对象。如果一个对象声明为autorelease,则会自动加到池子里。如果完成了一个任务(结束线程了,或者退出那个函数),则开发者需对这个池子发送一个drain消息。这时,NSAutoReleasePool会对池子中所有的物件发送release消息,把它们的引用计数都减一 ——这就好比游泳池关门时通知所有客人都“滚蛋”一样。所以开发者无需显式声明release,所有的物件也会在池子清空时自动呼叫release函数,如果引用计数变成零了,系统才回收那块内存。所以这是个半自动、半手动的方式。

Objective-C的这种方式虽然比起C来进了一大步,我刚才花了几分钟就和读者讲明白了。只要遵守上面这两个简单的规则,就可以保证不犯任何错误。但这和后来的Java自动垃圾回收相比则是非常繁琐的,哪怕是再熟练的开发者,一不小心就会弄错。而且,哪怕很简单的代码,比如物件的getter/setter函数,都需要用户写上一堆的代码来管理接收来的物件的内存。

经典教材《Cocoa Programming for Mac OS X》用了整整一章节的篇幅,来讲解Objective-C中内存管理相关的内容,但初学者们看得还是一头雾水。所以,在2007年10.5发布时,Objective-C做出了有史以来最大的更新,最大的亮点是它的运行库libobjc 2.0正式支持自动垃圾回收,也就是由运行库在运行时随时侦测哪些物件需要被释放。听上去很不错,可惜使用这个技术的项目却少之又少。原因很简单,使用这个特性,会有很大的性能损失,使Objective-C的内存管理效率低得和Java一样,而且一旦有一个模块启用了这个特性,这个进程中所有的地方都要启用这个特性——因此如果你写了一个使用垃圾回收的库,那所有引用你库的程序就都得被迫使用垃圾回收。所以Apple自己也不使用这项技术,大量的第三方库也不使用它。

这个问题随Apple在移动市场的一炮走红而变得更加严峻。不过这次,Apple和与会的开发者讲,他们找到了一个解决问题的终极方法,这个方法把从世界各地专程赶来聆听圣谕的开发者惊得目瞪口呆——你不用写任何内存管理代码,也不需要使用自动垃圾回收。因为我们的编译器已经学会了上面所介绍的内存管理规则,会自动在编译程序时把这些代码插进去。

这个编译器,一直是Apple公开的秘密——LLVM。说它公开,是因为它自始至终都是一个开源项目;而秘密,则是因为它从来没公开在WWDC的Keynote演讲上亮相过 。

一直关注这系列连载的读者一定还记得,在第二篇《Linus Torvalds的短视》介绍Apple和GPL社区的不合时,提到过“自以为是但代码又写得差的开源项目,Apple事后也遇到不少,比如GCC编译器项目组。虽然大把钞票扔进去,在先期能够解决一些问题,但时间长了这群人总和Apple过不去,并以自己在开源世界的地位恫吓之,最终Apple由于受不了这些项目组的态度、协议、代码质量,觉得还不如自己造轮子来得方便。”LLVM则是Apple造的这个轮子,它的目的是完全替代掉GCC那条编译链。它的主要作者,则是现在就职于Apple的Chris Lattner。

编译器高材生Chris Lattner

2000年,本科毕业的Chris Lattner像中国多数大学生一样,按部就班地考了GRE,最终前往UIUC(伊利诺伊大学厄巴纳香槟分校),开始了艰苦读计算机硕士和博士的生涯。在这阶段,他不仅周游美国各大景点,更是努力学习科学文化知识,翻烂了“龙书”(《Compilers: Principles, Techniques, and Tools》),成了GPA牛人【注:最终学分积4.0满分】,以及不断地研究探索关于编译器的未知领域,发表了一篇又一篇的论文,是中国传统观念里的“三好学生”。他的硕士毕业论文提出了一套完整的在编译时、链接时、运行时甚至是在闲置时优化程序的编译思想,直接奠定了LLVM的基础。
LLVM在他念博士时更加成熟,使用GCC作为前端来对用户程序进行语义分析产生IF(Intermidiate Format),然后LLVM使用分析结果完成代码优化和生成。这项研究让他在2005年毕业时,成为小有名气的编译器专家,他也因此早早地被Apple相中,成为其编译器项目的骨干。

Apple相中Chris Lattner主要是看中LLVM能摆脱GCC束缚。Apple(包括中后期的NeXT) 一直使用GCC作为官方的编译器。GCC作为开源世界的编译器标准一直做得不错,但Apple对编译工具会提出更高的要求。

一方面,是Apple对Objective-C语言(甚至后来对C语言)新增很多特性,但GCC开发者并不买Apple的帐——不给实现,因此索性后来两者分成两条分支分别开发,这也造成Apple的编译器版本远落后于GCC的官方版本。另一方面,GCC的代码耦合度太高,不好独立,而且越是后期的版本,代码质量越差,但Apple想做的很多功能(比如更好的IDE支持)需要模块化的方式来调用GCC,但GCC一直不给做。甚至最近,《GCC运行环境豁免条款 (英文版)》从根本上限制了LLVM-GCC的开发。 所以,这种不和让Apple一直在寻找一个高效的、模块化的、协议更放松的开源替代品,Chris Lattner的LLVM显然是一个很棒的选择。

刚进入Apple,Chris Lattner就大展身手:首先在OpenGL小组做代码优化,把LLVM运行时的编译架在OpenGL栈上,这样OpenGL栈能够产出更高效率的图形代码。如果显卡足够高级,这些代码会直接扔入GPU执行。但对于一些不支持全部OpenGL特性的显卡(比如当时的Intel GMA卡),LLVM则能够把这些指令优化成高效的CPU指令,使程序依然能够正常运行。这个强大的OpenGL实现被用在了后来发布的Mac OS X 10.5上。同时,LLVM的链接优化被直接加入到Apple的代码链接器上,而LLVM-GCC也被同步到使用GCC4代码。

LLVM真正的发迹,则得等到Mac OS X 10.6 Snow Leopard登上舞台。可以说, Snow Leopard的新功能,完全得益于LLVM的技术。而这一个版本,也是将LLVM推向真正成熟的重大机遇。

关于Snow Leopard的三项主推技术(64位支持、OpenCL,以及Grand Central Dispatch)的细节,我们会在下一次有整整一期篇幅仔细讨论,这次只是点到为止——我们告诉读者,这些技术,不但需要语言层面的支持(比如Grand Centrual Dispatch所用到的“代码块”语法, 这被很多人看作是带lambda的C),也需要底层代码生成和优化(比如OpenCL是在运行时编译为GPU或CPU代码并发执行的)。而这些需求得以实现,归功于LLVM自身的新前端——Clang。

(字数限制,接下一楼)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-19 23:51:52 | 显示全部楼层
(接上一楼 LLVM编译工具链)


优异的答卷——Clang

前文提到,Apple吸收Chris Lattner的目的要比改进GCC代码优化宏大得多——GCC系统庞大而笨重,而Apple大量使用的Objective-C在GCC中优先级很低。此外GCC作为一个纯粹的编译系统,与IDE配合得很差。加之许可证方面的要求,Apple无法使用LLVM 继续改进GCC的代码质量。于是,Apple决定从零开始写 C、C++、Objective-C语言的前端 Clang,完全替代掉GCC。

正像名字所写的那样,Clang只支持C,C++和Objective-C三种C家族语言。2007年开始开发,C编译器最早完成,而由于Objective-C相对简单,只是C语言的一个简单扩展,很多情况下甚至可以等价地改写为C语言对Objective-C运行库的函数调用,因此在2009年时,已经完全可以用于生产环境。C++的支持也热火朝天地进行着。

Clang的加入代表着LLVM真正走向成熟和全能,Chris Lattner以影响他最大的“龙书”封面【注:见http://en.wikipedia.org/wiki/Dragon_Book_(computer_science)】为灵感,为项目选定了图标——一条张牙舞爪的飞龙。

Clang一个重要的特性是编译快速,占内存少,而代码质量还比GCC来得高。测试结果表明Clang编译Objective-C代码时速度为GCC的3倍【注:http://llvm.org/pubs/2007-07-25-LLVM-2.0-and-Beyond.pdf】,而语法树(AST)内存占用则为被编译源码的1.3倍,而GCC则可以轻易地可以超过10倍。Clang不但编译代码快,对于用户犯下的错误,也能够更准确地给出建议。使用过GCC的读者应该熟悉,GCC给出的错误提示基本都不是给人看的。

比如最简单的:

struct foo { int x; }
typedef int bar;

如果使用GCC编译,它将告诉你:
t.c:3: error: two or more data types in declaration specifiers

但是Clang给出的出错提示则显得人性化得多:
t.c:1:22: error: expected ‘;’ after struct

甚至,Clang可以根据语境,像拼写检查程序一样地告诉你可能的替代方案。
比如这个程序:

#include <inttypes.h>
int64 x;

GCC一样给出乱码似的出错提示:

t.c:2: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘x’

而优雅的Clang则用彩色的提示告诉你是不是拼错了,并给出可能的变量名:

t.c:2:1: error: unknown type name ‘int64′; did you mean ‘int64_t’?
int64 x;^~~~~int64_t

更多的例子可以参考http://blog.llvm.org/2010/04/ama ... error-recovery.html。 而同时又因为Clang是高度模块化的一个前端,很容易实现代码的高度重用。所以比如Xcode 4.0的集成编程环境就使用Clang的模块来实现代码的自动加亮、代码出错的提示和自动的代码补全。开发者使用Xcode 4.0以后的版本,可以极大地提高编程效率,尽可能地降低编译错误的发生率。

支持C++也是Clang的一项重要使命。C++是一门非常复杂的语言,大多编译器(如GCC、MSVC)用了十多年甚至二十多年来完善对C++的支持,但效果依然不很理想。Clang的C++支持却一直如火如荼地展开着。2010年2月4日,Clang已经成熟到能自举(即使用Clang编译Clang,到我发稿时,LLVM 3.0发布已完整支持所有ISO C++标准,以及大部分C++ 0x的新特性。

这对于一个短短几年的全新项目来说是非常不易的。得益于本身健壮的架构和Apple的大力支持,Clang越来越全能,从FreeBSD【注:http://lists.freebsd.org/piperma ... ebruary/003743.html】 到Linux Kernel【注:http://lists.cs.uiuc.edu/piperma ... October/011711.html】, 从Boost【注:http://blog.llvm.org/2010/05/clang-builds-boost.html】 到Java虚拟机, Clang支持的项目越来越多。

Apple的Mac OS X以及iOS也成了Clang和LLVM的主要试验场——10.6时代,很多需要高效运行的程序比如OpenSSL和Hotspot就由LLVM-GCC编译来加速的。而10.6时代的Xcode 3.2诸多图形界面开发程序如Xcode、Interface Builder等,皆由Clang编译。到了Mac OS X 10.7,整个系统的的代码都由Clang或LLVM-GCC编译【注:http://llvm.org/Users.html】。

LLVM周边工具

由于受到Clang项目的威胁,GCC也不得不软下来,让自己变得稍微模块化一些,推出插件的支持,而LLVM项目则顺水推舟,索性废掉了出道时就一直作为看家本领的LLVM-GCC,改为一个GCC的插件DragonEgg。 Apple也于Xcode 4.2彻底抛弃了GCC工具链。

而Clang的一个重要衍生项目,则是静态分析工具,能够通过自动分折程序的逻辑,在编译时就找出程序可能的bug。在Mac OS X 10.6时,静态分析被集成进Xcode 3.2,帮助用户查找自己犯下的错误。其中一个功能,就是告诉用户内存管理的Bug,比如alloc了一个物件却忘记使用release回收。这已经是一项很可怕的技术,而Apple自己一定使用它来发现并改正Mac OS X整个系统各层面的问题。但许多开发者还不满足——既然你能发现我漏写了release,你为什么不能帮我自动加上呢?于是ARC被集成进Clang,发生了文章开头开发者们的惊愕——从来没有人觉得这件事是可以做成的。

除LLVM核心和Clang以外,LLVM还包括一些重要的子项目,比如一个原生支持调试多线程程序的调试器LLDB,和一个C++的标准库libc++,这些项目由于是从零重写的,因此要比先前的很多项目站得更高,比如先前GNU、Apache、STLport等C++标准库在设计时,C++0x标准还未公布,所以大多不支持这些新标准或者需要通过一些肮脏的改动才能支持,而libc++则原生支持C++0x。而且在现代架构上,这些项目能动用多核把事情处理得更好。

不单单是Apple,诸多的项目和编程语言都从LLVM里取得了关键性的技术。Haskell语言编译器GHC使用LLVM作为后端,实现了高质量的代码编译。很多动态语言实现也使用LLVM作为运行时的编译工具,较著名的有Google的Unladen Swallow【注:Python实现,后夭折】、PyPy【注:Python实现】,以及MacRuby【注:Ruby实现】。例如 MacRuby 后端改为LLVM后,速度不但有了显著的提高,更是支持Grand Central Dispatch来实现高度的并行运行。由于LLVM高度的模块化,很方便重用其中的组件来作为一个实现的重要组成部分,因此类似的项目会越来越多。

LLVM的成熟也给其他痛恨GCC的开发项目出了一口恶气。其中最重要的,恐怕是以FreeBSD为代表的BSD社区。BSD社区和Apple的联系一向很紧密,而且由于代码相似,很多Apple的技术如Grand Central Dispatch也是最早移植到FreeBSD上。BSD社区很早就在找GCC的替代品,无奈大多都很差(如Portable C Compiler产生的代码质量和gcc不能同日而语)。

一方面是因为不满意GCC的代码品质【注:BSD代码整体要比GNU的高一些,GNU代码永无休止地出现各种严重的安全问题】,更重要的是协议问题。BSD开发者有洁癖的居多,大多都不喜欢GPL代码,尤其是GPL协议第三版发布时,和FreeBSD的协议甚至是冲突的。这也正是为什么FreeBSD中包含的GNU的C++运行库还是2007年以GPLv2发布的老版本,而不是支持C++0x的但依GPLv3协议发布的新版本。 因此历时两年的开发后,2012年初发布的FreeBSD 9.0中,Clang被加入到FreeBSD的基础系统。 但这只是第一步,因为FreeBSD中依然使用GNU的C++ STL 库、C++运行库、GDB调试器、libgcc/libgcc_s编译库都是和编译相关的重要底层技术,先前全被GNU垄断,而现在LLVM子项目lldb、libc++、compiler-rt等项目的出现,使BSD社区有机会向GNU说“不”,因此一个把GNU组件移出FreeBSD的计划被构想出来,并完成了很大一部分。编写过《Cocoa Programming Developer’s Handbook》的著名Objective-C牛人David Chisnall也被吸收入FreeBSD开发组完成这个计划的关键部分。 预计在FreeBSD 10发布时,将不再包含GNU代码。

LLVM在短短五年内取得的快速发展充分反映了Apple对于产品技术的远见和处理争端的决心和手腕,并一跃成为最领先的开源软件技术。而Chris Lattner在2010年也赢得了他应有的荣誉——Programming Languages Software Award(程序设计语言软件奖)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-19 23:55:00 | 显示全部楼层
Mac OS X 背后的故事(九)半导体的丰收(上)


在美国宾夕法尼亚州的东部,有一个风景秀美的城市叫费城。在这个城市诞生了一系列改变世界的奇迹:第一个三权分立的国家——美立坚合众国,就在第五街的路口诞生;举世闻名的费城交响乐团,1900年在市中心的Academy of Music奏响了他们的第一个音符。而写这篇文章时,我正坐在三十四街的宾夕法尼亚大学计算机系的一楼实验室,面前摆放着世界上第一台电子计算机——ENIAC。

1946年2月14日,ENIAC问世,每秒可运行5000次加法运算或500次乘法运算,面积达170平方米,重约30吨,拉开了计算机处理器革命的序幕。这场革命是各处理器厂商长达数十年的竞赛,而摩尔定律从一开始就准确地预测了这场比赛的走势。根据摩尔定律,同样价格的集成电路上可容纳的晶体管数目,每隔约18个月便会增加一倍,性能也将提升一倍。但事实上,并无法用老路子来保持这个增长速度,因为会遇到包括能耗、散热等各种技术瓶颈。所以每隔几年就会有用来绕过这些瓶颈的新一代产品推出。如采用超纯量(superscala)、指令管线化、快取等。这些技术通过一定程度的高效并行来挖掘计算机处理器的速度所能达到的高度,以促使用户更新换代。


世界上第一台计算机ENIAC,1946年2月14日诞生于宾夕法尼亚大学

和66年前的ENIAC相比,今天的处理器已有了质的飞越。而21世纪的前十年,我们更是见证了个人计算机处理器的三次重大革命——64位处理器、多核心和高效图形处理器在个人电脑出现。在这样的背景下,乔布斯在2008年WWDC(苹果全球开发者大会)上,宣布下一代Mac操作系统Mac OS X 10.6将被命名为Snow Leopard(雪豹)来适应硬件架构的革新。就在那天下午,Bertrand Serlet在一场开发者内部讲座上透露,和先前两个发行版包含大量的新功能(10.4 Tiger包含150个新功能,10.5 Leopard包含300个新功能)不同,Snow Leopard不含任何新功能,仅是对Leopard中诸多技术的重大更新,以使其在现代架构上更稳定、高效。 在这十年的最后一年,2009年8月28日,苹果发布了Mac OS X 10.6来有效地支持这三项技术,而本文将为读者介绍其对应的三项软件技术——64位架构、Grand Central Dispatch,以及OpenCL。 其他Mac OS X 10.6技术更新,如全新的QuickTime X和跳票的ZFS,有着更复杂的历史背景(以后再为读者介绍)。

64位架构出现的缘由

前文提到,根据摩尔定律,同样价格的集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。事实上,存储器的容量增长可能更快,每过15个月就会翻一番。有了更快更强的电脑,可能会让数值计算的科学家们喜出望外,但对普通大众来说,摩尔定律给普通消费者一个假象——如果你觉得1000美元的苹果电脑太贵,那等上18个月就可以用500美元买到同样的电脑。十年前你在用电脑写Word文档,十年后你还在用电脑写Word文档,反正计算机不是耗材,一台电脑只要不坏,就不用去买新的。计算机产业的巨头们自然知道摩尔定律对他们造成的致命打击,因此,一个阴谋被以Intel和Microsoft为首的巨头们构想出来—Intel负责把硬件越做越快,而Microsoft则负责把自己的软件越做越臃肿、越做越慢—至于你信不信,反正我是信的。因此,使用软件、服务等,直接促进计算机产业的消费,使得计算机产业走上可持续发展的道路。这在计算机产业被称为Andy-Bill定律,分别以Intel和Microsoft总裁的名字命名。

当然,软件公司未必真心欺骗消费者,故意把软件做大做慢——为了实现一个新功能,软件势必会比原先庞大。但现代软件的速度、大小和其增加的功能并不成比例。比如对最终用户来讲,Windows Vista到底比Windows XP多了多少功能呢?可能只有20%~30%。Word 2007对比Word 2003多了多少功能呢?可能也只有20%~30%。但Windows Vista、Word 2007占用的CPU、内存、磁盘空间,却比Windows XP和Word 2003翻了几番。究其原因,为了能赶快把新功能带给用户,我们不惜使用更方便但低效的编程语言(.NET、Java等依赖虚拟机的语言就要比C慢许多,Python等动态语言比C慢的不是一星半点)、快速开发(我们原先处理一个大文本,先分块,一点一点读到内存中,然后把处理完的部分写回磁盘,清空内存;而现在直接把它全读进来处理,开发方便,执行也快)。而用户必须为这些新功能买不成比例的单。64位就是在这个背景下迅速走入寻常百姓家的——程序占用越来越多的内存,而32位的寻址空间已不能满足软件运行的需要了。

64位 CPU是指CPU内部的通用寄存器的宽度为64bit,支持整数的64bit宽度的算术与逻辑运算。早在1960年代,64位架构便已存在于当时的超级电脑,且早在1990年代,就有以RISC为基础的工作站和伺服器。2003年才以x86-64和64位元PowerPC处理器架构(在此之前是32位元)的形式引入到个人电脑领域。从32位元到64位元架构的改变是一个根本的改变,因为大多数作业系统必须进行全面性修改以取得新架构的优点。

成功的迁移

苹果向64位处理器的迁移花了整整6年时间,远长于该公司其他技术的迁移——向Intel的迁移仅用了一年时间,从经典Mac OS到Mac OS X也仅用了三年时间。总而言之,这场迁移是非常成功的:一方面,用户基本无痛苦,老的32位程序在目前最新版的Mac OS X Lion中依然可以完全兼容地执行;另一方面,对开发者而言,基本只需做微小的调整,重新编译程序,而且若干技术如Universal Binary,使他们发布程序非常方便。当然,对于某些大量使用过时技术的公司,如Adobe和Microsoft,这场迁移则要折腾得多。

这场迁移整整用了四个发行版的时间(10.3至10.6),不同于Windows或Linux,Mac OS X对64位的迁移自下而上,再自上而下。先是内核扩展,逐渐上升至Unix空间,然后上升至用户界面,再上升至整个应用程序生态,最后完成内核的迁移。要提醒读者的是,Mac OS X的32位和64位内核空间与用户空间的分配和实现,和Windows存在本质的区别,但在本期介绍中,我们尽可能少地把Mac OS X 的64位迁移和Windows进行比较,不拘泥于技术细节,对此区别有兴趣的读者,请移步AppleInsider的系列专题。

2003年,苹果发布了其第一款64位计算机工作站Power Mac G5。同期发布的Mac OS X 10.3也因此增加了非常简单的64位支援,于是XNU内核开始支持64位的寄存器和整数计算。但对于用户空间而言,程序可见的地址依然是32位的。程序当然可以使用大于4GB的内存(Power Mac G5最高可达8GB寻址空间),但这要求程序手动地在两个32位内存空间中来回转换。

两年后,苹果发布了当时最成功的Mac OS X发行版Mac OS X 10.4 Tiger。10.4的内核是革命性的,除了增加对内核并行多线程的支持,它把用户空间可见的地址空间扩展到了64位,因此理论上用户程序可以以64位方式执行。当然,在这个时期,几乎系统内的所有程序,哪怕是内核,依然是32位的。系统中唯一带的64位二进制文件是名为libSystem.dylib的系统库。它是Mac OS X上对C标准和POSIX标准的支持库,由libc、libinfo、libkvm、libm和libpthread五部分组成。但这仅有的libSystem.dylib理论上就能让所有仅使用C标准库和POSIX标准库的程序以64位模式运行。当时,用户对64位的需求较少,主要限于科学计算或图形处理等需要大数组的领域。因此,10.4能较好地满足这部分用户的需求。但如果程序需要调用除BSD Unix以外的系统调用,比如想用Cocoa来画图形界面,那么该程序仅能以32位方式运行了。对于一些需要64位寻址空间的科学计算程序,比如Mathematica,就需要采用一些比较麻烦的做法:用一个进程调用32位的Cocoa画图形界面,用另一个进程调用64位的libSystem来进行运算和Unix系统调用,并用Unix管道或进程间通信的方式管理两个进程间的输入/输出。

苹果在Mac OS X 10.4发布同期的另一项重要决策是向Intel平台x86及x86_64架构的迁移。为了帮助开发者和用户顺利迁移,苹果正式公布了Universal Binary。Universal Binary 技术是Mach-O二进制文件早就具有的特性,只是在这个场合作为一个商业词汇进行宣传。NeXT时代NeXTSTEP操作系统就支持许多种不同的硬件架构,自然可以要求开发者对每个平台发布一个独立的版本,但这样的分发模式很麻烦,消费者也需要搞清到底购买哪种平台的软件。因此NeXT的Mach内核所支持的Mach-O二进制文件格式引入了一种叫fat binary的特性,说白了就是在一个平台架构上分别交叉编译所有平台的二进制格式文件,然后把每个文件都打包成一个文件。Universal Binary就是指同时打包Intel平台和PowerPC平台的二进制文件。Mac OS X 10.4最终支持四个平台的BSD系统调用——32位Power PC、64位PowerPC、32位 x86和64位x86_64。作为最终用户,无须搞清这些区别,因为使用Universal Binary技术,买回来的软件直接会解出相应平台程序的二进制文件并执行。这是苹果很成功的一步——不像Windows系统中要用不同的路径(\Windows\System、\Windows\System32、\Windows\System64)分别存放不同架构的二进制库,并且用户还需在32位版和64位版之间犹豫不决。

Mac OS X 10.5 Leopard经过一系列跳票终于在2007年末发布,跳票主要原因是当时苹果投入了大量人力和物力去做iPhone,以至于10.5跳票了整整一年。10.5包含了约300项新功能,而最重要的一项是苹果把对64位的支持带入了Cocoa层面。因此,几乎系统中所有的库都有四个平台的版本。在WWDC上乔布斯亲自向与会者介绍迁移到64位的好处,而能使用更大的内存自然是一项重要优势,程序可以申请更大的内存,把所有数据一并读入内存中操作,而无须分块后来来回回地在内存和磁盘搬运数据。另外,对Intel平台来说,x86架构只有8个寄存器,而x86_64平台有16个寄存器,这也就意味着,对该平台来说,只要重新编译程序,程序就能自由调度比原先翻倍的寄存器数量而无须快取或在内存中来回查找和读写。根据粗略估算,一般涉及大量数值计算的程序会加快一倍。所以他很开心地劝说所有的开发者都迁移到64位架构。

历时整整6年时间,苹果完成了向64位处理器的迁移,同时这也给苹果提供了良好的清理门户的机会——清理过时的技术和API。

(字数限制,接下一楼)

回复 支持 反对

使用道具 举报

QQ|小黑屋|手机版|Archiver|苹果发烧友论坛 ( 京ICP备16012027号-3 )

GMT+8, 2017-9-22 12:37 , Processed in 0.019307 second(s), 8 queries , Xcache On.

Powered by Discuz! X3.3 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表