中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

大連網(wǎng)站建設(shè)特色全網(wǎng)營(yíng)銷推廣方式

大連網(wǎng)站建設(shè)特色,全網(wǎng)營(yíng)銷推廣方式,建立公司網(wǎng)站,不懂外貿(mào)做外貿(mào)網(wǎng)站好做嗎注:本文為 “左耳聽(tīng)風(fēng)”陳皓的 unix 相關(guān)文章合輯。 皓俠已走遠(yuǎn),文章有點(diǎn)“年頭”,但值得一閱。 文中部分超鏈已沉寂。 Unix 傳奇 (上篇) 2010 年 04 月 09 日 陳皓 了解過(guò)去,我們才能知其然,更知所以然??偨Y(jié)過(guò)去…

注:本文為 “左耳聽(tīng)風(fēng)”陳皓的 unix 相關(guān)文章合輯。

皓俠已走遠(yuǎn),文章有點(diǎn)“年頭”,但值得一閱。

文中部分超鏈已沉寂。


Unix 傳奇 (上篇)

2010 年 04 月 09 日 陳皓

了解過(guò)去,我們才能知其然,更知所以然??偨Y(jié)過(guò)去,我們才會(huì)知道我們明天該如何去規(guī)劃,該如何去走。在時(shí)間的滾輪中,許許多的東西就像流星一樣一閃而逝,而有些東西卻能經(jīng)受著時(shí)間的考驗(yàn)散發(fā)著經(jīng)久的魅力,讓人津津樂(lè)道,流傳至今。要知道明天怎么去選擇,怎么去做,不是盲目地跟從今天各種各樣琳瑯滿目前沿技術(shù),而應(yīng)該是去 —— 認(rèn)認(rèn)真真地了解和回顧歷史。

Unix 是目前還在存活的操作系統(tǒng)的元老了,走過(guò)了 40 年的歷程。在技術(shù)更新如此迅速的計(jì)算機(jī)世界的今天,Unix 始終保持它那神圣的光環(huán),它那曲折和令人嘆息的歷史,以及由它引發(fā)的思想變革,對(duì)當(dāng)今計(jì)算機(jī)文化造成的深遠(yuǎn)影響,這 40 年所產(chǎn)生的人和事,讓它成為了一個(gè)傳奇,不能不讓人為之驚嘆。

這是一段所有從事計(jì)算機(jī)行業(yè)人員尤其是軟件開(kāi)發(fā)人員需要了解的歷史。Unix 的傳奇歷史是整個(gè)計(jì)算機(jī)世界文化最具代表性的,它對(duì)整個(gè)計(jì)算機(jī)世界文化的影響也是最巨大,最深遠(yuǎn)的。他給人帶來(lái)的不單單的對(duì)過(guò)去的回味,更為我們帶來(lái)了計(jì)算機(jī)世界的新思潮。

了解這段的歷史的人,才能體會(huì)計(jì)算機(jī)世界變遷過(guò)程中的是是非非,才能了解計(jì)算機(jī)世界中的文化,從而才能參與到整個(gè)計(jì)算機(jī)革命的大潮中。希望這段歷史,這篇文章能讓你感受到計(jì)算機(jī)世界那強(qiáng)力的脈搏,從而讓你踏上這條令人充滿激情的道路。

上篇 目錄

  • Unix 起源
  • Unix 分裂
  • Unix 的法律糾紛
  • GNU 開(kāi)源組織
  • Linux 橫空出世
  • Linux 今天的領(lǐng)袖

Unix 起源

回顧 Unix 歷史,我們就要說(shuō)一下一個(gè)叫 MULTICS(Multiplexed Information and Computing Service)的項(xiàng)目。上世紀(jì)六十年代時(shí),大部份計(jì)算機(jī)都是采用批處理(Batch Processing)的方式(也就是說(shuō),當(dāng)作業(yè)積累一定數(shù)量的時(shí)候,計(jì)算機(jī)才會(huì)進(jìn)行處理)。那時(shí),我們熟知的美國(guó)電話及電報(bào)公司(American Telephone and Telegraph Inc.;AT&T)、通用電器公司(General Electrics;G.E.)及麻省理工學(xué)院(Massachusetts Institute of Technology;MIT)計(jì)劃合作開(kāi)發(fā)一個(gè)多用途(General-Purpose)、分時(shí)(Time-Sharing)及多用戶(Multi-User)的操作系統(tǒng),也就是這個(gè) MULTICS,其被設(shè)計(jì)運(yùn)行在 GE-645 大型主機(jī)上。不過(guò),這個(gè)項(xiàng)目由于太過(guò)復(fù)雜,整個(gè)目標(biāo)過(guò)于龐大,糅合了太多的特性,進(jìn)展太慢,幾年下來(lái)都沒(méi)有任何成果,而且性能都很低。于是到了 1969 年 2 月,貝爾實(shí)驗(yàn)室(Bell Labs)決定退出這個(gè)項(xiàng)目。

熟悉這段歷史的人都知道,貝爾實(shí)驗(yàn)室中的有個(gè)叫 Ken Thompson 的人,他為 MULTICS 這個(gè)操作系統(tǒng)寫(xiě)游戲了個(gè)叫 “Space Travel” 的游戲,在 MULTICS 上經(jīng)過(guò)實(shí)際運(yùn)行后,他發(fā)現(xiàn)游戲速度很慢而且耗費(fèi)昂貴 —— 每次運(yùn)行會(huì)花費(fèi) 75 美元。退出這個(gè)項(xiàng)目以后。他為了讓這個(gè)游戲能玩,所以他找來(lái) Dennis Ritchie 為這個(gè)游戲開(kāi)發(fā)一個(gè)極其簡(jiǎn)單的操作系統(tǒng)。這就是后來(lái)的 Unix。(值得一提的是,當(dāng)時(shí)他們本想在 DEC-10 上寫(xiě),后來(lái)沒(méi)有申請(qǐng)到,只好在實(shí)驗(yàn)室的墻角邊找了一臺(tái)被人遺棄的 Digital PDP-7 的迷你計(jì)算機(jī)進(jìn)行他們的計(jì)劃,這臺(tái)計(jì)算機(jī)上連個(gè)操作系統(tǒng)都沒(méi)有,于是他們用匯編語(yǔ)言僅一個(gè)月的時(shí)間就開(kāi)發(fā)了一個(gè)操作系統(tǒng)的原型)他們的同事 Brian Kernighan 非常不喜歡這個(gè)系統(tǒng),嘲笑 Ken Thompson 說(shuō):“你寫(xiě)的系統(tǒng)好真差勁,干脆叫 Unics 算了?!盪nics 的名字就是相對(duì)于 MULTICS 的一種戲稱,后業(yè)改成了 Unix。于是,Unix 就在這樣被游戲和玩笑創(chuàng)造了,當(dāng)時(shí)是 1969 年 8 月。也就是這一年,Linux 之父 Linus Torvalds 在芬蘭出生了。

1971 年,Ken Thompson 寫(xiě)了充分長(zhǎng)篇的申請(qǐng)報(bào)告,申請(qǐng)到了一臺(tái) PDP-11/24 的機(jī)器。于是 Unix 第一版出來(lái)了。在一臺(tái) PDP-11/24 的機(jī)器上完成。這臺(tái)電腦只有 24KB 的物理內(nèi)存和 500K 磁盤(pán)空間。Unix 占用了 12KB 的內(nèi)存,剩下的一半內(nèi)存可以支持兩用戶進(jìn)行 Space Travel 的游戲。而著名的 fork () 系統(tǒng)調(diào)用也就是在這時(shí)出現(xiàn)的。

到了 1973 年的時(shí)候,Ken Thompson 與 Dennis Ritchie 感到用匯編語(yǔ)言做移植太過(guò)于頭痛,他們想用高級(jí)語(yǔ)言來(lái)完成第三版,對(duì)于當(dāng)時(shí)完全以匯編語(yǔ)言來(lái)開(kāi)發(fā)程序的年代,他們的想法算是相當(dāng)?shù)寞偪瘛R婚_(kāi)始他們想嘗試用 Fortran,可是失敗了。后來(lái)他們用一個(gè)叫 BCPL(Basic Combined Programming Language)的語(yǔ)言開(kāi)發(fā),他們整合了 BCPL 形成 B 語(yǔ)言,后來(lái) Dennis Ritchie 覺(jué)得 B 語(yǔ)言還是不能滿足要求,就是就改良了 B 語(yǔ)言,這就是今天的大名鼎鼎的 C 語(yǔ)言。于是,Ken Thompson 與 Dennis Ritchie 成功地用 C 語(yǔ)言重寫(xiě)了 Unix 的第三版內(nèi)核。至此,Unix 這個(gè)操作系統(tǒng)修改、移植相當(dāng)便利,為 Unix 日后的普及打下了堅(jiān)實(shí)的基礎(chǔ)。而 Unix 和 C 完美地結(jié)合成為一個(gè)統(tǒng)一體,C 與 Unix 很快成為世界的主導(dǎo)。

Unix 的第一篇文章 “The UNIX Time Sharing System” 由 Ken Thompson 和 Dennis

Ritchie 于 1974 年 7 月的 the Communications of the ACM 發(fā)表。這是 UNIX 與外界的首次接觸。結(jié)果引起了學(xué)術(shù)界的廣泛興趣并對(duì)其源碼索取,所以,Unix 第五版就以 “僅用于教育目的” 的協(xié)議,提供給各大學(xué)作為教學(xué)之用,成為當(dāng)時(shí)操作系統(tǒng)課程中的范例教材。各大學(xué)公司開(kāi)始通過(guò) Unix 源碼對(duì) Unix 進(jìn)行了各種各樣的改進(jìn)和擴(kuò)展。于是,Unix 開(kāi)始廣泛流行。

Unix 分裂

1978 年,對(duì) Unix 而言是革命性的一年;因?yàn)閷W(xué)術(shù)界的老大柏克利大學(xué) (UC Berkeley),推出了一份以第六版為基礎(chǔ),加上一些改進(jìn)和新功能而成的 Unix。這就是著名的 “1 BSD(1st Berkeley Software Distribution)”,開(kāi)創(chuàng)了 Unix 的另一個(gè)分支:BSD 系列。 同時(shí)期,AT&T 成立 USG(Unix Support Group),將 Unix 變成商業(yè)化的產(chǎn)品。從此,BSD 的 Unix 便和 AT&T 的 Unix 分庭抗禮,Unix 就分為 System IV 和 4.x BSD 這兩大主流,各自蓬勃發(fā)展。

1979 年發(fā)布的 Unix 第七版被稱為是 “最后一個(gè)真正的 Unix”,這個(gè)版本的 Unix 內(nèi)核只有 40K bytes。后來(lái)這個(gè)版本被移植到 VAX 機(jī)上(我在大學(xué)時(shí)學(xué)習(xí) C 語(yǔ)言時(shí)用過(guò)這個(gè) VAX 機(jī),我還記得那時(shí)上 VAX 機(jī)最大的愛(ài)好就是使用 talk 命令和別人聊天,呵呵)。20 世紀(jì) 80 年代相繼發(fā)布的 8、9、10 版本只授權(quán)給了少數(shù)大學(xué)。

1982 年,AT&T 基于版本 7 開(kāi)發(fā)了 UNIX System Ⅲ 的第一個(gè)版本,這是一個(gè)商業(yè)版本僅供出售。為了解決混亂的 UNIX 版本情況,AT&T 綜合了其他大學(xué)和公司開(kāi)發(fā)的各種 UNIX,開(kāi)發(fā)了 UNIX System V Release 1。這個(gè)新的 UNIX 商業(yè)發(fā)布版本不再包含源代碼,所以加州大學(xué) Berkeley 分校繼續(xù)開(kāi)發(fā) BSD UNIX,作為 UNIX System III 和 V 的替代選擇。BSD 對(duì) UNIX 最重要的貢獻(xiàn)之一是 TCP/IP。BSD 有 8 個(gè)主要的發(fā)行版中包含了 TCP/IP:4.1c、4.2、4.3、4.3-Tahoe、4.3-Reno、Net2、4.4 以及 4.4-lite。這些發(fā)布版中的 TCP/IP 代碼幾乎是現(xiàn)在所有系統(tǒng)中 TCP/IP 實(shí)現(xiàn)的前輩,包括 AT&T System V UNIX 和 Microsoft Windows 中的 TCP/IP 都參照了 BSD 的源碼。

同時(shí),其他一些公司也開(kāi)始為其自己的小型機(jī)或工作站提供商業(yè)版本的 UNIX 系統(tǒng),有些選擇 System V 作為基礎(chǔ)版本,有些則選擇了 BSD。BSD 的一名主要開(kāi)發(fā)者,Bill Joy,在 BSD 基礎(chǔ)上開(kāi)發(fā)了 SunOS,并最終創(chuàng)辦了 Sun Microsystems。

1991 年,一群 BSD 開(kāi)發(fā)者(Donn Seeley、Mike Karels、Bill Jolitz 和 Trent Hein)離開(kāi)了加州大學(xué),創(chuàng)辦了 Berkeley Software Design, Inc (BSDI)。BSDI 是第一家在便宜常見(jiàn)的 Intel 平臺(tái)上提供全功能商業(yè) BSD UNIX 的廠商。后來(lái) Bill Jolitz 離開(kāi)了 BSDI,開(kāi)始了 386BSD 的工作。386BSD 被認(rèn)為是 FreeBSD、OpenBSD 和 NetBSD、DragonFlyBSD 的先輩。

這是一個(gè) AT&T 妄圖私有化的 Unix 的時(shí)代。為了私有化 Unix,1986 年 IEEE 指定了一個(gè)委員會(huì)制定了一個(gè)一個(gè)開(kāi)放作業(yè)系統(tǒng)的標(biāo)準(zhǔn),稱為 POSIX (Portable Operating Systems Interface)。最后加上個(gè) X,不知道是為了好聽(tīng),還是因?yàn)檫@本質(zhì)上是 UNIX 的標(biāo)準(zhǔn)。當(dāng)然,AT&T 的 Unix 取得了這個(gè)標(biāo)準(zhǔn)制訂戰(zhàn)爭(zhēng)的勝利,還取得了 Unix 這個(gè)注冊(cè)商標(biāo)。此時(shí) BSD 的擁護(hù)者自喻為冷酷無(wú)情的公司帝國(guó)的反抗軍。就銷售量來(lái)說(shuō),AT&T UNIX 始終趕不上 BSD/Sun。到 1990 年,AT&T 與 BSD 版本已難明顯區(qū)分,因?yàn)楸舜硕加胁捎脤?duì)方的新發(fā)明。

這段時(shí)期,從實(shí)驗(yàn)室出來(lái)的被全世界所分享的 Unix,正處于被私有化的關(guān)鍵時(shí)期。(這里有一個(gè)笑話 ——《Alice 夢(mèng)游 UNIX 仙境》見(jiàn)下文)

Unix 的法律糾紛

Berkeley Software Design, Inc(BSDI)很快就與 AT&T 的 UNIX Systems Laboratories(USL)附屬公司產(chǎn)生了法律糾紛,USL 是 AT&T 注冊(cè)的公司。AT&T 為了擁有 System V 版權(quán),以及 Unix 商標(biāo),為了壟斷 Unix,1992 年,USL 正式對(duì) BSDI 提起訴訟,說(shuō) BSD 剽竊他的源碼。而最終了結(jié)了好評(píng)如潮的 BSD 系統(tǒng)。

由于最后判決懸而未決,這樁法律訴訟將 BSD 后裔的開(kāi)發(fā),特別是自由軟件,延遲了兩年,這導(dǎo)致沒(méi)有法律問(wèn)題的 Linux 內(nèi)核獲得了極大的支持。Linux 跟 386BSD 的開(kāi)發(fā)幾乎同時(shí)起步,Linus 說(shuō),當(dāng)時(shí)如果有自由的基于 386 的 Unix-like 操作系統(tǒng),他就可能不會(huì)創(chuàng)造 Linux。盡管無(wú)法預(yù)料這給以后的軟件業(yè)究竟造成了什么樣的影響(如果沒(méi)有這個(gè)法律糾紛,很有可能沒(méi)有今天的革命性的 Linux),但有一點(diǎn)可以肯定,Linux 更加豐富了這塊土壤。

這場(chǎng)官司一直打到 AT&T 將自己的 Unix 系統(tǒng)實(shí)驗(yàn)室賣掉,新接手的 Novell 公司采取了一種比較開(kāi)明的做法,允許 BSDI 自由發(fā)布自己的 BSD,但是前提是必須將來(lái)自于 AT&T 的代碼完全刪除,于是誕生了 4.4 BSD Lite 版,由于這個(gè)版本不存在法律問(wèn)題,4.4BSD Lite 成為了現(xiàn)代 BSD 系統(tǒng)的基礎(chǔ)版本。

這樁訴訟最終在 1994 年 1 月了結(jié),更多地滿足了 BSDI 的利益。伯克利套件的 18,000 個(gè)文件中,只有 3 個(gè)文件要求刪除,另有 70 個(gè)文件要求修改,并顯示 USL 的版權(quán)說(shuō)明。這項(xiàng)調(diào)解另外要求,USL 不得對(duì) 4.4BSD 提起訴訟,不管是用戶還是 BSDI 代碼的分發(fā)者。于是,BSD Unix 走上了復(fù)興的道路。BSD 的開(kāi)發(fā)也走向了幾個(gè)不同的方向,并最終導(dǎo)致了 FreeBSD、OpenBSD 和 NetBSD 的出現(xiàn)。

從 AT&T 意識(shí)到了 Unix 的商業(yè)價(jià)值,不再將 Unix 源碼授權(quán)給學(xué)術(shù)機(jī)構(gòu)以來(lái),到以后的幾十年,Unix 仍在不斷變化,其版權(quán)所有者不斷變更,授權(quán)者的數(shù)量也在增加。Unix 的版權(quán)曾經(jīng)為 AT&T 所有,之后 Novell 擁有了 Unix,再之后 Novell 又將版權(quán)出售給了 SCO(這一事實(shí)雙方尚存在爭(zhēng)議)。有很多大公司在取得了 Unix 的授權(quán)之后,開(kāi)發(fā)了自己的 Unix 產(chǎn)品。(幾年前,據(jù)傳聞微軟為了限制 Linux,微軟讓 SCO 到法院告 Linux 剽竊其源碼)

由于 Unix 是由 C 語(yǔ)言寫(xiě)的,所以修改和移植都很容易,因此,很多商業(yè)公司及學(xué)術(shù)機(jī)構(gòu)均加入這個(gè)操作系統(tǒng)的研發(fā),各個(gè)不同版本的 Unix 也開(kāi)始蓬勃發(fā)展。這才產(chǎn)生了今天這么多的各式各樣的 Unix 衍生產(chǎn)品。如 AIX、Solaris、HP-UX、IRIX、OSF、Ultrix 等等。(這些商業(yè)化的 Unix 基本上都是源于 AT&T 授權(quán)的 Unix System V)

Unix 開(kāi)源組織

AT&T 的這種商業(yè)態(tài)度,讓當(dāng)時(shí)許許多的 Unix 的愛(ài)好者和軟件開(kāi)發(fā)者們感到相當(dāng)?shù)耐葱暮蛻n慮,他們認(rèn)為商業(yè)化的種種限制并不利于產(chǎn)生的發(fā)展,相反還能導(dǎo)制產(chǎn)品出現(xiàn)諸多的問(wèn)題。隨著商業(yè)化 Unix 的版本的種種限制和諸多問(wèn)題,引起了大眾的不滿和反對(duì)。于是,大家開(kāi)始有組織地結(jié)成 “反叛聯(lián)盟” 以此對(duì)抗欺行罷市的 AT&T 等商業(yè)化行為。

另一方面,關(guān)于 “大教堂”(集權(quán)、封閉、受控、保密)和 “集市”(分權(quán)、公開(kāi)、精細(xì)的同僚復(fù)審)兩種開(kāi)發(fā)模式的對(duì)比成為了新思潮的中心思想。這個(gè)新思潮對(duì) IT 業(yè)產(chǎn)生了非常深遠(yuǎn)影響。為整個(gè)計(jì)算機(jī)世界帶來(lái)了革命性的價(jià)值觀。

此時(shí),一個(gè)名叫 Richard Stallman 的領(lǐng)袖出現(xiàn)了,他認(rèn)為 Unix 是一個(gè)相當(dāng)好的操作系統(tǒng),如果大家都能夠?qū)⒆约核鶎W(xué)貢獻(xiàn)出來(lái),那么這個(gè)系統(tǒng)將會(huì)更加的優(yōu)異!他倡導(dǎo)的 Open Source 的概念,就是針對(duì) Unix 這一事實(shí)反對(duì)實(shí)驗(yàn)室里的產(chǎn)品商業(yè)化私有化。盡管 Stallman 既不是、也從來(lái)沒(méi)有成為一個(gè) Unix 程序員,但在后 1980 的大環(huán)境下,實(shí)現(xiàn)一個(gè)仿 Unix 操作系統(tǒng)成了他追求的明確戰(zhàn)略目標(biāo)。Richard Stallman 早期的捐助者大都是新踏入 Unix 土地的老牌 ARPANET 黑客,他們對(duì)代碼共享的使命感甚至比那些有更多 Unix 背景的人強(qiáng)烈。

為了這個(gè)理想,Richard Stallman 于 1984 年創(chuàng)業(yè)了 GNU,計(jì)劃開(kāi)發(fā)一套與 Unix 相互兼容的的軟件。1985 年 Richard Stallman 又創(chuàng)立了自由軟件基金會(huì)(Free Software Foundation)來(lái)為 GNU 計(jì)劃提供技術(shù)、法律以及財(cái)政支持。盡管 GNU 計(jì)劃大部分時(shí)候是由個(gè)人自愿無(wú)償貢獻(xiàn),但 FSF 有時(shí)還是會(huì)聘請(qǐng)程序員幫助編寫(xiě)。當(dāng) GNU 計(jì)劃開(kāi)始逐漸獲得成功時(shí),一些商業(yè)公司開(kāi)始介入開(kāi)發(fā)和技術(shù)支持。當(dāng)中最著名的就是之后被 Red Hat 兼并的 Cygnus Solutions。

GNU 組織的建立,延續(xù)了當(dāng)年 Unix 剛出現(xiàn)時(shí)的情形,并為這種情形建立了可靠的法律和財(cái)務(wù)保障。GNU 工程十幾年以來(lái),已經(jīng)成為一個(gè)對(duì)軟件開(kāi)發(fā)主要的影響力量, 創(chuàng)造了無(wú)數(shù)的重要的工具。例如:強(qiáng)健的編譯器,有力的文本編輯器,甚至一個(gè)全功能的操作系統(tǒng)。從那時(shí)開(kāi)始,許多程序員聚集起來(lái)開(kāi)始開(kāi)發(fā)一個(gè)自由的、高質(zhì)量、易理解的軟件,讓這使得 Unix 社區(qū)生機(jī)勃勃,一派繁榮景象。

自 90 年代發(fā)起這個(gè)計(jì)劃以來(lái),GNU 開(kāi)始大量的產(chǎn)生或收集各種系統(tǒng)所必備的組件,像是 —— 函數(shù)庫(kù)(libraries)、編譯器(compilers)、調(diào)式工具(debugs)、文本編輯器(text editors)、網(wǎng)站服務(wù)器(web server),以及一個(gè) Unix 的使用者接口(Unix shell)等等,等等。但由于種種原因,GNU 一直沒(méi)有開(kāi)發(fā)操作系統(tǒng)的 kernel。正當(dāng) Richard Stallman 在為操作系統(tǒng)內(nèi)核傷腦筋的時(shí)候,Linux 出現(xiàn)了。

Linux 橫空出世

1990 年,Linus Torvalds 還是芬蘭赫爾辛基大學(xué)的一名學(xué)生,最初是用匯編語(yǔ)言寫(xiě)了一個(gè)在 80386 保護(hù)模式下處理多任務(wù)切換的程序,后來(lái)從 Minix(Andy Tanenbaum 教授所寫(xiě)的很小 的 Unix 操作系統(tǒng),主要用于操作系統(tǒng)教學(xué))得到靈感,進(jìn)一步產(chǎn)生了自認(rèn)為狂妄的想法 —— 寫(xiě)一個(gè)比 Minix 更好的 Minix,于是開(kāi)始寫(xiě)了一些硬件的設(shè)備驅(qū)動(dòng)程序,一個(gè)小的文件系統(tǒng)。這樣 0.0.1 版本的 Linux 就出來(lái)了,但是它只具有操作系統(tǒng)內(nèi)核的勉強(qiáng)的雛形,甚至不能運(yùn)行,你必須在有 Minix 的機(jī)器上編譯以后才能玩。這時(shí)候 Linus 已經(jīng)完全著迷而不想停止,決定踢開(kāi) Minix,于是在 1991 年 10 月 5 號(hào)發(fā)布 Linux 0.0.2 版本,在這個(gè)版本中已經(jīng)可以運(yùn)行 bash 和 gcc。

從一開(kāi)始,Linus 就決定自由擴(kuò)散 Linux,包括原代碼,隨即 Linux 引起黑客們(hacker)的注意,通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)加入了 Linux 的內(nèi)核開(kāi)發(fā)。Linux 傾向于成為一個(gè)黑客的系統(tǒng) —— 直到今天,在 Linux 社區(qū)里內(nèi)核的開(kāi)發(fā)被認(rèn)為是真正的編程。由于一批高水平黑客的加入,使 Linux 發(fā)展迅猛,幾乎一兩個(gè)禮拜就有新版或修正版的出現(xiàn),到 1993 年底 94 年初,Linux 1.0 終于誕生了!Linux 1.0 已經(jīng)是一個(gè)功能完備的操作系統(tǒng),而且內(nèi)核寫(xiě)得緊湊高效,可以充分發(fā)揮硬件的性能,在 4M 內(nèi)存的 80386 機(jī)器上也表現(xiàn)得非常好,至今人們還在津津樂(lè)道。時(shí)至今日,kernel 的版本已經(jīng)出到 2.6。Linux 的發(fā)展不像傳統(tǒng)的軟件工程,它完全是透過(guò)網(wǎng)絡(luò),集合世界各地的高手而成的一套操作系統(tǒng),在這里我們也可以見(jiàn)識(shí)到網(wǎng)絡(luò)快速傳播的威力。Linux 初次讓整個(gè)世界感覺(jué)到了開(kāi)源力量和網(wǎng)絡(luò)力量的如此強(qiáng)大。(Linux 的標(biāo)志和吉祥物是一只名字叫做 Tux 的 企鵝,標(biāo)志的由來(lái)是因?yàn)?Linus 在澳洲時(shí)曾被一只動(dòng)物園里的企鵝咬了一口,便選擇了企鵝作為 Linux 的標(biāo)志。)

Linux 的歷史是和 GNU 緊密聯(lián)系在一起的。從 1983 年開(kāi)始的 GNU 計(jì)劃致力于開(kāi)發(fā)一個(gè)自由并且完整的類 Unix 操作系統(tǒng),包括軟件開(kāi)發(fā)工具和各種應(yīng)用程序。到 1991 年 Linux 內(nèi)核發(fā)布的時(shí)候,GNU 已經(jīng)幾乎完成了除了系統(tǒng)內(nèi)核之外的各種必備軟件的開(kāi)發(fā)。在 Linus Torvalds 和其它開(kāi)發(fā)人員的努力下,GNU 組件可以運(yùn)行于 Linux 內(nèi)核之上。整個(gè)內(nèi)核是基于 GNU 通用公共許可,也就是 GPL(GNU General Public License,GNU 通用公共許可證)的,但是 Linux 內(nèi)核并不是 GNU 計(jì)劃的一部分。1994 年 3 月,Linux1.0 版正式發(fā)布,Marc Ewing 成立了 Red Hat 軟件公司,成為最著名的 Linux 分銷商之一。

嚴(yán)格來(lái)講,Linux 這個(gè)詞本身只表示 Linux 內(nèi)核,但在實(shí)際上人們已經(jīng)習(xí)慣了用 Linux 來(lái)形容整個(gè)基于 Linux 內(nèi)核,并且使用 GNU 工程各種工具和應(yīng)用程序的操作系統(tǒng) (也被稱為 GNU/Linux)。基于這些組件的 Linux 軟件被稱為 Linux 發(fā)行版。一般來(lái)講,一個(gè) Linux 發(fā)行套件包含大量的軟件,比如軟件開(kāi)發(fā)工具,數(shù)據(jù)庫(kù),Web 服務(wù)器(例如 Apache),X Window,桌面環(huán)境(比如 GNOME 和 KDE),辦公套件(比如 OpenOffice.org),等等。

1991 至 1995 年間,Linux 從概念型的 0.1 版本內(nèi)核原型,發(fā)展成為能夠在性能和特性上均堪媲美專有 Unix 的操作系統(tǒng),并且在連續(xù)正常工作時(shí)間等重要統(tǒng)計(jì)數(shù)據(jù)上打敗了這些 Unix 中的絕大部分。1995 年,Linux 找到了自己的殺手級(jí)應(yīng)用 —— 開(kāi)源的 web 服務(wù)器 Apache。就像 Linux,Apache 出眾地穩(wěn)定和高效。很快,運(yùn)行 Apache 的 Linux 機(jī)器成了全球 ISP 平臺(tái)的首選。約 60% 的網(wǎng)站選用 Apache,輕松擊敗了另兩個(gè)主要的專有型競(jìng)爭(zhēng)對(duì)手。今天的 LAMP(Linux , Apache, MySQL, PHP)已經(jīng)成為了架構(gòu) Web 服務(wù)器的主要首選。

現(xiàn)如今的 Linux 不但可以裝在幾乎所有的主流服務(wù)器上,當(dāng)然也包括桌面的 X86 系統(tǒng)中。其還常常被用于嵌入式系統(tǒng),機(jī)頂盒、手機(jī)、交換機(jī)、游戲機(jī)、PDA、網(wǎng)絡(luò)交換機(jī)、路由器、等等,都是因?yàn)?Linux 那精彩的內(nèi)核。

Linux 的出現(xiàn),不僅僅給世界帶來(lái)了一個(gè)免費(fèi)的操作系統(tǒng),也不僅僅是對(duì) Unix 自由、共享的文化的延續(xù),它的出現(xiàn)帶給了計(jì)算機(jī)世界自 Unix、GNU 以來(lái)更為成熟的思想和文化。

Linux 今天的領(lǐng)袖

Linux 和 GNU 關(guān)系是比較微妙的。那時(shí),自由軟件基金會(huì)編寫(xiě)的用戶軟件工具包鋪平了一條擺脫高成本專有軟件開(kāi)發(fā)工具的前進(jìn)道路。意識(shí)服從經(jīng)濟(jì),而不是領(lǐng)導(dǎo):一些新手加入了 RMS 的革命運(yùn)動(dòng),高舉 GPL 大旗,另一些人則更認(rèn)同整體意義上的 Unix 傳統(tǒng),加入了反對(duì) GPL 的陣營(yíng),但其他大部分人置身事外,一心編碼。

Linus Torvalds 巧妙地跨越了 GPL 和反 GPL 的派別之爭(zhēng)。他利用 GNU 工具包搭起了自創(chuàng)的 Linux 內(nèi)核,用 GPL 的傳染性質(zhì)保護(hù)它,但拒絕認(rèn)同 Richard Stallman 的許可協(xié)議反映的思想體系計(jì)劃。Linus Torvalds 明確表示他認(rèn)為自由軟件一般情況下更好,但他偶爾也用專有軟件。即使在他自己的事業(yè)中,他也拒絕成為狂熱分子。這一點(diǎn)極大地吸引了大多數(shù)黑客,他們雖然早就反感 Richard Stallman 的言辭,但他們的懷疑論一直缺個(gè)有影響力或者令人信服的代言人。而 Linus Torvalds 正好充當(dāng)了這一角色。

Linus Torvalds 令人愉快的實(shí)用主義及靈活而低調(diào)的行事風(fēng)格,促使黑客文化在 1993 至 1997 年間取得了一連串令人驚奇的勝利,不僅僅在技術(shù)上的成功,還讓圍繞 Linux 操作系統(tǒng)的發(fā)行、服務(wù)和支持產(chǎn)業(yè)有了堅(jiān)實(shí)的開(kāi)端。結(jié)果,他的名望和影響也一飛沖天。Torvalds 成為了互聯(lián)網(wǎng)時(shí)代的英雄;到 1995 年為止,他只用了四年時(shí)間就在整個(gè)黑客文化界聲名顯赫,而 Richard Stallman 為此花了十五年,而且他還遠(yuǎn)遠(yuǎn)超過(guò)了 Stallman 向外界販賣 “自由軟件” 的記錄。與 Torvalds 相比,Richard Stallman 的言辭漸漸顯得既刺耳又無(wú)力。(參看《Linus Torvalds 語(yǔ)錄 Top 10》)

今天,我們也說(shuō)不清楚是 GNU Linux 還是 Linux GNU。Linux 既不排斥開(kāi)源,也不排斥商業(yè)化,Linus 認(rèn)為好的軟件是需要免費(fèi)和商業(yè)化共同推進(jìn)的。正是這種革命性的想法,造就了今天的 Linux 火紅的局面(參看《誰(shuí)寫(xiě)了 Linux》、《Linux 基金會(huì)的廣告》、《Linux Distribution Timeline》)。Linux 就像一股清泉流入了所有人的心中,引發(fā)了很多的啟迪和思考。


Unix 傳奇 (下篇)

2010 年 04 月 09 日 陳皓

Unix 是目前還在存活的操作系統(tǒng)的元老了,走過(guò)了 40 年的歷程(參看《Unix 40 年:Unix 年鑒》、《Unix 40 年:昨天,今天和明天》)。由它引發(fā)的思想變革,對(duì)當(dāng)今計(jì)算機(jī)文化造成的深遠(yuǎn)影響。這是一段所有從事計(jì)算機(jī)行業(yè)人員尤其是軟件開(kāi)發(fā)人員需要了解的歷史。Unix 的傳奇歷史是整個(gè)計(jì)算機(jī)世界文化最具代表性的,它對(duì)整個(gè)計(jì)算機(jī)世界文化的影響也是最巨大,最深遠(yuǎn)的。他給人帶來(lái)的不單單的對(duì)過(guò)去的回味,更為我們帶來(lái)了計(jì)算機(jī)世界的新思潮。

下篇 目錄

  • Unix 與黑客文化
  • Unix 的歷史教訓(xùn)
  • Unix 家族譜
  • Unix 的特點(diǎn)
  • Unix 的影響和哲學(xué)
  • Unix 痛恨者手冊(cè)

Unix 與黑客文化

黑客的文化和 Unix 的商業(yè)化存在著必然的聯(lián)系。自從 Unix 出現(xiàn),黑客文化就與之而來(lái)。

1993 初,一個(gè)悲觀的觀察家撰文指出,已經(jīng)有理由認(rèn)為 Unix 的傳奇故事連同他帶有黑客文明將一同破產(chǎn)。許多人預(yù)測(cè),從那時(shí)起 Unix 將在六月內(nèi)死亡。他們很清楚,十年的 Unix 商業(yè)化,使自由跨平臺(tái)的 Unix 夢(mèng)以失敗告終。Unix 允諾的跨平臺(tái)可移植性,在一打大公司專有的 Unix 版本之間不停地斗嘴中丟失,一個(gè)完美的操作系統(tǒng)最終淪為多種版本的一團(tuán)亂麻,這應(yīng)該說(shuō)是人類文明史上的一個(gè)重大悲劇。

在專有軟件社會(huì)中,只有像微軟一樣的 “集權(quán)制,大教堂” 生產(chǎn)方式才能成功。那個(gè)時(shí)代的人悲觀地相信,技術(shù)世界的個(gè)人英雄主義時(shí)代已經(jīng)結(jié)束,軟件工業(yè)和發(fā)展中的互聯(lián)網(wǎng)絡(luò)將逐漸地由像微軟一樣的巨型企業(yè)支配,再也沒(méi)有 “佐羅”,世界是愷撒大帝的世界,計(jì)算機(jī)文明將進(jìn)入黑暗的帝國(guó)時(shí)代。黑客已經(jīng)死了,自由不付存在。

自從 Unix 出現(xiàn)以來(lái),第一代的 Unix 黑客似乎垂垂老矣,衣食不飽 ( Berkeley 計(jì)算機(jī)科學(xué)研究組在 1994 丟失了自己基金)。這是一個(gè)抑壓的時(shí)代。專有的商業(yè) Unix 的結(jié)果證明那么沉重、那么盲目、那么不適當(dāng),以致微軟能夠用那次等技術(shù)的 Windows 搶走他們生存的空間,拿走他們的干糧。黑客世界的殘余力量被逼到了世界上的角落里,茍延殘喘。

就在黑客文化日漸衰落之時(shí),美國(guó)新聞周刊的資深記者 Steven Levy 完成了著名的《黑客列傳》一書(shū),書(shū)中著力介紹了一個(gè)人物:Richard M. Stallman 的故事,他是麻省理工學(xué)院(MIT)人工智能實(shí)驗(yàn)室領(lǐng)袖人物,堅(jiān)決反對(duì)實(shí)驗(yàn)室的研究成果商業(yè)化。他是商業(yè)軟件社會(huì)中堅(jiān)強(qiáng)的一員,決不隨波逐流,建立了全新的黑客文化。

Richard M. Stallman(他的登陸名 RMS 更為人熟知)早在 1970 年代晚期就已經(jīng)證明他是當(dāng)時(shí)最有能力的程序員之一。Emacs 編輯器就是他眾多發(fā)明中的一項(xiàng)。RMS 的目標(biāo)是將后 1980 的松散黑客社群變成一臺(tái)有組織的社會(huì)化機(jī)器以達(dá)到一個(gè)單純的革命目標(biāo)。也許他未意識(shí)到,他的言行與當(dāng)年卡爾?馬克思號(hào)召產(chǎn)業(yè)無(wú)產(chǎn)階級(jí)反抗工作的努力如出一轍。RMS 宣言引發(fā)的爭(zhēng)論至今仍存于黑客文化中。他的綱要遠(yuǎn)不止于維護(hù)一個(gè)代碼庫(kù),已經(jīng)暗含了廢除軟件知識(shí)產(chǎn)權(quán)主張的精髓。RMS 通過(guò) “自由軟件(free software)” 讓黑客文化更加有自我意識(shí)。當(dāng)然,這個(gè)充滿魅力又具爭(zhēng)議的人物本身已經(jīng)成為了一個(gè)黑客文化英雄。

只有癡迷的 “黑客” 和具有創(chuàng)造力的怪人結(jié)成的反叛聯(lián)盟才能把我們從愚蠢中拯救出來(lái) —— 他們接著教導(dǎo)我們,真正的專業(yè)和奉獻(xiàn)精神,正是我們?cè)谇谑浪子^念的 “合理商業(yè)做法” 之前的所作所為。**——The Art of Unix Programming

RMS 讓世界上所有的人都知道,入侵電腦系統(tǒng)只是低級(jí)不入流的黑客干的事,真正的黑客,是為了自由,為了軟件的自由,為了挑戰(zhàn)計(jì)算機(jī)世界中的霸權(quán)主義而斗爭(zhēng)。他們不是街頭小混混,他們更像是綠林好漢,更像是羅賓漢,更像是佐羅。就像渴望民主的人民同專制的政府斗爭(zhēng)一樣。RMS 領(lǐng)導(dǎo)著許多的黑客通過(guò)互聯(lián)網(wǎng)向?qū)S熊浖l(fā)出宣戰(zhàn)。

X Windows 是首批由服務(wù)于全球各地不同組織的許多個(gè)人以團(tuán)隊(duì)形式開(kāi)發(fā)的大規(guī)模開(kāi)源項(xiàng)目之一。電子郵件使創(chuàng)意得以在這個(gè)群體中快速傳播,問(wèn)題由此得以快速解決,而開(kāi)發(fā)者可以人盡其才。軟件更新可以在數(shù)小時(shí)之內(nèi)發(fā)送到位,使得每個(gè)節(jié)點(diǎn)在整個(gè)開(kāi)發(fā)過(guò)程中步調(diào)一致。網(wǎng)絡(luò)改變了軟件的開(kāi)發(fā)模式。

另一方面,RMS 的理論體系有許多東西非常有爭(zhēng)議,他的 GPL 被認(rèn)為是一種 “病毒式” 的協(xié)議,BSD 的 fans 和老牌 Unix 黑客們認(rèn)為,他們編寫(xiě) Unix 的年頭都比 GPL 聲明要長(zhǎng)得多,GPL 依然有太多的限制,而 BSD 協(xié)議則比 GPL 更加的自由。另一方面,RMS 走向了另一個(gè)極端,他是完全反版權(quán)的,反商業(yè)化的。把軟件產(chǎn)品從強(qiáng)制收費(fèi)推向了強(qiáng)制免費(fèi)、共享和開(kāi)源,這也為他帶來(lái)了許多許多的爭(zhēng)議。

在 RMS 組織黑客鬧革命的年代里,沒(méi)有多少黑客認(rèn)同于 RMS 的理論體系,更多的他們參與 GNU 只是為了體現(xiàn)那種在互聯(lián)網(wǎng)上協(xié)同工作,令人激動(dòng)的工作模式。自從 GNU 設(shè)立以來(lái),爭(zhēng)議不斷,而黑客文化卻從未有統(tǒng)一在他的理想體系之下。

自從 Linux 出現(xiàn)以后,一個(gè)新的黑客領(lǐng)袖出現(xiàn)了,Linus Torvalds 的中庸態(tài)度網(wǎng)聚了世界上頂尖的黑客,其繞過(guò)了 GPL 和反 GPL 的派系之爭(zhēng),他使用 GNU 的工具從而以 GPL 的 “傳染性” 保護(hù)了 Linux,但他同時(shí)也不承認(rèn) RMS 的理論思想體系,他即開(kāi)源,又支持商業(yè)化。雖然,他沒(méi)有帶給黑客們什么重要的思想體系或統(tǒng)一的價(jià)值觀,但他整合了全世界黑客的陣營(yíng),讓所有的黑客的行為都圍繞著 Linux 這一事物進(jìn)行。他以 “用自由軟件是因?yàn)樗\(yùn)行得更好” 輕而易舉地蓋過(guò)了 “用自由軟件是因?yàn)樗熊浖荚撌亲杂傻摹薄?/p>

1998 年初,這種新思潮促使網(wǎng)景公司(Netscape Communications)公布了其 Mozilla 瀏覽器的源碼。媒體對(duì)此事件的關(guān)注促成了 Linux 在華爾街的上市,推動(dòng)了 1999-2001 年間科技股的繁榮。事實(shí)證明,此事無(wú)論對(duì)黑客文化的歷史還是對(duì) Unix 的歷史都是一個(gè)轉(zhuǎn)折點(diǎn)。

Unix 的歷史教訓(xùn)

下面的文字出自《The Art of Unix Programming》(Unix 編程藝術(shù))。令今天我們所有人所反思。

在 Unix 歷史中,最大的規(guī)律就是: (看看《誰(shuí)寫(xiě)了 Linux》你就會(huì)知道這一規(guī)律)

距開(kāi)源越近就越繁榮。任何將 Unix****專有化的企圖,只能陷入停滯和衰敗。

回顧過(guò)去,我們?cè)缭撜J(rèn)識(shí)到這一點(diǎn)。1984 年至今,我們浪費(fèi)了十年時(shí)間才學(xué)到這個(gè)教訓(xùn)。如果我們?nèi)蘸蟛凰蓟诟?#xff0c;可能還得大吃苦頭。

雖然我們?cè)谲浖O(shè)計(jì)這個(gè)重要但狹窄的領(lǐng)域比其他人聰明,但這不能使我們擺脫對(duì)技術(shù)與經(jīng)濟(jì)相互作用影響的茫然,而這些就發(fā)生在我們的眼皮底下。即使 Unix 社區(qū)中最具洞察力、最具遠(yuǎn)見(jiàn)卓識(shí)的思想家,他們的眼光終究有限。對(duì)今后的教訓(xùn)就是:過(guò)度依賴任何一種技術(shù)或者商業(yè)模式都是錯(cuò)誤的—— 相反,保持軟件及其設(shè)計(jì)傳統(tǒng)的的靈活性才是長(zhǎng)存之道。

另一個(gè)教訓(xùn)是:別和低價(jià)而靈活的方案較勁?;蛘?#xff0c;換句話說(shuō),低檔的硬件只要數(shù)量足夠,就能爬上性能曲線而最終獲勝。經(jīng)濟(jì)學(xué)家 Clayton Christensen 稱之為 “破壞性技術(shù)”,他在《創(chuàng)新者窘境》(The Innovator’s Dilemma)[Christensen] 一書(shū)中以磁盤(pán)驅(qū)動(dòng)器、蒸汽挖土機(jī)和摩托車為例闡明了這種現(xiàn)象的發(fā)生。當(dāng)小型機(jī)取代大型機(jī)、工作站和服務(wù)器取代小型機(jī)以及日用 Intel 機(jī)器又取代工作站和服務(wù)器時(shí),我們也看到了這種現(xiàn)象。開(kāi)源運(yùn)動(dòng)獲得成功正是由于軟件的大眾化。Unix 要繁榮,就必須繼續(xù)采用吸納低價(jià)而靈活的方案的訣竅,而不是去反對(duì)它們。

最后,舊學(xué)派的 Unix 社區(qū)因采用了傳統(tǒng)的公司組織、財(cái)務(wù)和市場(chǎng)等命令機(jī)制而最終未能實(shí)現(xiàn) “職業(yè)化”。只有癡迷的 “黑客” 和具有創(chuàng)造力的怪人結(jié)成的反叛聯(lián)盟才能把我們從愚蠢中拯救出來(lái) —— 他們接著教導(dǎo)我們,真正的專業(yè)和奉獻(xiàn)精神,正是我們?cè)谇谑浪子^念的 “合理商業(yè)做法” 之前的所作所為。

Unix 族譜

Unix 的故事仍舊延續(xù)著……,許多網(wǎng)站也為這段歷史留下記錄。一個(gè)詳細(xì)記錄 Unix 歷史的網(wǎng)站(http://www.levenez.com/unix/),這個(gè)網(wǎng)站忠實(shí)記載著 1969~2005 年 Unix 發(fā)展的大事,而且還有 PDF 檔案可供下載,上面有一個(gè)龐大的 UNIX 家族版本樹(shù),讓人嘆為觀止。網(wǎng)站的首頁(yè)陳列每個(gè)時(shí)期 Unix 的歷史,也代表著無(wú)數(shù)工程師的心血與努力。

下面是一個(gè)簡(jiǎn)單的 Unix 的族譜:

     |--AT&T (1969)-----\|                  ||              V6 (1976)|                  ||              V7 (1979)|                  ||   Novell owns AT&T's Unix (by 1994)|     _____________|____________________|     |       |      |        |         ||    AIX    IRIX    SCO   HP-UX   Solaris 2.X|   (IBM)   (SGI)          (HP)     (Sun)|||--Berkley (1977)-----\|                     ||                  1BSD (1977)
UNIX-|                     ||                4.4BSD (1993)|                     ||                   Net/2|                     ||               4.4BSD-Lite (by 1995)|     ________________|____________________________________|     |       |          |         |          |            ||   SunOS   Ultrix   NetBSD    OSF/1   NeXTSTEP   Mac OS X|   (Sun)   (DEC)   (Various)  (DEC)    (NeXT)    (Apple)|                   (FreeBSD)|||--Hybrids----\|Linux (Various)||____________________________________________|    |      |          |              |      || RedHat  Debian  Mandrake   Slackware    S.u.S.E.|                          (Walnut Creek)||_____________________________________________|        |           |          |        |MkLinux  LinuxPPC  TurboLinux  OpenLinux  CorelLinux(Apple)                        (Caldera)   (Corel)

點(diǎn)些查看《Linux 分發(fā)包族譜》

Unix 的特點(diǎn)

現(xiàn)在的文獻(xiàn)中提到 Unix 基本上是說(shuō),由 Ken Thompson 和 Dennis Ritchie 共同開(kāi)發(fā)的。而通過(guò)歷史我們也能發(fā)現(xiàn),Unix 的主要是由 Ken Thompson 寫(xiě)下的。但在學(xué)術(shù)界,Dennis Ritchie 的名字往往被排在了 Ken Thompson 前面的。這就是因?yàn)?#xff0c;Dennis Ritchie 不但發(fā)明了 C 語(yǔ)言,而且當(dāng)時(shí)他設(shè)計(jì) Unix 操作系統(tǒng)的設(shè)計(jì)思想,影響了整個(gè)世界,直到今天。

當(dāng)時(shí),他們開(kāi)發(fā) UNIX,沒(méi)有正式立項(xiàng),是 Ken Thompson 和 Dennis Ritchie 等少數(shù)幾個(gè)人偷偷干的,如果一切都要從頭從新設(shè)計(jì),那幾乎是不可能的。所以,Unix 吸取與借鑒了 Multics 的經(jīng)驗(yàn),如內(nèi)核,進(jìn)程,層次式目錄,面向流的 I/O,把設(shè)備當(dāng)作文件,…… 等等。但是 Unix 在繼承中又有創(chuàng)新,比如 Unix 采用一種無(wú)格式的文件結(jié)構(gòu),文件由字節(jié)串加 \0 組成。這帶來(lái)兩大好處:一是在說(shuō)明文件時(shí)不必加進(jìn)許多無(wú)關(guān)的 “填充物”,二是任何程序的輸出可直接用作其他任何程序的輸入,不必經(jīng)過(guò)轉(zhuǎn)換。后面這一點(diǎn)叫做 “管道”(piping),這就是 Unix 首創(chuàng)的。此外,像把設(shè)備當(dāng)作文件,從而簡(jiǎn)化了設(shè)備管理這一操作系統(tǒng)設(shè)計(jì)中的難題,雖然不是 UNIX 的發(fā)明,但是實(shí)現(xiàn)上它采用了一些新方法,比 Multics 更高明一些。

下面是 Unix 的特點(diǎn):(30 多年過(guò)去了,這些東西早已變成經(jīng)典)

  • Everything (including hardware) is a file
    所有的事物(甚至硬件本身)都是一個(gè)的文件。

  • Configuration data stored in text
    以文本形式儲(chǔ)存配置數(shù)據(jù)。

  • Small, single-purpose program
    程序盡量朝向小而單一的目標(biāo)設(shè)計(jì)

  • Avoid captive user interfaces
    盡量避免令人困惑的用戶接口

  • Ability to chain program together to perform complex tasks
    將幾個(gè)程序連結(jié)起來(lái),處理大而復(fù)雜的工作。

Unix 的影響和哲學(xué)

Unix 是第三次工業(yè)革命中計(jì)算機(jī)軟件領(lǐng)域最具代表性的產(chǎn)物。在這近 40 年中,由 Unix 造成的影響是最有深遠(yuǎn)意義的。就我看來(lái),Unix 為軟件領(lǐng)域帶來(lái)了至少以下有積極的東西,由這些東西所引發(fā)的直接或間接的事物更是舉不勝數(shù)。

  1. 軟件開(kāi)發(fā)的若干哲學(xué)和思想。
  2. 全民參與推動(dòng)軟件,代碼共享的模式。
  3. 開(kāi)啟了黑客文化和開(kāi)源項(xiàng)目。
  4. 免費(fèi)和商業(yè)的完美結(jié)合的 Linux。
  5. C 語(yǔ)言,而后發(fā)展的 C++,Java 等等類 C 的語(yǔ)言和腳本。(參看《C 語(yǔ)言的演變史》見(jiàn)下文)
  6. TCP/IP,其的 Socket 編程已成為今天通用的網(wǎng)絡(luò)編程主流。(參看《到處都是 Unix 的胎記》見(jiàn)下文)

不能不說(shuō),AT&T 雖然發(fā)展了 Unix,但今天 Unix 的混亂的局面也和 AT&T 有著直接原因。但反過(guò)來(lái)說(shuō),如果沒(méi)有 AT&T 的反面教材,今天的 GNU/Linux 很有可能也不會(huì)出現(xiàn)。AT&T 究竟是限制了 Unix 的發(fā)展,還是以反面示例促進(jìn)了 Unix 社區(qū),已不好評(píng)說(shuō)。今天,軟件是商業(yè)化好還是開(kāi)源好的爭(zhēng)論還在繼續(xù),縱觀這幾十年來(lái) Unix 的歷史,Linux 的劃時(shí)代地出現(xiàn)。相信你會(huì)得出自己的結(jié)論。不管怎么樣,Unix 的經(jīng)歷對(duì)計(jì)算機(jī)領(lǐng)域貢獻(xiàn)的不單單是技術(shù),他給我們提供了豐富而生動(dòng)的教材。特別是 Unix 引發(fā)的哲學(xué),讓今天的我們依然受益不淺。

說(shuō)到 Unix 為我們所帶來(lái)的軟件開(kāi)發(fā)的哲學(xué),我必需要說(shuō)一說(shuō)。Unix 遵循的原則是 KISS(Keep it simple, stupid)。在 http://en.wikipedia.org/wiki/Unix_philosophy 上有很多的基本上大同小異的 Unix 哲學(xué),都是很經(jīng)典的。

Doug McIlroy 是認(rèn)為 UNIX 的哲學(xué)是這樣的:三條哲學(xué),簡(jiǎn)明扼要,就是這三條哲學(xué)貫穿著整個(gè) Unix 世界。尤其是第一條 “do one thing and do it well” 真是相當(dāng)精彩!

  • Write programs that do one thing and do it well.
  • Write programs to work together.
  • Write programs to handle text streams, because that is a universal interface.

只要是 Unix 的程序員,他們會(huì)比別的程序員在任何時(shí)候都會(huì)不停地強(qiáng)調(diào)著這三條哲學(xué)。

而《The Art of Unix Programming》總結(jié)了下面這些哲學(xué),都是至理名言啊。

  • Rule of Modularity: Write simple parts connected by clean interfaces.
  • Rule of Clarity: Clarity is better than cleverness.
  • Rule of Composition: Design programs to be connected to other programs.
  • Rule of Separation: Separate policy from mechanism; separate interfaces from engines.
  • Rule of Simplicity: Design for simplicity; add complexity only where you must.
  • Rule of Parsimony: Write a big program only when it is clear by demonstration that nothing else will do.
  • Rule of Transparency: Design for visibility to make inspection and debugging easier.
  • Rule of Robustness: Robustness is the child of transparency and simplicity.
  • Rule of Representation: Fold knowledge into data so program logic can be stupid and robust.
  • Rule of Least Surprise: In interface design, always do the least surprising thing.
  • Rule of Silence: When a program has nothing surprising to say, it should say nothing.
  • Rule of Repair: When you must fail, fail noisily and as soon as possible.
  • Rule of Economy: Programmer time is expensive; conserve it in preference to machine time.
  • Rule of Generation: Avoid hand-hacking; write programs to write programs when you can.
  • Rule of Optimization: Prototype before polishing. Get it working before you optimize it.
  • Rule of Diversity: Distrust all claims for “one true way”.
  • Rule of Extensibility: Design for the future, because it will be here sooner than you think.

X Windows 的設(shè)計(jì)者 Mike Gancarz 給出了下面九條哲學(xué)思想

1.Small is beautiful.
2.Make each program do one thing well.
3.Build a prototype as soon as possible.
4.Choose portability over efficiency.
5.Store data in flat text files.
6.Use software leverage to your advantage.
7.Use shell scripts to increase leverage and portability.
8.Avoid captive user interfaces.
9.Make every program a filter.

在今天,這種思想依然被傳承著,在影響著世界上各個(gè)角落的每一個(gè)程序員。

Unix 痛恨者手冊(cè)

這里還需要值得一提的是一本叫《The Unix-Haters Handbook》,中文譯做《Unix 痛恨者手冊(cè)》。可以在這里下載:http://research.microsoft.com/~daniel/uhh-download.html
其中以調(diào)侃的語(yǔ)氣聲討了 Unix 的種種不是。雖然這是十年前的一本書(shū)了,但還是值得一讀。這本書(shū)指出了許多 Unix 的設(shè)計(jì)錯(cuò)誤,指出了種種看起來(lái)很合理的設(shè)計(jì)走向了荒謬,還這樣調(diào)侃了 C 語(yǔ)言 ——“如果說(shuō) C 語(yǔ)言給足了讓你上吊的繩子,那么,C++ 在給了你足夠的繩子把你的鄰居全部捆起來(lái)之后,還給了你足夠的繩子讓你為一艘小帆船裝上帆,最后你還有足夠的繩子把自己吊死在帆船的桅桿上”。呵呵,相當(dāng)?shù)募馑峥瘫“?。里面有一句?duì)操作系統(tǒng)的評(píng)價(jià)是這樣的:“The fundamental difference between Unix and the Macintosh operating system is thatUnix was designed to please programmers, whereas the Mac was designed to please users. (Windows, on the other hand, was designed to please accountants.”(Windows 設(shè)計(jì)給會(huì)計(jì)人員?!連計(jì)算機(jī)用戶都不是了,hh)

不過(guò),我可以感覺(jué)得到這本書(shū)的作者在書(shū)中對(duì) Unix 的感情是比較復(fù)雜的,愛(ài)恨交加,在書(shū)的最后有這樣一句話 “would anyone have spent this much time and effort writing about how much they hated Unix if they didn’t secretly love it? I’ll leave that to the readers to judge, but in the end, it really doesn’t matter: If this book doesn’t kill Unix, nothing will”。是的,如果 Unix 能夠存活這么長(zhǎng)的時(shí)間,那么,不會(huì)有什么東西可以把他消滅了。

從《Unix 痛恨者手冊(cè)》這本書(shū),再加上 Unix 的歷史,我們可以感到 Unix 的經(jīng)歷的風(fēng)風(fēng)雨雨,在 Unix 上面出現(xiàn)有種種教訓(xùn),近 40 年的歷程,Unix 歷經(jīng)磨難,幾近夭折,一路走來(lái)的確很不容易,讓人由衷感嘆。今天的 Unix,今天的軟件工業(yè)和以前相比已是不可同日而語(yǔ)。很大程度上,這些都要?dú)w功于這個(gè)充滿蒼桑的 Unix。

后記

在中國(guó)我們開(kāi)始學(xué)習(xí)計(jì)算機(jī)的時(shí)候,我們被 Microsoft 所創(chuàng)造的文化所籠罩里。就在 Unix 出現(xiàn)革命性的轉(zhuǎn)變,在 Unix 影響計(jì)算機(jī)世界文化的那幾年里,科班出生專業(yè)開(kāi)發(fā)人員學(xué)習(xí)的是 MS-DOS 和微軟的文化,我們猶如一個(gè)井底之蛙一樣,對(duì)外面的翻天覆地的變化無(wú)動(dòng)于衷。微軟創(chuàng)造的文化在我們這里尤其地根深蒂固,我們幾乎忘記了另外一邊的 Unix(參看《Unix 40 年:Unix 年鑒》、《Unix 40 年:昨天,今天和明天》)。

在那充滿激情的 Unix 的歲月里,大伙為了科研目的或個(gè)人興趣在 Unix 上進(jìn)行各種開(kāi)發(fā),并且不計(jì)較金錢利益,將這些源碼公開(kāi),互相共享。在那里,開(kāi)發(fā)和自由成為主題,正因?yàn)槿绱?#xff0c;當(dāng)今的世界才如此豐富多采。在 40 年 Unix 文化和技術(shù)積淀的里面,蘊(yùn)涵著比較純正的計(jì)算機(jī)文化和思想。

縱觀整個(gè) Unix 的歷史過(guò)程中,許許多多的程序員、工程師前輩們?cè)?Unix 中所摸爬滾打,他們的辛勤地、他們嘔心瀝血地跟隨 Unix,努力建立一個(gè)繁榮的計(jì)算機(jī)世界的文明。Unix 不是一個(gè)簡(jiǎn)簡(jiǎn)單單的操作系統(tǒng)。有人說(shuō),Unix 是程序員設(shè)計(jì)給程序員的,一點(diǎn)沒(méi)錯(cuò)。Unix 的近 40 年歷史造就了它的博大精深,它給程序員們帶來(lái)的絕不僅僅只是技術(shù)上的知識(shí)。它的失誤,它的無(wú)奈,它的精神,它的榮耀,它從技術(shù)和思想上都啟迪著我們。對(duì)于程序員來(lái)說(shuō),學(xué)習(xí) Unix 就等同于向前輩程序?qū)W習(xí)。無(wú)論你是什么樣的程序員,你都應(yīng)該了解 Unix,這是開(kāi)發(fā)人員的根,前面的開(kāi)發(fā)者造就了它,而它又在引領(lǐng)后面的開(kāi)發(fā)人員,它是前輩程序員們交給我們的一份禮物,一個(gè)接力棒,它是開(kāi)發(fā)人員賴以生存的土壤,是上一輩程序員留給我們這一代程序員開(kāi)啟未來(lái)的鑰匙。Unix 就像一個(gè)程序員教父一樣,理當(dāng)受到我們的尊敬和崇拜。

參考資料

  • Peter H. Salus 的《A Quarter Century of UNIX》,這被認(rèn)為是 UNIX 的標(biāo)準(zhǔn)歷史。
  • Eric S. Raymond 的《The Art of Unix Programming
  • http://www.wikipedia.org/ 維基百科
  • http://www.computerhope.com/history/ Computer History
  • http://www.lotsir.com/Blog/article.asp?id=494 Lotsir’s Blog — 《Unix&Linux 歷史重溫
  • http://www.aka.org.cn/Docs/hacker-history.html 《黑客文化簡(jiǎn)史
  • http://www.simson.net/ref/ugh.pdf 《The UNIX-HATERS Handbook
  • http://free-electrons.com/doc/free_software/img0.html 《GNU/Linux Free Software》幻燈片
  • http://cm.bell-labs.com/cm/cs/who/dmr/hist.htmlDennis M. RitchieThe Evolution of the Unix Time-sharing System

誰(shuí)寫(xiě)了 Linux

2009 年 08 月 25 日 陳皓

2009 年 8 月,Linux 軟件基金會(huì) 發(fā)布了一份叫《Who Writes Linux and Who Supports It》(PDF) 的報(bào)告。這份報(bào)告主要對(duì) Linux 2.6.x 的開(kāi)發(fā)進(jìn)行了全方位的統(tǒng)計(jì)??戳艘院蟛胖?#xff0c;原來(lái) Linux 的開(kāi)發(fā)的生產(chǎn)率竟是這樣的驚人,而且相當(dāng)?shù)牡牧钊苏駣^,所以,在第一時(shí)間轉(zhuǎn)過(guò)來(lái)給大家看看。讓人不得不驚嘆,這不可思議的具有非凡活力的社區(qū)。(注意,我們這里說(shuō)的是 Linux,不是 GNU 的那些東西,所謂 Linux 就是 Linux 的 Kernel)

下面是一個(gè)導(dǎo)讀,希望每一個(gè)看到這篇文章的朋友都能看看原文的報(bào)告:《Who Writes Linux and Who Supports It》(PDF)

這份報(bào)告的一開(kāi)始就對(duì) Linux 的開(kāi)發(fā)進(jìn)行了總結(jié):

  • 每 2-3 個(gè)月一個(gè) release
  • 最近的每一次 release 都超過(guò) 10000 個(gè)補(bǔ)丁
  • 有超過(guò) 1000 個(gè)開(kāi)發(fā)人員進(jìn)行開(kāi)發(fā),他們來(lái)自 200 個(gè)公司或組織。
  • 自 2005 年以來(lái),超過(guò) 5000 個(gè)來(lái)自 500 個(gè)不同公司的開(kāi)發(fā)人員為 Linux 內(nèi)核做過(guò)貢獻(xiàn)。
  • 自 2008 年以來(lái),每次 release,都大約增加了 10% 左右的開(kāi)發(fā)人員,而且,代碼碼達(dá)到了 2.7 百萬(wàn)行。

是的,這樣的生產(chǎn)率真是太瘋狂了。下面是這份文檔中所涉及的一些介紹和一些具體的統(tǒng)計(jì)數(shù)據(jù)。

Linux 開(kāi)發(fā)模式

Linux 的開(kāi)發(fā)采用的是一種寬松的,基于時(shí)間的開(kāi)發(fā)模式。每一個(gè)新的主要版本的 release 基本上會(huì)發(fā)生在 2-3 個(gè)月之內(nèi)。這個(gè)開(kāi)發(fā)模式是在 2005 年形成的,因?yàn)槿魏稳硕伎梢孕薷钠鋬?nèi)核的代碼,所以,很多補(bǔ)丁進(jìn)入內(nèi)核的時(shí)間非常的快。

其中一個(gè)有意義的事是,他們有一個(gè)叫 Linux-Next 的服務(wù)器,這個(gè)服務(wù)器一般來(lái)說(shuō)會(huì)是下一個(gè)版本的 staging,比如,如果目前的穩(wěn)定版本是 2.6.31,那么 Linux-Next 上就會(huì)運(yùn)行 2.6.32。這樣,所有的 developer 都能看到下一個(gè)版本總體的樣子,而且,這更容易發(fā)現(xiàn)一些集成性的問(wèn)題。

在 2.6 的 mainline 代碼庫(kù)上(mailline 是代碼庫(kù)的主線),有一個(gè)叫做 “stable team” 的團(tuán)隊(duì),他們會(huì)做短期的維護(hù)工作,他們確保所有的重要的補(bǔ)丁或更改都會(huì)被放入 mailline 中,這樣就能滾入下一個(gè) release。

然后,這份文檔中給出了大量的開(kāi)發(fā)編譯數(shù)據(jù)。

統(tǒng)計(jì)數(shù)據(jù)

下面的統(tǒng)計(jì)數(shù)據(jù)是從版本 2.6.11 開(kāi)始的,我把源文件中的表格合并成一個(gè)大表,如下所示。

Linux Kernel 開(kāi)發(fā)統(tǒng)計(jì)數(shù)據(jù)

從上圖我們可以看到下面這些東西:

  • Linux Kernel 開(kāi)發(fā)的速度越來(lái)越快,看看每個(gè) release 的補(bǔ)丁數(shù),每天文件增、刪、改就可以知道。
  • Linux Kernel 開(kāi)發(fā)的團(tuán)隊(duì)是越來(lái)越大,包括人員和參與的公司。

下面是幾個(gè)統(tǒng)計(jì)圖表:

linuxp1
平均每天的修改

linuxp2
代碼修改統(tǒng)計(jì)

linuxp3
開(kāi)發(fā)人員

誰(shuí)寫(xiě)了 Linux

最后我們進(jìn)入主題 —— 誰(shuí)寫(xiě)了 Linux,首先,我們先來(lái)看一下進(jìn)入代碼修改的 Top 30 的開(kāi)發(fā)人員列表:

Top 30 Linux developer

我們可以看到,Linus Torvalds (729 總修改,自 2.6.24 版來(lái) 254 修改)無(wú)法進(jìn)入前 30 名。當(dāng)然,對(duì) Linux 的貢獻(xiàn)絕對(duì)不能通過(guò)代碼行來(lái)表示,Linus 對(duì) Linux 就算是在今天也是至關(guān)緊要的。

好,讓我們?cè)賮?lái)看看那些公司對(duì) Linux 的貢獻(xiàn)。根據(jù)這份報(bào)告所說(shuō),知道每個(gè) developer 所在的公司,主要是通過(guò)了下面的幾種方法:

  • 使用的郵件地址有公司的名字。
  • 由贊助者提交的代碼。
  • 直接詢問(wèn)得到的。

所以,這些數(shù)據(jù)只能算得上的近似,不過(guò)也能看到一個(gè)總體的樣子了。下圖中 “None” 代表沒(méi)有職業(yè)無(wú)業(yè)游民,“Unknown” 代表無(wú)名氏或是英雄不知出處。

Linux Company Top 30

我們可以看到,Top 10 公司,為 Linux 貢獻(xiàn)了近 70% 的代碼。包括了 None 和 Unknown,而且,那些是拿著公司報(bào)酬給 Linux 作開(kāi)發(fā)的程序員。

那么,為什么這些公司要支持 Linux 的內(nèi)核開(kāi)發(fā)呢?

  • 我們可以看到像 IBM, Intel, SGI, MIPS, Freescale, HP, Fujitsu 這樣的大公司,他們的目的當(dāng)然是為了確保 Linux 能夠在他們的硬件上工作得更好。
  • 我們也可以看到像 Red Hat, Novell, 和 MontaVista 這些 Linux 的 Distribution 公司,他們是 Linux 的主力,主要是為了提供給他們的客戶更好的服務(wù)。
  • 同樣,我們還能看到像 Sony, Nokia, 和 Samsung 這樣的公司,這些公司主要是用 Linux 來(lái)開(kāi)發(fā)數(shù)碼產(chǎn)品,如攝像機(jī)、手機(jī)或是電視,他們使用 Linux 做一些嵌入式開(kāi)發(fā),以保證他們的產(chǎn)品工作得更好。
  • 還有一些和 IT 都沒(méi)有關(guān)系的,例如:Volkswagen 公司在 v21.6.25 中為 Linux 加入了 PF_CAN 網(wǎng)絡(luò)實(shí)現(xiàn)的協(xié)議。Quantum Controls BV 公司在 2.6.30 時(shí)加入了一個(gè)航海導(dǎo)航的補(bǔ)丁,這些公司都會(huì)使用 Linux 來(lái)完善他們的產(chǎn)品。

看來(lái),Linux 的勢(shì)頭是越來(lái)越無(wú)法阻擋了,你也想加入這個(gè)陣營(yíng)嗎?點(diǎn)下面的鏈接吧:http://ldn.linuxfoundation.org/book/how-participate-linux-community

(全文完)


Alice 夢(mèng)游 UNIX 仙境

2009 年 09 月 19 日 陳皓

本文來(lái)源:http://www.pma.caltech.edu/Publications/alice.in.unix.land.html
(這是一篇 1989 年的文章)

Alice 正在在她的顯示器上讀著一些信息,她開(kāi)會(huì)懷疑所有的事情并不是應(yīng)該的那樣?!俺绦蛱罅?#xff0c;而無(wú)法適應(yīng)內(nèi)存”,她讀到。

“一個(gè)很奇怪的事情”,她說(shuō),“我所做的也就是在啟動(dòng)我的字處理程序會(huì)運(yùn)行了 14 個(gè) TSR(terminate-and-stay-resident 常駐程序)。所有這些程序需要使用 4M 的內(nèi)存,我希望我能使用超過(guò) 640K 以上的內(nèi)存”。

就在那個(gè)時(shí)候,一個(gè)小的白色的顧問(wèn)(一個(gè)非常白的顧問(wèn))跑過(guò)了房間。“哦,我的外套和領(lǐng)帶”,他說(shuō)到,“我要遲到了。并且是每小時(shí) 150 元。”Alice 本想對(duì)他說(shuō)點(diǎn)什么,他卻跳到了 Alice 的顯示器里并到在操作系統(tǒng)后面消失了。

Alice 從來(lái)沒(méi)有見(jiàn)過(guò)有人可以跳到顯示器里,并且肯定不是通過(guò)操作系統(tǒng)干。但是,曾有人告訴他,DOS 這個(gè)操作系統(tǒng)是非常膚淺的。于是,她沒(méi)有怎么猶豫,Alice 也跳了進(jìn)去。

Alice 發(fā)現(xiàn)她自己在一個(gè)明亮的走廊里。她不知道要做什么,她開(kāi)始向前走,走過(guò)了一個(gè)拐角后,她發(fā)現(xiàn)她的前面有兩個(gè)小胖子,他們互相摟著對(duì)對(duì)方的脖子。一個(gè)人的領(lǐng)口上繡著 “POS”,另一個(gè)則是 “NEG”。

“我知道”,Alice 說(shuō),“你倆是晶體管”。

“是的”,Positive 回答到。

“你們能幫我嗎?”Alice 問(wèn)道。

“不能”,Negative 回答。

“我在找一個(gè)白色的顧問(wèn)”,Alice 指著她走過(guò)來(lái)的方向,“他走的是這條路嗎?”Alice 繼續(xù)問(wèn)道。

“不是”,Negative 回答到。

Alice 又指了另一條路。

“是的”,Postive 回答到。

很快,Alice 來(lái)到了一個(gè)很大的棕色的桌前。那個(gè)顧問(wèn)就在那里,名字叫 Mad Hacker,并且有一些 Alice 并不知道的生物圍在桌邊。在角落里,有一個(gè)睡鼠在那熟睡。在桌子上放著一個(gè)大的標(biāo)牌 ,上面寫(xiě)著 “UNIX Conference”

每一個(gè)人除了那只睡鼠都有一個(gè)紙杯,紙杯里應(yīng)該是奶油蛋羹的樣子?!板e(cuò)誤的佐料”,他們所有人都這么說(shuō),并把杯子傳遞給他們右手邊的人,并且優(yōu)雅地從他們的左邊接過(guò)杯子。Alice 看著他們重復(fù)著這個(gè)儀式三到四次后,她也坐到了他們中間。

馬上,一個(gè)很大的癩蛤蟆跳到了他的大腿上,并看著她就好像希望得到 Alice 的寵愛(ài)。“Grep”,它叫到。

“別介意”,Mad Hacker 解釋道,“他只是想查找一些字符串”。

“Nroff?” 蛤蟆問(wèn)到。

Mad Hacker 給了 Alice 一個(gè)有看似有奶油蛋羹杯子以及一把勺子?!斑@里”,他問(wèn)到,“你對(duì)這個(gè)有什么想法?”

“看起來(lái)很可愛(ài)”,Alice 說(shuō),“非常甜”。她邊說(shuō)邊嘗了一勺?!坝憛?#xff01;” 他叫到,“真糟糕,這是什么啊?!”

“哦,這只不過(guò)是 Unix 的另一個(gè)圖形界面”,Hacker 回答道。

Alice 指著角落里的那只睡鼠說(shuō):“他是誰(shuí)?”

“那也是一個(gè)操作系統(tǒng)”,Hacker 解釋道,“我們幾乎放棄了去把他喚醒過(guò)來(lái)”。

就在這個(gè)時(shí)候,坐在睡鼠旁邊的一個(gè)很大的藍(lán)色的大象站了起來(lái)。“女士們,先生們”,他很傲慢地說(shuō)到,“作為在這里的一個(gè)最大的生物,我感到我們必需開(kāi)明地來(lái)看一下……”

一個(gè)在桌子另一邊的年輕的 “工作麻雀” 憤努地站了起來(lái)。大象注意這事,并改變了他的演講,“…… 什么是我們下一步的行動(dòng)”。

有一半的生物鞠躬至敬,而另一半的生物偷偷竊笑。這個(gè)時(shí)候,睡鼠醒過(guò)來(lái)了,要和這個(gè)大象合并。沒(méi)人有一丁點(diǎn)的驚訝。

“我們需要什么”,一只 Sun 熊宣稱,他用他的長(zhǎng)甜頭舔了舔那個(gè)奶油蛋羹說(shuō)道,“我們需要的是一個(gè)像 Macintosh 那樣的調(diào)料”。

突然,那個(gè)白色顧問(wèn)紅著臉跳了起來(lái),“不,不,不!” 他尖叫著,“沒(méi)有人會(huì) 150 元一小時(shí)的費(fèi)用給 Macintosh!”

“Awk”,青蛙說(shuō)道。

“用戶”,Sun 熊解釋到,“用戶們希望的是那種簡(jiǎn)單到不需要學(xué)習(xí)的用戶接口”。

“用戶?”Hacker 叫到 “用戶?!你說(shuō)的是那些秘書(shū),會(huì)計(jì),建筑師,以及體力勞動(dòng)者!”

“喔” Sun 熊說(shuō)到,“我得做點(diǎn)什么得讓他們把系統(tǒng)切換到 UNIX”。

“你們是否覺(jué)得,” 一個(gè)正在桌子上打洞的啄木鳥(niǎo)說(shuō),“我們一同使用 Unix 這個(gè)名字會(huì)是一個(gè)問(wèn)題?我的意思是,這樣想的并不只有我一個(gè)人?!?/p>

“也許我們應(yīng)該試試別的名字”,工作麻雀說(shuō),“比如:Brut 或 Rambo”。

“Penix” 一只企鵝說(shuō)到。

“mount”,蛤蟆說(shuō),“spawn”。

Alice 拍了一下蛤蟆?!皀ice?” 蛤蟆問(wèn)到。

“但是”,啄木鳥(niǎo)又建議到,“ShrinkWap 的問(wèn)題怎么辦?”

突然,每一個(gè)人都跳了起來(lái),而且都變得活躍起來(lái),揮動(dòng)著他們的雙手大叫著,但只一會(huì),他們又全都坐下來(lái)。

“現(xiàn)在這個(gè)問(wèn)題解決了”,啄木鳥(niǎo)說(shuō),“讓我們回到調(diào)料的問(wèn)題上來(lái)吧”。

于是,桌子邊的每個(gè)人又采樣了一個(gè)新的奶油蛋羹,繼續(xù)說(shuō)到 “錯(cuò)誤的調(diào)料”,然后把杯子傳給右邊的人,并從左邊的人接過(guò)杯子。

完全地被搞糊涂了,Alice 起身離開(kāi)了,她正在正在離開(kāi)的過(guò)程中,她聽(tīng)到了身后傳來(lái)了一個(gè)熟悉的聲音。

“rem”,它說(shuō),“edlin”

Alice 轉(zhuǎn)過(guò)身去,看到了那只蛤蟆,她微笑著。“你總是說(shuō)著這些古怪發(fā)音的單詞”,她說(shuō),“但至少我知道他們是什么意思”。

“chkdsk”, 蛤蟆說(shuō)到。

—–By Lincoln Spector TEXAS COMPUTER CURRENTS SEPTEMBER 1989


到處都是 Unix 的胎記

2009 年 10 月 11 日 陳皓

一說(shuō)起 Unix 編程,不必多說(shuō),最著名的系統(tǒng)調(diào)用就是 fork,pipe,exec,kill 或是 socket 了(fork(2), execve(2), pipe(2), socketpair(2), select(2), kill(2), sigaction(2))這些系統(tǒng)調(diào)用都像是 Unix 編程的胎記或簽名一樣,表明著它來(lái)自于 Unix。

下面這篇文章,將向大家展示 Unix 下最經(jīng)典的 socket 的編程例子 —— 使用 fork + socket 來(lái)創(chuàng)建一個(gè) TCP/IP 的服務(wù)程序。這個(gè)編程模式很簡(jiǎn)單,首先是創(chuàng)建 Socket,然后把其綁定在某個(gè) IP 和 Port 上上偵聽(tīng)連接,接下來(lái)的一般做法是使用一個(gè) fork 創(chuàng)建一個(gè) client 服務(wù)進(jìn)程再加上一個(gè)死循環(huán)用于處理和 client 的交互。這個(gè)模式是 Unix 下最經(jīng)典的 Socket 編程例子。

下面,讓我們看看用 C,Ruby,Python,Perl,PHP 和 Haskell 來(lái)實(shí)現(xiàn)這一例子,你會(huì)發(fā)現(xiàn)這些例子中的 Unix 的胎記。如果你想知道這些例子中的技術(shù)細(xì)節(jié),那么,向你推薦兩本經(jīng)典書(shū) ——《Unix 高級(jí)環(huán)境編程》和《Unix 網(wǎng)絡(luò)編程》。

C語(yǔ)言

我們先來(lái)看一下經(jīng)典的C是怎么實(shí)現(xiàn)的。

/**\* A simple preforking echo server in C.*\* Building:*\* $ gcc -Wall -o echo echo.c*\* Usage:*\* $ ./echo*\*   ~ then in another terminal ... ~*\* $ echo 'Hello, world!' | nc localhost 4242**/
#include <unistd.h> /* fork, close */
#include <stdlib.h> /* exit */
#include <string.h> /* strlen */
#include <stdio.h> /* perror, fdopen, fgets */
#include <sys/socket.h>
#include <sys/wait.h> /* waitpid */
#include <netdb.h> /* getaddrinfo */#define die(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)
#define PORT "4242"
#define NUM_CHILDREN 3
#define MAXLEN 1024int readline(int fd, char *buf, int maxlen); // forward declarationint
main(int argc, char** argv)
{int i, n, sockfd, clientfd;int yes = 1; // used in setsockopt(2)struct addrinfo *ai;struct sockaddr_in *client;socklen_t client_t;pid_t cpid; // child pidchar line[MAXLEN];char cpid_s[32];char welcome[32];/* Create a socket and get its file descriptor -- socket(2) */sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {die("Couldn't create a socket");}/* Prevents those dreaded "Address already in use" errors */if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&yes, sizeof(int)) == -1) {die("Couldn't setsockopt");}/* Fill the address info struct (host + port) -- getaddrinfo(3) */if (getaddrinfo(NULL, PORT, NULL, &ai)!= 0) {die("Couldn't get address");}/* Assign address to this socket's fd */if (bind(sockfd, ai->ai_addr, ai->ai_addrlen)!= 0) {die("Couldn't bind socket to address");}/* Free the memory used by our address info struct */freeaddrinfo(ai);/* Mark this socket as able to accept incoming connections */if (listen(sockfd, 10) == -1) {die("Couldn't make socket listen");}/* Fork you some child processes. */for (i = 0; i < NUM_CHILDREN; i++) {cpid = fork();if (cpid == -1) {die("Couldn't fork");}if (cpid == 0) { // We're in the child...for (;;) { // Run forever.../* Necessary initialization for accept(2) */client_t = sizeof client;/* Blocks! */clientfd = accept(sockfd, (struct sockaddr *)&client, &client_t);if (clientfd == -1) {die("Couldn't accept a connection");}/* Send a welcome message/prompt */bzero(cpid_s, 32);bzero(welcome, 32);sprintf(cpid_s, "%d", getpid());sprintf(welcome, "Child %s echo> ", cpid_s);send(clientfd, welcome, strlen(welcome), 0);/* Read a line from the client socket... */n = readline(clientfd, line, MAXLEN);if (n == -1) {die("Couldn't read line from connection");}/*... and echo it back */send(clientfd, line, n, 0);/* Clean up the client socket */close(clientfd);}}}/* Sit back and wait for all child processes to exit */while (waitpid(-1, NULL, 0) > 0);/* Close up our socket */close(sockfd);return 0;
}/*** Simple utility function that reads a line from a file descriptor fd,* up to maxlen bytes -- ripped from Unix Network Programming, Stevens.*/
int
readline(int fd, char *buf, int maxlen)
{int n, rc;char c;for (n = 1; n < maxlen; n++) {if ((rc = read(fd, &c, 1)) == 1) {*buf++ = c;if (c == '\n')break;} else if (rc == 0) {if (n == 1)return 0; // EOF, no data readelsebreak; // EOF, read some data} elsereturn -1; // error}*buf = '\0'; // null-terminatereturn n;
}

Ruby

下面是 Ruby,你可以看到其中的 fork

# simple preforking echo server in Ruby
require 'socket'# Create a socket, bind it to localhost:4242, and start listening.
# Runs once in the parent; all forked children inherit the socket's
# file descriptor.
acceptor = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
address = Socket.pack_sockaddr_in(4242, 'localhost')
acceptor.bind(address)
acceptor.listen(10)# Close the socket when we exit the parent or any child process. This
# only closes the file descriptor in the calling process, it does not
# take the socket out of the listening state (until the last fd is
# closed).
#
# The trap is guaranteed to happen, and guaranteed to happen only
# once, right before the process exits for any reason (unless
# it's terminated with a SIGKILL).
trap('EXIT') { acceptor.close }# Fork you some child processes. In the parent, the call to fork
# returns immediately with the pid of the child process; fork never
# returns in the child because we exit at the end of the block.
3.times dofork do# now we're in the child process; trap (Ctrl-C) interrupts and# exit immediately instead of dumping stack to stderr.trap('INT') { exit }puts "child #$$ accepting on shared socket (localhost:4242)"loop {# This is where the magic happens. accept(2) blocks until a# new connection is ready to be dequeued.socket, addr = acceptor.acceptsocket.write "child #$$ echo> "socket.flushmessage = socket.getssocket.write messagesocket.closeputs "child #$$ echo'd: '#{message.strip}'"}exitend
end# Trap (Ctrl-C) interrupts, write a note, and exit immediately
# in parent. This trap is not inherited by the forks because it
# runs after forking has commenced.
trap('INT') { puts "\nbailing" ; exit }# Sit back and wait for all child processes to exit.
Process.waitall

Python實(shí)現(xiàn)代碼

"""
Simple preforking echo server in Python.
"""
import os
import sys
import socket# Create a socket, bind it to localhost:4242, and start
# listening. Runs once in the parent; all forked children
# inherit the socket's file descriptor.
acceptor = socket.socket()
acceptor.bind(('localhost', 4242))
acceptor.listen(10)# Ryan's Ruby code here traps EXIT and closes the socket. This
# isn't required in Python; the socket will be closed when the
# socket object gets garbage collected.# Fork you some child processes. In the parent, the call to
# fork returns immediately with the pid of the child process;
# fork never returns in the child because we exit at the end
# of the block.
for i in range(3):pid = os.fork()# os.fork() returns 0 in the child process and the child's# process id in the parent. So if pid == 0 then we're in# the child process.if pid == 0:# now we're in the child process; trap (Ctrl-C)# interrupts by catching KeyboardInterrupt) and exit# immediately instead of dumping stack to stderr.childpid = os.getpid()print("Child %s listening on localhost:4242" % childpid)try:while 1:# This is where the magic happens. accept(2)# blocks until a new connection is ready to be# dequeued.conn, addr = acceptor.accept()# For easier use, turn the socket connection# into a file-like object.flo = conn.makefile()flo.write('Child %s echo> ' % childpid)flo.flush()message = flo.readline()flo.write(message)flo.close()conn.close()print("Child %s echo'd: %r" % (childpid, message.strip()))except KeyboardInterrupt:sys.exit()# Sit back and wait for all child processes to exit.
#
# Trap interrupts, write a note, and exit immediately in
# parent. This trap is not inherited by the forks because it
# runs after forking has commenced.
try:os.waitpid(-1, 0)
except KeyboardInterrupt:print("\nbailing")sys.exit()

Perl實(shí)現(xiàn)代碼

#!/usr/bin/perl
use 5.010;
use strict;
# simple preforking echo server in Perl
use Proc::Fork;
use IO::Socket::INET;sub strip { s/\A\s+//, s/\s+\z// for my @r = @_; @r }# Create a socket, bind it to localhost:4242, and start listening.
# Runs once in the parent; all forked children inherit the socket's
# file descriptor.
my $acceptor = IO::Socket::INET->new(LocalPort => 4242,Reuse => 1,Listen => 10,
) or die "Couln't start server: $!\n";# Close the socket when we exit the parent or any child process. This
# only closes the file descriptor in the calling process, it does not
# take the socket out of the listening state (until the last fd is
# closed).
END { $acceptor->close }# Fork you some child processes. The code after the run_fork block runs
# in all process, but because the child block ends in an exit call, only
# the parent executes the rest of the program. If a parent block were
# specified here, it would be invoked in the parent only, and passed the
# PID of the child process.
for (1.. 3) {run_fork { child {while (1) {my $socket = $acceptor->accept;$socket->printflush("child $$ echo> ");my $message = $socket->getline;$socket->print($message);$socket->close;say "child $$ echo'd: '${\strip $message}'";}exit;} }
}# Trap (Ctrl-C) interrupts, write a note, and exit immediately
# in parent. This trap is not inherited by the forks because it
# runs after forking has commenced.
$SIG{'INT'} = sub { print "bailing\n"; exit };# Sit back and wait for all child processes to exit.
1 while 0 < waitpid -1, 0;

PHP實(shí)現(xiàn)代碼

<?php
/*
Simple preforking echo server in PHP.
Russell Beattie (russellbeattie.com)
*//* Allow the script to hang around waiting for connections. */
set_time_limit(0);# Create a socket, bind it to localhost:4242, and start
# listening. Runs once in the parent; all forked children
# inherit the socket's file descriptor.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket,'localhost', 4242);
socket_listen($socket, 10);pcntl_signal(SIGTERM, 'shutdown');
pcntl_signal(SIGINT, 'shutdown');function shutdown($signal){global $socket;socket_close($socket);exit();
}# Fork you some child processes. In the parent, the call to
# fork returns immediately with the pid of the child process;
# fork never returns in the child because we exit at the end
# of the block.
for($x = 1; $x <= 3; $x++){$pid = pcntl_fork();# pcntl_fork() returns 0 in the child process and the child's# process id in the parent. So if $pid == 0 then we're in# the child process.if($pid == 0){$childpid = posix_getpid();echo "Child $childpid listening on localhost:4242 \n";while(true){# This is where the magic happens. accept(2)# blocks until a new connection is ready to be# dequeued.$conn = socket_accept($socket);$message = socket_read($conn,1000,PHP_NORMAL_READ);socket_write($conn, "Child $childpid echo> $message");socket_close($conn);echo "Child $childpid echo'd: $message \n";}}
}#
# Trap interrupts, write a note, and exit immediately in
# parent. This trap is not inherited by the forks because it
# runs after forking has commenced.
try{pcntl_waitpid(-1, $status);
} catch (Exception $e) {echo "bailing \n";exit();
}

Haskell實(shí)現(xiàn)代碼

import Network
import Prelude hiding ((-))
import Control.Monad
import System.IO
import Control.Applicative
import System.Posix
import System.Exit
import System.Posix.Signalsmain :: IO ()
main = with =<< (listenOn - PortNumber 4242) wherewith socket = doreplicateM 3 - forkProcess workwaitwherework = doinstallHandler sigINT (Catch trap_int) Nothingpid <- show <$> getProcessIDputs - "child " ++ pid ++ " accepting on shared socket (localhost:4242)"forever - do(h, _, _) <- accept socketlet write   = hPutStr hflush   = hFlush hgetline = hGetLine hclose   = hClose hwrite - "child " ++ pid ++ " echo> "flushmessage <- getlinewrite - message ++ "\n"puts - "child " ++ pid ++ " echo'd: '" ++ message ++ "'"closewait = forever - do( const () <$> getAnyProcessStatus True True  ) `catch` const trap_exittrap_int = exitImmediately ExitSuccesstrap_exit = doputs "\nbailing"sClose socketexitSuccessputs = putStrLn(-) = ($)infixr 0 -

如果你知道更多相關(guān)內(nèi)容,請(qǐng)告訴我們。(全文完)


C 語(yǔ)言的演變史

2009 年 12 月 21 日 陳皓

1972 – C 語(yǔ)言的先驅(qū) ——B 語(yǔ)言,被貝爾實(shí)驗(yàn)室開(kāi)發(fā)。B 語(yǔ)言是一個(gè)很快速的,容易維護(hù)的,而且對(duì)于從系統(tǒng)到應(yīng)用開(kāi)發(fā)是很好用的。設(shè)計(jì)這門(mén)語(yǔ)言的整個(gè)團(tuán)隊(duì)被馬上解雇了,因?yàn)樗麄兏闪艘患碗娫捦ㄓ嵅幌喔傻氖虑?。最后這個(gè)項(xiàng)目轉(zhuǎn)給了 Dennis Ritchie。他把這個(gè)語(yǔ)言變得不容易理解,很難維護(hù),而且,只能用于系統(tǒng)方面的編程。而且,他還設(shè)計(jì)了一個(gè)指針系統(tǒng),保讓每一個(gè)程序都超過(guò) 500 行,并可以使用操作系統(tǒng)的指針。

1982 – 大家發(fā)現(xiàn)有 97% 的 C 程序調(diào)用產(chǎn)生了 “緩沖區(qū)溢出” 問(wèn)題。于是,C 程序員們開(kāi)始意識(shí)到,就算是不必要也必需要初始化變量。然而,強(qiáng)制性的變量初始化這個(gè)明智的決定,很難影響了當(dāng)時(shí)已經(jīng)寫(xiě)成了的 97% 的 C 程序,所以結(jié)果什么也沒(méi)有發(fā)生。

1984 – 操作系統(tǒng)出現(xiàn)了 “錯(cuò)誤指針” 的問(wèn)題數(shù)量開(kāi)始戲劇性地增漲。

1985 – 一系列的讓 C 語(yǔ)言有面向?qū)ο竽芰Φ慕鉀Q方法出現(xiàn)了,一個(gè)叫 “C With Classes” 正準(zhǔn)備商業(yè)化。然而,大家覺(jué)得名字 “C With Classes” 太清楚和容易被理解了,所以,最終的商業(yè)版本叫做 —— C++。

1986 – C 語(yǔ)言成為最流行的語(yǔ)句,其被很多業(yè)界分析師推薦于業(yè)務(wù)應(yīng)用。他們向全世界宣稱 —— 由 C 語(yǔ)言寫(xiě)成的應(yīng)用將可以運(yùn)行在很多不同的平臺(tái)上的,是跨平臺(tái)的。目前看來(lái),這些眾多的分析者在當(dāng)時(shí)有可能是因?yàn)槟撤N迷幻而導(dǎo)致其大腦被所蠱惑了。

1988 – 業(yè)界的這些分析家們因?yàn)?“搖頭丸” 吃完了。所以,在他們的幻覺(jué)過(guò)去以后,他們注意到,使用 C 語(yǔ)言來(lái)開(kāi)發(fā)業(yè)務(wù)應(yīng)用會(huì)增加 5 倍以上的開(kāi)發(fā)時(shí)間,并且程序也不具備可移植性。他們開(kāi)始停止向大眾推薦使用 C 語(yǔ)言來(lái)開(kāi)發(fā)業(yè)務(wù)應(yīng)用了,只能很少一部服用可卡因的人開(kāi)始轉(zhuǎn)向推薦大眾使用 C++ 語(yǔ)言寫(xiě)業(yè)務(wù)應(yīng)用程序,他們說(shuō),“那是面向?qū)ο蟮?#xff0c;所以,代碼是很容易重用的”。

1990 – 在這個(gè)時(shí)候,所有的 C 編譯器都轉(zhuǎn)到了 C++ 編譯器上。但是,因?yàn)榇蠖鄶?shù)的 C++ 程序員并沒(méi)有使用 C++ 中那些面向?qū)ο蟮恼Z(yǔ)言特性。也就是說(shuō),在實(shí)際上來(lái)說(shuō),那種浮腫的代碼結(jié)構(gòu)加上操作系統(tǒng)指針的代碼被一種叫面向?qū)ο蟮木幾g器編譯。

1990 – 在雇傭了一些轉(zhuǎn)向 “吸膠毒” 的分析師后,Sun 決定要?jiǎng)?chuàng)造一種叫 Oak 的語(yǔ)言,這種語(yǔ)言主要用于電視的機(jī)頂盒。因?yàn)楫?dāng)時(shí)幾乎所有的程序員的 DNA 中都有 C 語(yǔ)的基因,所以,這個(gè)語(yǔ)言向 C 和 C++ 中大量地借鑒了很多它們的語(yǔ)法和編程思路。然而,機(jī)頂盒上沒(méi)有操作系統(tǒng),也就不存在指針,所以,他們把指針從這門(mén)語(yǔ)言里給去掉了。

1994 – Sun 公司里的某個(gè)人意識(shí)到為一個(gè)機(jī)頂盒開(kāi)發(fā)一個(gè)語(yǔ)言是多么愚蠢的事情。于是,這個(gè)語(yǔ)言更名為 Java,并且為其注入了 “Internet” 的特征,從而讓其成為一個(gè)真正可以被移植的語(yǔ)言。其市場(chǎng)營(yíng)銷上相當(dāng)成功,而那時(shí)有 3% 的業(yè)內(nèi)人士開(kāi)始明白什么是 Internet,同時(shí),那些精神不正常的分析師們還在不停地嗑藥并向大眾鼓吹他們的神話 ——“跨平臺(tái)移植性”。

1995 – Sun 向業(yè)界的分析師們提供了免費(fèi)蘑菇迷魂湯,導(dǎo)致那些分析師在喝下湯后,馬上開(kāi)始寫(xiě)下 “Java 是一門(mén)未來(lái)的可移植的和 Ineternet 高度可集成的語(yǔ)言”。

1996 中 – 17,468,972 篇文章出現(xiàn),描述了 Java 是怎么一門(mén)未來(lái)的語(yǔ)言。這也是 Java Applet 開(kāi)始進(jìn)入 Web 頁(yè)的時(shí)代。

1996 末– 程序員開(kāi)始使用 Java applet 創(chuàng)建他們的 Web 頁(yè)面,然后他們開(kāi)始因?yàn)榇煺酆途趩书_(kāi)始集體自殺。此時(shí),那些分析師開(kāi)始增大蘑菇迷魂湯的劑量。

1997 – 因?yàn)榻邮芰水a(chǎn)生幻覺(jué)分析師的建議,Corel 決定重寫(xiě)他們的應(yīng)用,包括 WordPerfect,當(dāng)然,是用 Java 寫(xiě)的。最終的結(jié)果是,這是迄今為止比 “打字機(jī)” 還慢的字處理軟件。

1998 – 在意識(shí)到 applet 已在快速枯萎,Sun 又一次的重新配置了 Java,這次,他們叫 Severlet,這是一個(gè)服務(wù)器的程序語(yǔ)言。這個(gè)設(shè)計(jì)在抄襲了 Microsoft Transaction Server ,并且,他們說(shuō)服所有人這個(gè)設(shè)計(jì)是他們創(chuàng)造的。

1999 – 業(yè)內(nèi)那些喝多了的分析師們用一種咆哮的方式向大眾介紹了 Java 2 Enterprise Edition 。 21,499,512 文章被寫(xiě)出來(lái)。但是,實(shí)際上并沒(méi)有人使用,因?yàn)?J2EE 太不成熟,而又太貴了。

2000 – J2EE 最終還是運(yùn)轉(zhuǎn)起來(lái)了(一點(diǎn)點(diǎn))。而且,所有的 Java 賣主們開(kāi)始準(zhǔn)備向其砸錢,與此同時(shí),Microsoft 宣布了.NET,這是一個(gè)包括了所有的 J2EE 功能但沒(méi)那么貴的產(chǎn)品。實(shí)際上來(lái)說(shuō), Microsoft 決定讓 Windows 的用戶免費(fèi)使用.NET 。 Scott McNealy 很憤怒,其對(duì) Microsoft 開(kāi)展了相關(guān)的法律訴訟。

.NET 包括了最新的 C 家族語(yǔ)言,叫 C#,發(fā)音是 “C-pound”,繼承最家族的傳統(tǒng),使用著一個(gè)愚蠢的名字。

2001 – Microsoft 的市場(chǎng)部意識(shí)到,在市面上沒(méi)有人談?wù)撍麄兊漠a(chǎn)品,他們找了其中一個(gè)程序員一起吃中飯,才發(fā)現(xiàn),他們把 C# 叫做 “C sharp”。

2002 – C# 成為 Microsoft .NET 的一部分。 C++ 的開(kāi)發(fā)者在 Microsoft 平臺(tái)上為 “managed code” 而歡呼雀躍,也就是說(shuō),他們最終得到了一個(gè)內(nèi)存自動(dòng)管理的功能,這一功能正是 1991 年的 Visual Basic 及 1995 年的 Java 所創(chuàng)建的 。

copyright ? 1996-2006 by Billy S. Hollis, originally posted on dotnetmasters.com 13 January 2006


via:

  • Unix 傳奇 (上篇) | 酷 殼 - CoolShell 2010年04月09日 陳皓
    https://coolshell.cn/articles/2322.html

  • Unix 傳奇 (下篇) | 酷 殼 - CoolShell 2010年04月09日 陳皓
    https://coolshell.cn/articles/2324.html

  • 誰(shuí)寫(xiě)了 Linux | 酷 殼 - CoolShell 2009 年 08 月 25 日 陳皓
    https://coolshell.cn/articles/1360.html

  • Alice夢(mèng)游UNIX仙境 | 酷 殼 - CoolShell 2009 年 09 月 19 日 陳皓
    https://coolshell.cn/articles/1439.html

  • 到處都是 Unix 的胎記 | 酷 殼 - CoolShell 2009 年 10 月 11 日 陳皓
    https://coolshell.cn/articles/1532.html

  • C 語(yǔ)言的演變史 | 酷 殼 - CoolShell 2009 年 12 月 21 日 陳皓
    https://coolshell.cn/articles/1984.html

http://www.risenshineclean.com/news/8064.html

相關(guān)文章:

  • 做企業(yè)網(wǎng)站需要買什么搜索推廣開(kāi)戶
  • 做任務(wù)反傭金的網(wǎng)站怎樣才能上百度
  • 深圳西鄉(xiāng)建網(wǎng)站廣州抖音seo公司
  • 北京公司網(wǎng)站制作公司短網(wǎng)址在線生成
  • 各大網(wǎng)站官網(wǎng)的導(dǎo)航欄怎么做成品網(wǎng)站貨源1
  • 泰興做網(wǎng)站谷歌google下載
  • 期刊網(wǎng)站建設(shè)企業(yè)培訓(xùn)課程安排表
  • 重慶交通建設(shè)集團(tuán)有限公司網(wǎng)站seo排名點(diǎn)擊器
  • 安裝了兩個(gè)wordpress北京搜索引擎優(yōu)化
  • 購(gòu)物幫做特惠的網(wǎng)站seo01網(wǎng)站
  • 電腦上怎么安裝wordpress靖江seo要多少錢
  • 杭州房產(chǎn)網(wǎng)二手房seo蜘蛛屯
  • 國(guó)外旅游網(wǎng)站模板下載百度指數(shù)關(guān)鍵詞未收錄怎么辦
  • 網(wǎng)站開(kāi)發(fā)常用哪幾種語(yǔ)言百度搜索排行seo
  • 做養(yǎng)生網(wǎng)站怎么樣百度手機(jī)助手
  • 資質(zhì)辦理如何提升網(wǎng)站seo排名
  • 高端網(wǎng)站建設(shè)公司增長(zhǎng)寧波seo怎么做引流推廣
  • 阿里云怎么做網(wǎng)站時(shí)事新聞最新消息
  • 天津做網(wǎng)站找津坤科技網(wǎng)絡(luò)推廣外包注意哪些
  • 怎么用h5網(wǎng)站做動(dòng)效大學(xué)生網(wǎng)頁(yè)制作成品模板
  • 視頻類網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn)競(jìng)價(jià)推廣托管公司價(jià)格
  • 網(wǎng)站做淘寶推廣收入seo哪家強(qiáng)
  • 瑪伊網(wǎng)站做兼職加入要多少錢廈門(mén)最快seo
  • 怎么樣做網(wǎng)站的目錄結(jié)構(gòu)友情鏈接買賣代理
  • 使用mvs2010做網(wǎng)站營(yíng)銷型網(wǎng)站建設(shè)案例
  • 長(zhǎng)葛網(wǎng)站制作成功的品牌推廣案例分析
  • 一個(gè)做女性服裝批發(fā)的網(wǎng)站_最好的關(guān)鍵詞選擇是百度seo價(jià)格
  • 站酷網(wǎng)頁(yè)版廣州網(wǎng)站排名優(yōu)化報(bào)價(jià)
  • 美圖秀秀可以做網(wǎng)站嗎昆明新聞?lì)^條最新消息
  • 上海市建設(shè)工程招標(biāo)造價(jià)網(wǎng)站百度搜索排名與點(diǎn)擊有關(guān)嗎