|
一周前我和 Tinyfool 閑聊蘋果操作系統(tǒng),都認(rèn)為對于開發(fā)人員來說,蘋果操作系統(tǒng)(Mac OS)是上佳的選擇。 Tinyfool 筆頭很快,當(dāng)即就寫了一篇長文章,我則筆頭很慢,今天才全部碼好。他的文章的主要切入點(diǎn)在于 Mac 平臺作為目標(biāo)開發(fā)平臺的優(yōu)勢,而我這篇的切入點(diǎn)主要是 Mac OS 作為一種開發(fā)工具的優(yōu)勢。
開發(fā)人員的趁手工具
對于開發(fā)人員來說,所有的開發(fā)工具的最大的用途,就是最大限度的提高開發(fā)人員的生產(chǎn)率(productivity)和創(chuàng)造力(creativity)。在我們這個時代,使用 GUI (圖形界面)是一個提高生產(chǎn)率的好手段。
雖然上一代的那些 UNIX 開發(fā)人員的確不需要 GUI。一個屏幕,一個鍵盤,一個編輯器,在陋巷,人不堪其憂,也不改其樂的黑客比比皆是,但二十多年過去了,現(xiàn)如今開發(fā)環(huán)境發(fā)生了巨大的變化。
比如說,相比較于當(dāng)年程序員使用的基于文本的環(huán)境,在 GUI 下格式豐富的文檔顯得更直觀,閱讀體驗更加好;就算工作中不需要開發(fā)任何 GUI 程序,現(xiàn)代開發(fā)人員也會使用 GUI 來完成網(wǎng)頁圖片和文檔閱覽等等。因此,即使是最傳統(tǒng)的用命令行的開發(fā)人員,其實(shí)也能沾 GUI 的光。比如說現(xiàn)在最好的終端程序,都是 X 下模擬的,因為這些模擬的終端的出現(xiàn),一些復(fù)雜的可視化功能可以在這些終端中實(shí)現(xiàn)了,比如 Unicode 的顯示(rxvt-unicode)等等。
對于開發(fā)人員,擁有一組非常好用的,能夠最大程度的提高生產(chǎn)率的開發(fā)工具乃是一大人生夢想。那么,這套開發(fā)工具從何而來呢?大體來說,這些工具來自于三個方面:1.通過系統(tǒng)和單一的應(yīng)用軟件提供的;2.通過搭配使用各種應(yīng)用軟件 3.通過定制和改變現(xiàn)有的應(yīng)用軟件。
這三點(diǎn),對于 UNIX 開發(fā)人員是再熟悉不過的了,無非就是寫腳本,走管道而已。所以,在前 GUI 時代,這一套哲學(xué)非常盛行,開發(fā)人員都知道,需要通過安裝腳本解析器,寫一些的腳本,配置一些環(huán)境等等,才能把剛出廠的 UNIX 系統(tǒng),改造成自己使用起來得心應(yīng)手的系統(tǒng)。基本上任何一個使用 UNIX/Linux系統(tǒng)多年的人,機(jī)器里面都有各種各樣的“私藏”的腳本。離開了這些腳本,他的效率會大打折扣。
GUI 時代傳統(tǒng)的喪失
上世紀(jì) 80年代的時候,GUI 時代和個人計算機(jī)普及的時代降臨了。從此,計算機(jī)變成了個人電腦,歷史上第一次,計算機(jī)不是專為開發(fā)人員設(shè)計,而是為了普通用戶設(shè)計。普通用戶的需求就是完成一個一個的現(xiàn)實(shí)問題,軟件產(chǎn)業(yè)提供的解決辦法就是為用戶提供一個一個的應(yīng)用軟件,而不是讓用戶自己一行一行的編程和寫腳本,巨大的軟件需求瞬間成就了一個巨大的軟件產(chǎn)業(yè)。這樣的一個間接后果就是,對于普通用戶來說,讓一臺計算機(jī)變成能夠幫助自己完成任務(wù)的“個人計算機(jī)”的唯一手段,就是疊床架屋的不斷的裝各種應(yīng)用軟件。
我們可以用一個簡單的例子說明這種使用模式。我們都知道,安裝 Windows 系統(tǒng)的一個經(jīng)驗原則是把操作系統(tǒng)和應(yīng)用程序分成兩個邏輯盤,一個在 C 盤,一個在 D 盤。這個磁盤分區(qū)的經(jīng)驗原則不光網(wǎng)吧老板知道,連我大學(xué)里面只會點(diǎn)鼠標(biāo)的那些女同學(xué)都知道。為什么有這個奇妙現(xiàn)象呢?其實(shí),這是由 Windows 系統(tǒng)的用戶的典型使用模式?jīng)Q定的。
在 Windows 系統(tǒng)上,應(yīng)用程序和文檔是關(guān)鍵,操作系統(tǒng)只是一個隨時可以重裝的東西而已,所以干脆兩者分開,互不影響。在這樣的使用模式引導(dǎo)下,Windows 系統(tǒng)上格盤重裝是非常低成本的,只要文檔不丟,應(yīng)用程序不丟就行。這種使用習(xí)慣,浪費(fèi)了多少 geek 男美好的時光為人重裝系統(tǒng),又促成了多少美妙的姻緣 :)。
總之,在 GUI 時代,要解決一個問題,就裝一個應(yīng)用程序。至于應(yīng)用程序之間的通信,和用非鍵盤鼠標(biāo)的方法控制應(yīng)用程序等等,都不再是要考慮的問題,有這樣的需求的人成了非主流,非主流到以致于主流的操作系統(tǒng)和應(yīng)用軟件都不讓你這么干了。操作系統(tǒng)把所有其他的路都封死,就是明擺著告訴你,要想某樣功能,請出門買軟件。
Smalltalk 的啟示
其實(shí) GUI 時代原本不應(yīng)該是這樣的。我們都知道,GUI 原本是施樂的 Alan Kay那一幫人做科研做出來的,Bill Gates 和 Steve Jobs 各自到施樂”抄襲”了一部分過來,于是窗口啊按鈕啊就到處都是了。他們都看到了圖形界面和面向?qū)ο蟮男危吹搅藞D形界面就是把按鈕圖標(biāo)等等對象放好,然后鼠標(biāo)點(diǎn)擊拖動等等這些表面的東西。
因為所有的 GUI 界面都是從文字界面起步的,所以所有的 GUI 程序,其實(shí)就是原來的可執(zhí)行程序的包裝。 C++這個語言的出現(xiàn)也很討巧,把 C 包裝成了一個面向?qū)ο蟮恼Z言,包裝對包裝, C++很討巧的適應(yīng)了把可執(zhí)行程序 GUI 化的趨勢,成了 GUI 時代的主流開發(fā)語言。
從表面上看,只要運(yùn)行這些可執(zhí)行的程序,就能夠看到圖形界面,就能夠用鼠標(biāo)點(diǎn)擊操作他們,可是這些東西的底層,都是一個編譯過了的可執(zhí)行程序,原先 Smalltalk 中的那些運(yùn)行時環(huán)境啊,對象容器啊,都統(tǒng)統(tǒng)不見了,所有的圖形界面程序,還是直接運(yùn)行在計算機(jī)的 CPU 上,而不是一個虛擬的面向?qū)ο蟮娜萜魃稀?/p>
而這個面向?qū)ο蟮娜萜鳎ㄒ步凶?ldquo;運(yùn)行時”或者“運(yùn)行環(huán)境”),才是 Smalltalk 的神。簡單的說,Smalltalk 本身具有一個面向?qū)ο蟮倪\(yùn)行時,所以即使到了執(zhí)行的時候,里面所有的對象還是可以互聯(lián)互通的。
而 C++寫出來的程序,除了編譯之前是面向?qū)ο笸猓灰痪幾g,就全部變成機(jī)器碼,和對象就再也沒有任何關(guān)系了,也就不存在運(yùn)行時去動態(tài)的查看(inspect)和改變(modify)這些程序?qū)ο蟮恼f法。
總之,因為歷史的局限,這些 GUI 的平臺,都是漸進(jìn)的照貓畫虎的演變的,所以沒有一個平臺像 Smalltalk 那樣細(xì)致地考量過對象的互相通信的問題,再加上我們上面說了,反正擴(kuò)展系統(tǒng)的方法就是引入新的應(yīng)用軟件而已,本身也沒有互聯(lián)互通的需求,所以這種拋棄運(yùn)行時的,不讓對象被外部程序控制的實(shí)現(xiàn)方法也無所謂不好。
可是開發(fā)人員不是普通用戶啊,他們依然要改造計算機(jī)成為自己的工具的。在現(xiàn)有的現(xiàn)有工具不能解決問題的時候,要不然自己重新發(fā)明輪子,要不然就復(fù)用現(xiàn)有的一些工具,或者重新按自己的需求重新配置這些工具。所以,和一般用戶不一樣,開發(fā)人員需要這些 GUI 的可配置性,也需要這些 GUI 程序之間的互聯(lián)互通。用黑話來說,第一個問題關(guān)系到 GUI 應(yīng)用程序的腳本化,第二個問題關(guān)系到 GUI 程序之間的進(jìn)程間通信。這兩個問題,說起來簡單,但都牽扯到 GUI 系統(tǒng)的根本設(shè)計問題。歷史在這里開了一個不大不小的玩笑,把這個唯一的機(jī)會給了 Mac OS X。其他操作系統(tǒng),都因為這樣那樣的原因,在這兩個問題上沒有很好的解決方案。
進(jìn)程間通信,蘋果的方案
花開兩朵,各表一只。我們先說 GUI 程序的進(jìn)程間通訊的問題。所謂的進(jìn)程間通信(IPC),就是兩個程序之間的信息共享。我們都知道,*nix的一個強(qiáng)大之處就在于管道,管道是最簡單,最廉價也是最常用的*nix進(jìn)程間通信的方法。
在 GUI 時代,最常用的 IPC 機(jī)制成了剪切板和鼠標(biāo)拖放操作。這兩個操作雖然都很直觀,但都要人操作,離開了人,程序根本無法自動完成進(jìn)程間通信。而要工作效率的提高,就是要讓計算機(jī)離開了人的干涉,也能完成這些任務(wù)。為了自動化這些任務(wù),操作系統(tǒng)就不能簡單的繪制窗口然后萬事大吉了,它必須要知道哪些程序在運(yùn)行,哪個運(yùn)行的程序可以給哪個程序發(fā)消息通信等等,比如說,如果我們想自動的在閱讀器里面選擇一個詞送給字典程序查釋義,計算機(jī)就需要知道字典程序在運(yùn)行的時候可以接受一個字符串,但是不可以接受圖片。
如果我們把字典程序抽象成一個可以提供“查字典”服務(wù)的對象的話,毫無疑問,如果想要向字典程序發(fā)送字符,必須首先知道字典程序能夠接受什么,用什么方式把這個單詞發(fā)送給字典等等。所有的這些信息,都必須由操作系統(tǒng)托管才行(不可能每個應(yīng)用程序里面都要記著字典這個程序能接受字符串不能接受圖片,這樣每個應(yīng)用程序都要記下所有其他可能的應(yīng)用程序的信息,這是一個平方級別的關(guān)系,需要開發(fā)人員開發(fā)一個程序的時候還要兼顧其他所有程序,這顯然是不現(xiàn)實(shí)的)。
用行話來說,必須要有一個統(tǒng)一管理的運(yùn)行環(huán)境,來管理這些程序之間的互相通信問題。我們上面說了,Smalltalk 的神在于一個統(tǒng)一的面向?qū)ο蟮倪\(yùn)行時,使得所有的應(yīng)用程序能互聯(lián)互通。可是所有平臺上的 GUI 程序的演化進(jìn)程都沒有走這條路,而是只把外表給模仿走了;有的平臺即使想做互聯(lián)互通,也做得不徹底(比如微軟的 OLE,COM 等等)。
是好東西,總會發(fā)光的。但是要想讓這個好東西被新的操作系統(tǒng)全盤采納,要想讓一個系統(tǒng)能夠從底層到上層全部采用統(tǒng)一的運(yùn)行環(huán)境,就要扔掉很多的歷史包袱。甩掉這種歷史包袱,對于任何操作系統(tǒng)都是不容易的。如果我們回到當(dāng)年,一定會幻想,要是有個神人,能夠不管市場也不管現(xiàn)有平臺,從頭打造一個沒有任何歷史包袱的干凈整潔的 GUI 系統(tǒng)該多好。歷史就是這么戲劇,還真就安排了一個人,做成了這件事情,這個人,就是那個斯蒂夫喬布斯。
1985 年,喬布斯被蘋果掃地出門,成立了 Next 公司,一心想要做出質(zhì)量上乘的 GUI 計算機(jī)系統(tǒng)。歷史給了喬布斯一個全部從頭做的機(jī)會。這一次,喬老師和 Next 的開發(fā)人員意識到,光照搬 Smalltalk 的形是不行的,要連它的神也拿過來,重頭設(shè)計進(jìn)程間通信和 GUI 系統(tǒng)。在內(nèi)核層面,他們用了 Mach 這個為 BSD 設(shè)計的微內(nèi)核。這個操作系統(tǒng)內(nèi)核就是為了替換已經(jīng)過時的 UNIX 內(nèi)核而設(shè)計的,其中的一個核心設(shè)計哲學(xué)就是重新設(shè)計進(jìn)程間通信;
雖然現(xiàn)在基于微內(nèi)核的操作系統(tǒng)已經(jīng)不是什么潮流(為此 Linus 和 Tanenbaum 吵了一場著名的架),但在相比較于當(dāng)時 UNIX 系統(tǒng)的內(nèi)核(此時 Linux還沒出現(xiàn)的,UNIX 內(nèi)核只有 BSD, Bell, SUN 等幾套),Mach 算是一個高的起點(diǎn)。
在這個內(nèi)核上,Next 公司的工程師開始構(gòu)建面向?qū)ο蟮幕A(chǔ)系統(tǒng)。這套系統(tǒng)在 Smalltalk 中已經(jīng)有了藍(lán)圖,因此這些工程師以 Smalltalk 為藍(lán)圖,先設(shè)計了一套基于 C 的語言,也就是 Objective C,照搬了 Smalltalk 的經(jīng)典的 [對象消息: 參數(shù)] 語法。
(我個人不喜歡 Objective C 這個語言,Smalltalk 是一種純面向?qū)ο蟮膭討B(tài)類型的語言,Next 公司當(dāng)年完全有機(jī)會用 Smalltalk 語言的,如果用了 Smalltalk,現(xiàn)在的 Cocoa 框架還會更加漂亮,代碼更加干凈;用 Objective C 這個自創(chuàng)的語言,不知道是不是因為專利的考慮,反正 Objective C 這20年的所有創(chuàng)新,就是在慢慢的更像 Smalltalk 而已,Java 和 Ruby這幾年也是不斷的從 Smalltalk 拿東西)。
有了內(nèi)核,有了語言,Next 構(gòu)建了一個純的面向?qū)ο蟮倪\(yùn)行環(huán)境和類庫(和 Java 和.NET 的統(tǒng)一類庫想法類似,只不過超前了十幾年),這套類庫,在當(dāng)時叫做 NextStep,所以所有的類名前面都帶有 NS 前綴,無比丑陋。可惜的是,當(dāng)年這個超越時代的類庫太陽春白雪了,話說 Smalltalk 超越了時代 20年,所以90 年代中期的時候,程序員才想起來當(dāng)年 Smalltalk 的好,出現(xiàn)了 Java Ruby等等受 Smalltalk 啟發(fā)的語言。
喬老師雖然落后了 Smalltalk 5 年,卻領(lǐng)先也業(yè)界 5-10 年,所以在 1995 年的時候, Windows 95 賣瘋了,喬老師的 NextStep 卻沒動靜,只能把這個類庫重新打包當(dāng)成 Web 類庫賣賣,即 WebObjects。這倒是無心插柳,生意不錯,因為當(dāng)時的 Web 開發(fā)已經(jīng)吃盡了沒有一個統(tǒng)一的運(yùn)行環(huán)境的苦頭(這也是日后 Java 風(fēng)行的原因)。
我們說,是金子總要發(fā)光的,但是前提是要(1) Next 再等幾年,等業(yè)界回過神來認(rèn)識到它的好處,(2)獲得一個主流的操作系統(tǒng)支持,把底層全換成喬老師的東西。喬老師也知道這兩個條件,所以加快了和 SUN 合作的步伐,想要把這套系統(tǒng)放到 SUN 的工作站上。
但是 SUN 本身有很強(qiáng)的底層技術(shù),那段時間又狂推 Java,所以其實(shí)喬老師在 SUN 這條路上勝算不大,況且 SUN 自己內(nèi)核技術(shù)很強(qiáng),所以肯定要肢解 NextStep 把內(nèi)核重寫,如果不和 SUN 玩,一來Next 這家公司能夠多撐 5 年都是問題,二來幾乎每家做個人計算機(jī)的公司都倒戈微軟了,其他做工作站的公司又都有自己很強(qiáng)的底層技術(shù),不可能用喬老師的玩意兒的,所以看起來喬老師和他的陽春白雪好像前景不妙。可是天無絕人之路,放眼看當(dāng)年的市場,只有一家公司沒有倒戈微軟,又沒有很強(qiáng)的底層技術(shù),又和喬老師有一些淵源,歷史就是這么戲劇,這家公司就是把喬老師掃地出門的蘋果。
90年代中期蘋果的日子很不好過,個人電腦市場敗給了 Wintel 聯(lián)盟,新興的市場上成績也一塌糊涂,投資人也不糊涂,把當(dāng)年讓喬老師掃地出門的 Sculley也掃地出門了,隨后就把喬老師的公司給買了回來,讓喬老師復(fù)職負(fù)責(zé)復(fù)興蘋果。
所以,上面我們說的兩個條件就這樣突然的滿足了:第一,他現(xiàn)在是老大了,所以可以徹底的把原來蘋果的系統(tǒng)推倒重來,用自己的新家伙;第二,原來 Next 公司的那幫工程師不要擔(dān)心失業(yè)了,現(xiàn)在由蘋果負(fù)責(zé)發(fā)工資了,所以,正好可以讓這些人著手改造蘋果系統(tǒng),主要的工作就是用自己帶過來的新系統(tǒng)取代蘋果的舊系統(tǒng),并且讓新系統(tǒng)的圖形界面和舊系統(tǒng)保持風(fēng)格的一致。這個工作,從1995年 Next 被收購,到 2001 左右的時候才做好,這6年的時間里,喬老師也順帶讓蘋果重新盈利了。
2001 年發(fā)布的 Mac OS X,是蘋果操作系統(tǒng)的第十代,完全基于了喬老師在 Next 開發(fā)出來的那套類庫,所以自然的,具有了一個統(tǒng)一的面向?qū)ο蟮倪\(yùn)行時。這個運(yùn)行時和類庫系統(tǒng),Mac OS X 把它叫做 Cocoa。其實(shí) Mac OS X 剛出來的時候也不怎么好,不過依賴于這套設(shè)計精良的底層系統(tǒng),Mac OS X 的迭代開發(fā)周期要比其他操作系統(tǒng)短多了(僅慢于Linux,不過 Linux只有內(nèi)核部分).
在短短的 8 年里,Mac OS X 就搞出了 7 次大的版本發(fā)布。雖然我們看 Mac OS 好像從 10.0 到 10.6 只是次版本號在進(jìn)步,其實(shí)每次都是一個 major release,大致相當(dāng)于從 Window 95 到 Windows 98 或者 Windows 2000 到 Windows XP 這樣級別的升級。這樣的發(fā)布卻不改主版本號,一方面是從市場上考慮,另一方面也的確說明 OS X 的底層已經(jīng)處于一個相對穩(wěn)定的狀態(tài)。
有很多 Windows 程序員非常推崇.NET。是的,.NET 的確是一個非常好的框架,可是想像一下,蘋果在1995年的時候就有了一個統(tǒng)一的運(yùn)行時,加上這么多年所有的程序都在這個統(tǒng)一的框架上開發(fā),如果論在 Mac OS X 這個平臺上的經(jīng)驗積累,應(yīng)該說 Cocoa 社區(qū)是比.NET 社區(qū)更加成熟的。
應(yīng)用程序腳本化
光有進(jìn)程間通信的系統(tǒng)還不能算是一個完全成熟的 GUI 系統(tǒng),因為進(jìn)程間通信依然是相對底層,而 GUI 上的應(yīng)用軟件是層出不窮的,不可能任何問題都跑到底層用進(jìn)程間通信解決;所以,要想讓 GUI 系統(tǒng)進(jìn)化到易用和易于定制的水平,就需要開放對 GUI 程序的腳本控制。
只有 GUI 程序能被外部控制了,才能真正的達(dá)到搭配使用 GUI 系統(tǒng)的效果。其實(shí),一旦有了一個統(tǒng)一的運(yùn)行時,只要開發(fā)應(yīng)用軟件的時候統(tǒng)一設(shè)計一下腳本接口,用腳本控制 GUI 程序應(yīng)該不難。
比如說,微軟的 Office 系列套件,就完全可以用 VBScript 去控制。可惜的是,沒有一個系統(tǒng)能夠?qū)崿F(xiàn)全系統(tǒng)的控制。要實(shí)現(xiàn)全系統(tǒng)的控制,不僅僅要這個系統(tǒng)能夠提供底層的支持,更重要的是要能說服所有的開發(fā)人員,或者說讓所有的開發(fā)人員養(yǎng)成開放腳本接口的好習(xí)慣。
從技術(shù)上來說,這不是太大的問題,只要開發(fā)人員按照統(tǒng)一的腳本通信協(xié)議,實(shí)現(xiàn)特定的接口就行了,可是,如果一個平臺上開發(fā) GUI 的方法太多,開發(fā)人員只選自己喜歡的來,這種標(biāo)準(zhǔn)就不可能統(tǒng)一。比如說 Linux上 KDE 和 Gnome 都有自己的腳本化系統(tǒng),可是開發(fā)人員有的用 KDE,有的用 Gnome,有的干脆兩者都不用,這就談不成有一致的接口。
一個平臺要想有一致的腳本控制接口,除非(1).這個平臺上就一種 GUI 開發(fā)方法,自古華山路一條,要不不做,做出來的東西就只能是標(biāo)準(zhǔn)的接口;(2).這個平臺上大部分的,主流的應(yīng)用軟件,都實(shí)現(xiàn)了這個腳本接口,這樣因為這些程序的拉動,其他 GUI 程序想要融入這個平臺上現(xiàn)有的應(yīng)用軟件的圈子相互通信,那也就必須要實(shí)現(xiàn)這個接口。在 2000 年的時候,又只有一家公司能夠同時滿足這兩個要求,就是蘋果。微軟部分做到地了這兩條,基本上用 VBA 統(tǒng)一了 Office 的控制,但是跳出 Office,微軟的 OLE 對象模型幾乎沒有任何用武之地,與之捆綁密切的 VBA 自然無人問津。不過據(jù)一些在金融行業(yè)工作的朋友說, VBA 能夠大大提高 M$ Office 的生產(chǎn)率。
GUI 腳本化不是一夜之功,特別是我們說要做出統(tǒng)一的腳本接口,能兼顧各種程序的需求,這就完全不是一兩年的時間能夠搞定的,總需要很多年的技術(shù)積累和設(shè)計取舍后才能收斂到一個相對穩(wěn)定成熟的系統(tǒng),而蘋果,居然很神奇在十幾年前就有這方面的經(jīng)驗,蘋果再次怎么這么幸運(yùn)呢?
在 80 年代后期的時候,蘋果機(jī)上有一個非常超越時代的軟件,叫做 Hypercard。這個軟件我曾經(jīng)在上一代蘋果上玩過,具體的思想就是你可以存儲一張一張的“卡片”,這些卡片上面可以放置多媒體的聲音,圖像文字和其他對象,基本上就和現(xiàn)在網(wǎng)頁一回事,唯一的區(qū)別就是這些卡片都存在本機(jī)。
在沒有 Powerpoint 這類軟件之前,這個 Hypercard 的軟件可以用來做課件,做幻燈片演示等等,是個極其強(qiáng)大的工具。為了讓用戶可以定制這個卡片,這個程序提供了一套非常強(qiáng)大的編程系統(tǒng),叫做 Hypertalk。
因為這種編程語言是給普通人而不是程序員用的,所以你會感覺根本不是編程,而是寫英語。這套東西,雖然本質(zhì)上也是從 Smalltalk 學(xué)來的,但是用英語語法的方法編程的確是一個全新的思路,蘋果把這個給普通人編程的語言發(fā)揚(yáng)光大了,用更加貼近自然語言的方法重寫了語言和文檔,模仿 Hypertalk 系統(tǒng),發(fā)布了一個跨系統(tǒng)的腳本控制語言,叫做 Applescript。這個語言就和自然語言沒什么區(qū)別,比方說,獲取窗口的大小不再是 window.getSize()
而是get size of window
顯示第 22 段的第一個單詞不再是 print(paragraph[22].getWordByIndex[0])
而是 print the first word of paragraph 22
更狠的是,你還能用法語和日語寫。
80年代后期的時候和整個 90年代初期,蘋果基本上已經(jīng)被 PC 機(jī)逼到墻角了,只剩下出版行業(yè),設(shè)計行業(yè)等等專業(yè)的行業(yè)因為應(yīng)用軟件和圖形處理能力的關(guān)系,依舊在守著蘋果機(jī)。兩個行業(yè)的用戶都需要自動化的 GUI 控制,但是編程都不怎么樣,于是,這些應(yīng)用軟件的開發(fā)商也主動摻合加入 Applescript 旗下。
在90年代喬老師沒有加入前,蘋果自己把 Finder 全部腳本化,出版業(yè)的 QuarkXPress 和 Filemaker 也都完全腳本化,等喬老師入主蘋果后,基于 Cocoa 的新技術(shù),蘋果一口氣在 Mac OS X 上推出了 Safari, iTunes, iPhotos 等等軟件,一股腦兒的全部腳本化了。
在別的公司都可望而不可求的歷史機(jī)遇,又是被蘋果給抓住了,一股腦兒全部塞進(jìn)了 Mac OS X。這下,所有的第三方開發(fā)的工具,如 Firefox, Adium 這些,其實(shí)本來都不是蘋果開發(fā)的,也沒有太強(qiáng)的蘋果淵源,但是 Firefox要讀 Safari 書簽吧,哈,那就用 Applescript 吧,所以, Firefox也逼著腳本化了(這個在其他平臺上都不存在的事情)。 Adium 也是,這個聊天軟件想要把 iTunes 正在播放的歌曲當(dāng)成狀態(tài)信息,好呀, Applescript,所以,也被帶著腳本化了,而在 Linux上的對應(yīng)產(chǎn)品 pidgin 就沒有這么腳本化。所以,蘋果平臺已經(jīng)成了一個慣性,你不想腳本化,就不帶你玩,看你還腳本化不?
結(jié)語
我們都知道, UNIX 時代的主要哲學(xué)是提供給開發(fā)人員一組小巧精美且可以任意搭配使用的小工具,也就是所謂的 Software Tools,然后任由開發(fā)人員由此出發(fā),自己搭建自己的工具,打造自己的瑞士軍刀。
而開發(fā)人員所用的操作系統(tǒng)的目的,要不就是提供這樣的一組開發(fā)工具,要不就是為這樣的開發(fā)工具提供一個便利的平臺,使得這樣的工具變?yōu)榭赡堋H绻f UNIX 是命令行時代的一個易于改造成“自己的操作系統(tǒng)”的操作系統(tǒng)的話, Mac OS X 就是 GUI 時代的這樣的一個操作系統(tǒng)。即使是從應(yīng)用軟件的層面看, Mac OS X 的底子好,更加容易出精品軟件,所以即使僅使用應(yīng)用軟件,開發(fā)人員也應(yīng)當(dāng)優(yōu)先考慮 Mac OS X。
附A: 相對正確的 Mac OS X 使用習(xí)慣
- 一定要裝 Quicksilver 或者用“服務(wù)”,否則就是把蘋果當(dāng) Windows 用。
- 在蘋果計算機(jī)上,因為有服務(wù)和 Quicksilver 這樣的工具,90%的程序間的拷貝粘帖都是可以避免的。
- 剩下的 10%的程序內(nèi)的拷貝粘帖,如果用一個好的編輯器的話,又可以省略掉 90%。
附B:為什么 Linux系統(tǒng)在這個方面還不夠好
第一, Linux上的 GUI 子系統(tǒng),其實(shí)不是 Linux的一部分,而是 X 和上面的 KDE 以及 Gnome 等等。這幾年,這些系統(tǒng)終于開始統(tǒng)一管理一個面向?qū)ο蟮倪\(yùn)行環(huán)境了。
可是這兩個系統(tǒng)都是用C++所寫,所以免不了費(fèi)很大的力氣才有了運(yùn)行時信息,繞了一個大彎路,如果一開始這兩個系統(tǒng)就用 Smalltalk 之類的有運(yùn)行時的語言編寫,至少現(xiàn)在應(yīng)該有能和 Cocoa 抗衡的框架。
第二,這幾年 X 也認(rèn)識到了在腳本化控制上面的不足,所以幾年前做桌面的 Redhat 提出了 DBus 標(biāo)準(zhǔn)。可惜的是不是每個程序都開放了 Dbus 接口,所以和蘋果比起來,還有比較長的路要走。
it知識庫:開發(fā)人員為何應(yīng)該使用 Mac OS X 兼 OS X 小史,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。