- 論壇徽章:
- 0
|
[轉帖]李維和寶蘭的故事
Symantec C/C++的發(fā)展史
說起這兩個對手也都是個個來頭不小,先說Symantec C/C++吧。它的Think C/C++ 在Macintosh上便是非常有名的編譯器,因此早在C/C++領域便有深厚的基礎。在 Symantec并購了PC上第一個C/C++編譯器Zortech C/C++之后,Symantec進入PC的開發(fā)工具市場也是箭在弦上了,只可惜的是其時Symantec還未找到一個在PC上有豐富經(jīng)驗的開發(fā)工具領導者。
也許是上天注定要引起稍后的C/C++編譯器大戰(zhàn)吧,此時Borland C/C++ 3.1的幕后支柱Eugene Wang剛好和Philippe Kahn鬧翻,離開了Borland。Symantec見此時不可失,立刻重金延攬Eugene Wang到Symantec,為Symantec推出第一個C/C++開發(fā)工具。在1993年左右吧,Symantec C/C++在Eugene Wang的掌舵之下推出了第一個 Symantec C/C++版本,立刻便獲得了市場的好評。自此之后Symantec C/C++軍心大振,不斷的繼續(xù)改善,也逐漸的獲得了不小的C/C++市場,隱然成為可以對抗 Borland C/C++,Visual C/C++的另一山頭。當時Symantec C/C++是以最華麗,先進的整合發(fā)展環(huán)境獲得市場的高度認同,在C/C++編譯器最佳化方面的表現(xiàn)也不會輸給其它的編譯器。
當時我在RUN!PC上寫C/C++的文章,因此Symantec C/C++也有和我連絡,并且送給我一套最高檔的Symantec C/C++,希望我除了為Borland寫C/C++的文章之外,也能夠為Symantec C/C++寫一些東西,我想這就是做為寫技術文章的一個好處之一,那就是可以拿到許多最Hot的開發(fā)工具。我還記得在當時安裝Symantec C/C++之后,的確被它的整合發(fā)展環(huán)境吸引的說不出話來,因為實在是太棒了,Borland C/C++ 和Visual C/C++的整合發(fā)展環(huán)境和Symantec C/C++的整合發(fā)展環(huán)境比較起來,立刻的就變成索然無味,平凡無奇了,到現(xiàn)在我仍然必須豎起大拇指對Symantec C/C++的整合發(fā)展環(huán)境說聲『贊』。我想Eugene Wang在這么短的時間內(nèi)把Symantec C/C++打造的好此之好,除了證明他的不凡功力之外,也有向Philippe Kahn示警的意思。證明Philippe Kahn讓他離開Borland是錯誤的決定。我之所以如此說是因為其時Symantec C/C++最喜歡點名挑戰(zhàn)的對象便是Borland C/C++了。對我的感覺而言,Symantec C/C++就像是一個技藝精良,又裝備華麗的C/C++軍團。
Watcom C/C++的發(fā)展史
真是非常有趣的是,Watcom C/C++走的路子和Symantec C/C++幾乎是完全相反的。當時出品Watcom C/C++編譯器的是一家加拿大的小公司,不過這家公司卻對最佳化編譯器有深入的研究。當時Watcom C/C++是以在DOS下能夠產(chǎn)生最好的最佳化程序代碼聞名于世的,在其時有許多寫游戲和DOS Extender的廠商都是指名要使用 Watcom C/C++,因為不論是Borland C/C++或是Visual C/C++產(chǎn)生的最佳化程序代碼都比Watcom C/C++的最佳化程序代碼差上一截。再加入當時最有名的DOS Extender廠商PharLap公司也是使用Watcom C/C++,因此Watcom C/C++在專業(yè)的 C/C++程序員以及系統(tǒng)程序員心中是第一品牌的C/C++開發(fā)工具。
不知道還有多人記得PharLap這家公司,或是有沒有人記得Andrew Schulman這位偉大的軟件技術人員。當時Andrew Schulman的Undocumented Windows一書紅遍了半邊天,也惹得Microsoft要告Andrew Schulman。而Andrew Schulman便是PharLap公司的首席工程師,也是當時最著名的『The ANDREW SCHULMAN Programming Series』的總監(jiān),例如當時由Matt Pietrek撰寫的Windows Internals也是轟動一時的巨著。而PharLap公司是當時出版DOS Extender軟件最成功的軟件公司。談到Matt Pietrek,熟悉Window Programming的人應該很少有不知這位大師級人物的。Matt長期在Microsoft System Journal撰寫Under The Hood專欄,專門寫一些深入系統(tǒng)的程序設計技術,在數(shù)年前便和Andrew Schulman,David Maxey成為 Widow System Programming的三大巨頭之一。Matt也是著名的Window除錯工具 SoftIce,BoundsChecker的主要研發(fā)工程師。Matt本身也是從Borland出道的,當 Matt初至Borland工作時便是在Turbo Debugger小組中研發(fā)除錯工具。當時 Borland的Turbo Debugger是DOS下最強的除錯工具,即使是Microsoft也無法推出能夠和Turbo Debugger抗衡的除錯工具。Matt在這個小組中吸收了大量的知識,并且快速的成為這個領域的專家。后來Turbo Debugger小組的部份成員被Microsoft 挖走,讓Microsoft掌握了Borland的核心除錯技術,以致后來也能夠推出不錯的除錯工具。而Matt也出走到NuMega公司成為開發(fā)SoftIce,Bounds Checker的關鍵人物。寫到這里還是不禁要佩服Borland,因為當今許多名滿天下的重量級軟件工程師都是由Borland培養(yǎng)出來的。
在Watcom C/C++于DOS市場占穩(wěn)了腳步之后,由于Window已經(jīng)逐漸成為市場的主流,DOS勢必將被逐漸淘汰出局,因此Watcom C/C++要繼續(xù)的生存下去,也一定要推出Window平臺的C/C++開發(fā)工具。大約也是在1993,1994年左右Watcom終于推出第一個Window的開發(fā)工具。
不過當時Watcom C/C++在Window推出的C/C++開發(fā)工具實在是平凡不已,其整合發(fā)展環(huán)境和另外三個對手比較起來簡直像是遠古的產(chǎn)品,一點特色都沒有,不過 Watcom C/C++仍然是以它的最佳化編譯器做為號召。因此在當時發(fā)生了一個非常有趣的現(xiàn)象,那就是許多軟件公司會同時買Borland C/C++,或是Visual C/C++, Symantec C/C++之一,再搭配一套Watcom C/C++。在開發(fā)應用系統(tǒng)時使用其它三套開發(fā)工具之一,最后要出貨時再使用Watcom C/C++來編譯以產(chǎn)生最佳的程序代碼。在Watcom C/C++推出了Window平臺的開發(fā)工具之后,仍然吸引了一群使用者,雖然 Watcom C/C++的市場比起其它的三家來說是最小的,但是也在一方撐起了一片天,成為四大C/C++開發(fā)工具之一。稍后Watcom C/C++被Sybase并購,并且成為后來 Sybase的Optima++的前身。
對我的感覺而言,Watcom C/C++就像是一個穿著樸素,但是卻擁有最佳訓練的白色 C/C++軍團。
關鍵的時刻-MFC Or Not
在Symantec C/C++和Watcom C/C++逐漸的站穩(wěn)了腳步之后,四大編譯器決戰(zhàn)的時刻也逐漸逼近了。在1994年未的決戰(zhàn)之前,Symantec和Watcom同時面對了一個非常嚴厲的考驗,那就是C/C++ Framework的選擇。
雖然Symantec和Watcom都以各自的特色占得了市場,不過在當時對于一個C/C++開發(fā)工具來說,最重要的因素之一就是C/C++ Framework。因此Symantec和Watcom也都必須提供使用者一套C/C++ Framework。不過這對于Symantec和Watcom都是一個難以解決的問題,因為當時的C/C++ Framework已由Borland的OWL和Microsoft的 MFC所占領,如果要自己發(fā)展新的C/C++ Framework,那么Symantec和Watcom并沒有如此雄厚的資源,也無法在短時間之內(nèi)完成。因此Symantec和Watcom必須下一個決定到底是要使用MFC或是OWL做為它們的開發(fā)工具C/C++ Framework。
在1993年初Symantec和Watcom分別和Microsoft簽約License MFC做為它們的開發(fā)工具的C/C++ Framework。至此大勢以定,在C/C++ Framework的市場已經(jīng)形成三家夾擊一家的形式。當時許多人便預估Borland將成為輸家,因為市場已經(jīng)成為一面倒,MFC看起來已經(jīng)是勝券在握了。在當時于Borland的內(nèi)部也展開了激烈的辯論,討論是否也要License MFC做為C/C++的Framework,停止繼續(xù)開發(fā)OWL。不過后來 Borland還是決定繼續(xù)開發(fā)OWL,而不使用MFC,因為Borland的C/C++技術小組認為 MFC不論是在架構上或是設計上都比不上OWL。而且由于Visual C/C++在當時對于 C/C++的標準支持不如Borland C/C++,因此在MFC內(nèi)部使用了大量的Macro以及不標準的語法,因此如果Borland C/C++要使用MFC,那么還需要修改編譯器來編譯MFC 。
對于這一點我認為Borland還是做了一個正確的決定,因為如果當時Borland也 License MFC,那么不但在氣勢上便輸了一截,而且當MFC的發(fā)展是完全掌握在 Microsoft的手里,那么就等于脖子是掐在別人的手里,動彈不得了?上У氖 Symantec和Watcom并沒有看清這一點,以為有了和Microsoft一樣的Framework,就可以在其它地方和Microsoft以及Borland一決雌雄,Symantec和Watcom卻沒有想就是這一點決定讓后來的決戰(zhàn)一敗涂地,終究完全推出PC的C/C++開發(fā)工具市場。時序到了1994年未,C/C++開發(fā)工具的四大天王決戰(zhàn)的日子終于愈來愈近了。
OLE的攪局
不知道是時運不濟或是Microsoft的刻意如此,在1994年Borland C/C++和Visual C/C++決戰(zhàn)的前夕,Microsoft推出了OLE(Object Linking And Embedding)技術。 OLE是Microsoft為了對抗Apple的文件技術以及IBM OS2的Workplace和文件技術應運而生的。OLE可以讓Window平臺的文件能夠內(nèi)嵌在不同的應用程序中并且能夠讓文件在應用程序中被即地編輯(In-Place Editing)。說實在的,Microsoft的OLE和 Apple以及IBM的技術比較起來實在是差多了,OLE在稍后也被證明是失敗的技術,不過不管是Microsoft的OLE或是Apple/IBM的文件技術也都是失敗的技術,都沒有造成巨大的成功。雖然這些文件技術都沒有成功,但是OLE卻足以成為Borland, Symantec和Watcom失敗的重要因素。
我還記得當時OLE似乎成為了一個令人趨之若鶩的時髦功能,因為Word的文件能夠內(nèi)嵌在Excel之中,并且可以點選此Word文件,應用程序又立刻成為Word來編輯它,實在是令人覺得非常的神奇。不過在其時所有的軟件廠商中只有Microsoft的應用程序有如此的功能,其它的廠商例如Lotus,WordPerfect等都無法實作出這種功能。這造成了不公平的競爭,因為OLE技術是由操作系統(tǒng)廠商Microsoft推出的,但是卻讓它的應用程序部門同步擁有這種技術,而其它的軟件廠商都無法獲得第一手的OLE技術來實作,這是為什么當時其它的軟件廠商如此火大的原因。
雖然后來其它的軟件公司在取得了OLE的技術信息之后也推出了具備OLE功能的應用程序,但是畢竟是慢了Microsoft許久,市場也流失了許多。不過我也很奇怪的是在當時內(nèi)建OLE功能的應用程序之中,幾乎所有的軟件廠商推出的應用程序在激活數(shù)個應用程序而且使用OLE之后,就非常容易的當?shù),只有Microsoft的應用程序不太會發(fā)生這種情形,因此許多人便認為Microsoft有隱瞞一些技術沒有讓其它的廠商知道。
由于OLE是如此的復雜,因此Borland無法立刻在OWL之中實作出這種功能,于是就造成了市場上負面的影響。至于Symantec和Watcom雖然是License MFC,但是在其時它們License的是MFC 1.x的版本,Microsoft并沒有把OLE實作在MFC 1.x中,而是在實作在MFC 2.0之中。在MFC 2.0推出時最重要的功能就是Microsoft加入了 20000多行支持OLE的程序代碼,但是MFC 2.0卻僅限于Visual C/C++使用,就是這關鍵的一點讓其它三家廠商吃了虧。
對于OLE這個關鍵技術的影響,Borland是深知在心的,因此在計劃在Borland C/C++ 4.5的OWL 2.5中支持OLE。當時Borland推出的解決方案便是OCF(Object Component Framework)。
Borland當初在設計OCF時有幾個重大的目標。這些目標包括了: 一、如何能夠使得 OLE瑣碎 、復雜的接口能夠單純化; 第二、如何能夠使得OLE在窗口環(huán)境下寫程序的思考方式 一致化--即使用「事件驅動」的方法。第三、如何能夠在微軟占盡天時、地利(未必人和) 的情況下使得Borland的產(chǎn)品具備OLE的功能。第四、如何能夠讓大多數(shù)C++的程序員都能夠享受OLE的功能而不局限于OWL的程序員。由于上述的設計目標, 而造就了典雅而具有彈 性的OCF。由于OCF本身是一完整而獨立的 Framework, 因此它可適用于各種應用程序發(fā)展Framework。
不曉得各位使用過Borland C/C++的朋友們是否還依稀記得下圖OCF的架構圖之一,以及下面的OCF范例程序代碼,這些可是我把1994年寫的文章挖出來之后找到的,真是令我感慨,也回想起了當時的情景,也讓各位回憶一下OWL和OCF。對于不熟悉 OWL和OCF的朋友,也可以從下圖和程序代碼中觀察一下當時的技術以及設計的概念。
基本上我現(xiàn)在看這些圖形架構,會發(fā)現(xiàn)它們并沒有落后現(xiàn)在太多,可見當時設計者的功力(Carl Quinn Again)。 // // Insert an OLE object into the view // void TOleWindow::CmEditInsertObject() { 001 PRECONDITION(OcView); 002 TOcInitInfo initInfo(OcView); 003 if (OcApp->;Browse(initInfo)) { 004 TRect rect; 005 GetInsertPosition(rect); 006 SetSelection(new TOcPart(*GetOcDoc(), initInfo, rect)); 007 OcView->;Rename(); 008 InvalidatePart(invView); } } 程序1 OWL的TOleWindow支持OLE插入對象之成員函數(shù) // // Handle left double-click message // void TOleWindow::EvLButtonDblClk(uint modKeys, TPoint& point) { PRECONDITION(GetOcDoc() && GetOcView()); TOleClientDC dc(*this); dc.DPtoLP(&point); TOcPart* p = GetOcDoc()->;GetParts().Locate(point); if (modKeys & MK_CONTROL) { if (p) p->;Open(true); // Ctrl key forces open editing } else { SetSelection(p); if (p && p == GetOcView()->;GetActivePart()) { // resync the active flag p->;Activate(false); } GetOcView()->;ActivatePart(p); // In-place activation } } 程序2 OWL的TOleWindow支持左鍵雙擊之成員函數(shù)
雖然Borland及時的在OWL 2.5中加入了OLE的支持,無奈Microsoft隨后又在OLE中加入了許多其它的功能,因此讓OCF并無法完整的支持OLE所有的功能,B無 |
|