歷史上出現過的主流C/C++ 編譯器都有哪些?
來講個比較冷門的故事吧,大概發生在1985年前後,那時候我還沒出生。
喬布斯剛帶著蘋果搞出來了他們的第一台個人電腦,Macintosh。Machintosh的application編程全部是由pascal完成的。喬布斯看著這個電腦很開心,於是就到當時各個做軟體的公司去遊說,說你們看我這電腦有GUI喲!是不是帥帥的?你們把你們的軟體也一直到我的電腦上吧!當時的Machintosh看起來確實很新奇,但是也很陌生,於是他們就說,行吧我們可以試試,那你把你們的C compiler給我們,我們移植一下。
喬布斯:我們是用pascal的。
程序員們:What?
喬布斯:你們要把你們的程序用pascal重新寫一遍,然後再移植到我們的電腦。
程序員們:走好不送。
於是喬布斯發現,他需要一個可以用在Macintosh上的C compiler。他在開會的時候提到這個事情,於是有一個員工說:我知道有一家公司做C compiler,要不要給你介紹一下?
於是,Dan O"Dowd和他的partner被找來,坐在了喬布斯面前。
喬布斯:我們需要個C compiler。
Dan:好呀,我能做,我要X刀。
喬布斯:太貴了。
Dan:哦,拜拜。
喬布斯:好吧,就這麼多吧。
於是Dan O"Dowd和他的Green Hills Software完成了Macintosh上的第一個C compiler。這是個非常有挑戰性的項目,因為那時候的Macintosh只有1個軟盤插槽,沒有內置的任何硬碟空間。所以要先把Compiler的軟盤插進去,load到內存里,然後拔出來,把程序插進去,再用已經在內存里的Compiler去編譯。而那時候的內存只有,恩,128K。Dan O"Dowd說,哥們這不太靠譜啊。於是後來Macintosh的內存被加到了512K。
恩,故事的正文到這裡就結束了,不過還有個尾聲。
Green Hills Software存活到了今天,成為了做Embedded System Compiler最大的Private Company。GHS Compiler和他的IDE MULTI, OS INTEGRITY一起,被廣泛地使用到safety critical, performance critical的汽車軍工、航空航天、醫療器械等領域。
2014年2月,公司迎來了史上非常重要的一個時刻,就是我入職啦~然後在某一年onsite招聘的時候,公司的現任CEO Dan O"Dowd先生在飯桌上給我們講了這個有趣的故事~我就講C++編譯器吧,純屬個人在這裡瞎扯淡。
最開始的C++編譯器是CFront,由C++之父Bjarne在1982年春到1983年夏完成,而直到1988年6月前,幾乎所有的C++編譯器都是CFront的移植版本。很多人認為Borland C++與VC++算真正意義的首先非CFront的C++編譯器實現,而Bjarne在他書寫的C++歷史中,認為Zortech才算,而Zortech也後面被Symantec收購。
而90年代初,則出現了井噴式的C++編譯器。- 1990年5月,Borland發布了Borland C++;
- 1992年2月,DEC發布了他們獨立開發的C++編譯器
- 1992年3月,Microsoft發布了VC++;
- .......
而在這當中,最出名的莫過於 C/C++聖戰,或者更直白的說是編譯器聖戰,幾大主角是Borland C++, Microsoft C++, Watcom C++, Symantec C++。該聖戰在Borland傳奇這本書裡面有非常精彩的描述,章節名就是赤裸裸的「C/C++聖戰「,註解是「在慘烈的、大規模的C/C++戰役中,註定只有最強者才能生存下來「。
那麼我簡單的描述一下該聖戰吧,盡量縮短一點,確實非常有意思。
在該聖戰中,首先是Borland公司的Borland C++ 3/3.1的幕後支柱Eugene Wang與Philippe Kahn(Borland CEO)鬧翻,然後Symantec立馬花大錢把Wang招至麾下,隨後在1993年推出Symantec C/C++,然後立即獲取市場好評。而Symantec C/C++也繼續改良,逐步擴大市場佔有率,大有與Borland,Microsoft三足鼎立之勢。而Wang更是代表Symantec點名針對Borland,向Kahn示威,證明讓我走是你做出的最大錯誤決定,而此時的Symantec C++就如同豪華軍師。然而聖戰的最後一位Watcom C++則並非豪華軍師,只是一個加拿大小公司,但是他引以為傲的是聞名於世的最佳優化代碼,所以在一些C/C++程序員眼中Watcom C++才是最佳選擇。然而,Watcom的問題在於其最佳優化存在的世界是DOS,那時候Windows已經來臨,DOS淘汰是必然的。於是Watcom也適機推出Windows版本的Watcom C++,然而讓人大跌眼鏡的是其開發工具鏈與對手相比猶如遠古時期的東西,所以那時候非常流行買其它C/C++編譯器,最後要發版本了再用Watcom編譯一次。那麼,在Windows時代,還有一個重要的東西,就是C/C++框架的支持,這時候有兩方代表:Borland的OWL,Microsoft的MFC。Symantec與Watcom最後「投靠」了Microsoft,簽訂了MFC授權。Borland在考慮以後,傲氣的繼續選擇自己的OWL。然而,Symantec與Watcom比較naive,選擇了MFC,則意味著把所有的命運寄托在了Microsoft手上,哪裡還有他們想的在其它方面脫穎而出,這也是他們最後黯然退出舞台的關鍵因素。
時間來到1994年,真正要決戰的前夕。Microsoft發布了OLE技術,這項技術可以讓Word嵌入到Excel中。而這項技術在當時如此的吊炸天,所以其它公司也想做,然而在即使拿到了OLE技術資料後,其餘公司做出來的程序也容易死機,只有Microsoft的不會。WTF,所以其它公司就說Microsft隱藏了一些技術秘密。雖然很多人後面評價OLE技術不是一個成功的技術,然而這卻是聖戰成敗的關鍵因素......
時間來到1994年末,最後的C/C++大戰。Borland推出了最後的決戰產品Borland C/C++ 4.5(代表色是藍色),Microsoft Visual C++ (with MFC 2.0) (代表色是紅色),Symantec C++ (代表色是花色),Watcom C++ (代表色是白色)。而Symantec C++與Watcom C++首先就敗下陣來,因為他們首先發現自己和Microsoft簽署的是MFC 1.X版本,而OLE技術卻是在MFC 2.0中,並且MFC 2.0僅限於Visual C++使用,然而那時候的程序幾乎都需要支持OLE。所以,Symantec C++與Watcom C++簡直是被Microsoft直接坑死,毫無反抗之力。然後Symantec立馬扭頭就走,轉去開發Java工具,即Visual Cafe。而Watcom則是被Sybase收購,直接消失。Borland C++則是利用其OCF技術苦苦支撐了一段時間後,依然GG。經過此役後,Microsoft基本上掃清了所有的敵人,把握住了超過50%的市場佔有率。而在大戰結束之後,IBM來了,推出了IBM VisualAge C/C++,然而很遺憾,並未掀起市場的任何波瀾,而IBM VisuaAge C/C++後來也被更名為了XL C/C++......
而其實有關C/C++編譯器戰爭雖然沒有90年代的那麼激烈,卻依然一直都存在。在Linux平台下,目前的Clang與GCC則依然是強烈的競爭關係,而IBM的XL C/C++目前則在13.2版本全面擁抱Clang,在Linux平台借著Clang的東風繼續與GCC剛正面......最著名的其中之一當屬殺毒軟體公司Symantec(看那名字就知道原本不做殺毒的)以前做的C++編譯器,還有Watcom做的C++編譯器,曾經都牛逼得不得了。
古時候軟體開發都流行,先用VC++把代碼都debug好了(因為20年前不存在其他好用的debugger,其實現在也是(逃),最後用Watcom的東西擼一把,生成超級快的機器碼。要說主流的C或C++編譯器,那恐怕還得看時代的大背景和運行環境。
GCC/Clang/MSVC這些現在主流的就不提了,其它回答已經覆蓋得很全面。寫點「偏門」一點的。例如說Cray系分離出來的SSI(Supercomputer Systems, Inc.)就有自己的高性能C和Fortran編譯器。
後來SSI團隊被Sun收編,SSI的編譯器技術就融合到了Sun的C/C++/Fortran編譯器里。在Sun OS / Solaris上,Sun Pro / Sun Workshop / Sun Studio里的Sun C/C++/Fortran編譯器是主流。
在一些IBM特有的平台上,XL系列的C/C++/Fortran編譯器是主流。
在HP-UX上,HP aCC是主流編譯器。
現在在Intel平台上,想要跑得快那用Intel ICC是最王道的。
SGI的MIPSPro -&> Pro64 -&> Open64 -&> PathScale這條線也是高度優化的編譯器套件。在某些地方還挺主流的…
NVidia的CUDA Compiler(NVCC)在換用Clang/LLVM之前,用的就是源自SGI MIPSPro的Open64為基礎來開發的。Open64的靈魂現在也還在某些正在進行中的項目中活著 &>_&<嵌入式系統也有各種自己主流的編譯器。
上古時期,C編譯器的絕對主流那不得不提PCC。雖然現在PCC已經式微了,但80年代初C編譯器家族們可都是要麼基於PCC要麼大量參考了PCC的設計的。
微軟早期的Microsoft C/Pascal/Fortran編譯器只是強調是為IBM PC服務的,主要用於DOS和XENIX。它的編譯器前端最初參考了Unix System-V的C編譯器來獲取當時事實上的C語言定義,而這個編譯器正是源自PCC。
微軟的早期C編譯器的後端優化還有源自BLISS編譯器的技術。
Visual C++什麼的都是後話了…然而就算是現在的MSVC,裡面也還留有一些微軟早期C編譯器的痕迹,例如「P1」「P2」之類的名字——外界看到的是c1/c1xx和c2,但源碼結構里還留有P1/P2的名字。Sun的C編譯器的早期版本也是源自PCC的。
話說,想在瀏覽器里跑Linux么?那裡面自帶的C編譯器是Fabrice Bellard大神的TCC。@藍色 的答案很全面了,這裡補充一些八卦。
Borland C++全面潰敗之後,Borland公司里有個天才仍在努力拱C++編譯器。他的老闆很不喜歡他這麼做,希望他轉方向。但他老闆的老闆很喜歡他的工作,希望他繼續努力。有一天,他接到一個電話,Bill Gates親自打的,問他要不要來MS搞C++編譯器。他本來就被壓迫得很不爽,於是衝到老闆辦公室,說老子走了,老子去MS了。他老闆跟他老闆的老闆說,他被挖了,他老闆的老闆說,一個人都留不住,那你被fire了,馬上就滾。
後來,那人出差到MS上海紫竹園區(對,就是@vczh戰鬥過的地方),認識了個前台MM,就吊走了。前幾年他們又調回北京西園區,時不時還能在走廊見到他的身影。
另一個事情。
現在vc也開始擁抱clang。vs2015 update1里的clang+c2就是一個很好的嘗試。vc的前端c1已經千瘡百孔,如果能用clang就能直接獲得各種C++11/14的特性。至於ms擴展的部分,還沒辦法,只能用老的前端編譯。但因為很多擴展現在可以用標準C++來代替,所以更好的做法是一點點把代碼改掉。VC++6.0 with SP6中英文龍捲風完整企業版
在M$世界之外,我玩過的還有 GNU gcc,Intel icc, Green Hills,Sun cc, Apple clang。另外,有個略跑題的是 ch 解釋器。
- 還是打全了比較安全聽說,下雪天,Win10 和turbo C 2.0更配
Turbo C/C++
DOS時代的啟蒙先驅,上古神器。Visual C++
M$出產的編譯器系列。Windows下的事實兼容性標準。6.0版一代經典,至今仍然老而不死,死而不僵,僵而不化地毀人不倦。最新版是2015。現在已經有功能相當完整的免費社區版,唯一的使用限制是超過5人的商業機構不得閉源商用。Borland C++
一代傳奇寶藍的作品,Turbo C/C++的進化版,可惜掩蓋在自家王牌Delphi和外敵Visual C++的光芒之下,遠沒有這兩者的歷史地位高。LCC-Win32
當年偶然發現的小品C編譯器,編譯速度很不錯。不過並未進入過主流。gcc/g++
GNU社區的神作,各大*NIX平台上的編譯器的事實標準。直到近年來clang的興起才開始受到挑戰。clang
最年輕的成員之一,BSD社區的倚天神劍,開發迅速,對標準的支持也相當好,大有挑翻gcc/g++的勢頭。FreeBSD已經將其列為默認編譯器。Intel C++號稱生成的代碼質量最高,優化最到位的C++編譯器。但是有朝AMD的CPU下黑手的案底。變態的 Tiny C Compiler ……
現在還流行於中國各大大學的VC++6.0。-----------------------------其實裝一個Visual Assiant X 也不是不能用啦,除了不能摺疊代碼-.-
曾經有一篇文章叫做C++聖戰。 講的是4大C++編譯器的故事。 不過是Windows平台。
- Microsoft C 6.0
- Turbo C/C++
DOS 環境下的編譯器。
- Microsoft Visual C++ 6.0
至今一些機房裡還能看到其身影,國內經常可以見到「創天中文 VC++ 6.0」等漢化版本。
Tiny C Compiler
建議看Borland傳奇,裡面有詳細說明
推薦閱讀:
※Clang 比 GCC 好在哪裡?
※Partial Evaluation, Constant Propagation, AI的關係是什麼?
※有沒有在 UB 和 ID 上處處和「習慣認知」不同的 C/C++ 編譯器?
※如何將lisp/scheme翻譯成llvm IR,並通過llvm生成機器碼?
※linux下編程,定義數組一多就會崩潰,如何解決?