更新時(shí)間:2021-11-17 18:42:18作者:admin2
C++之父評(píng)論C++與Java如果人們非要拿C++和Java來(lái)作比較,我建議他們?nèi)ラ喿xThe Design and Evolution of C++,看看C++為什么是今天這個(gè)樣子,用我在設(shè)計(jì)C++時(shí)遵從的原則來(lái)檢驗(yàn)這兩種語(yǔ)言。這些原則與SUN的Java開(kāi)發(fā)小組所持的理念顯然是不同的。除了表面語(yǔ)法的相似性之外,C++與Java是截然不同的語(yǔ)言。在很多方面,Java更像Smalltalk。(Sun的培訓(xùn)教材清楚地寫(xiě)道:Java在設(shè)計(jì)上采用了與C++相似的語(yǔ)法,與Smalltalk相似的語(yǔ)義。所以可以說(shuō)Java與C++是貌合神離,與Smalltalk才是心有靈犀。)Java語(yǔ)言相對(duì)簡(jiǎn)單,這部分是一種錯(cuò)覺(jué),部分是因?yàn)檫@種語(yǔ)言還不完整。隨著時(shí)間的推移,Java在體積和復(fù)雜程度上都會(huì)大大增長(zhǎng)。在體積上它會(huì)增長(zhǎng)兩到三倍,而且會(huì)出現(xiàn)一些實(shí)現(xiàn)相關(guān)的擴(kuò)展或者庫(kù)。這是一條每個(gè)成功的商業(yè)語(yǔ)言都必須走過(guò)的發(fā)展之路。隨便分析一種你認(rèn)為在很大范圍內(nèi)取得了成功的語(yǔ)言,我知道肯定是無(wú)有例外者,而且實(shí)際上這非常有道理。 上邊這段話(huà)是在Java 1.1推出之前寫(xiě)的。我確信Java需要類(lèi)似模板的機(jī)制,并且需要增強(qiáng)對(duì)于固有類(lèi)型的支持。簡(jiǎn)單地說(shuō),就是為了基本的完整性也應(yīng)該做這些工作。另外還需要做很多小的改動(dòng),大部分是擴(kuò)展。1998年秋,我從James Gosling(Java語(yǔ)言的創(chuàng)始人)那里得到一份建議書(shū),說(shuō)是要在Java中增加固有類(lèi)型、操作符重載以及數(shù)學(xué)計(jì)算支持。 還有一篇論文,是數(shù)學(xué)分析領(lǐng)域的世界級(jí)大師,伯克利大學(xué)的W. Kahan教授所寫(xiě)的How Java's Floating-Point Hurts Everyone Everywhere(且看Java的浮點(diǎn)運(yùn)算如何危害了普天下的蕓蕓眾生),揭露了Java的一些秘密。我發(fā)現(xiàn)在電視和出版物中關(guān)于Java的鼓吹是不準(zhǔn)確的,而且氣勢(shì)洶洶,讓人討厭。大肆叫囂凡是非Java的代碼都是垃圾,這是對(duì)程序員的侮辱;建議把所有的保留代碼都用Java重寫(xiě),這是喪心病狂,既不現(xiàn)實(shí)也不負(fù)責(zé)任。Sun和他的追隨者似乎覺(jué)得為了對(duì)付微軟罪惡的“帝國(guó)時(shí)代”,就必須如此自吹自擂。但是侮辱和欺詐只會(huì)把那些喜歡使用不同編程語(yǔ)言的程序員逼到微軟陣營(yíng)里去。 Java并非平臺(tái)無(wú)關(guān),它本身就是平臺(tái)。跟Windows一樣,它也是一個(gè)專(zhuān)有的商業(yè)平臺(tái)。也就是說(shuō),你可以為Windows/Intel編寫(xiě)代碼,也可以為Java/JVM編寫(xiě)代碼,在任何一種情況下,你都是在為一個(gè)屬于某個(gè)公司的平臺(tái)寫(xiě)代碼,這些代碼都是與該公司的商業(yè)利益扯在一起的。當(dāng)然你可以使用任何一種語(yǔ)言,結(jié)合操作系統(tǒng)的機(jī)制來(lái)編寫(xiě)可供JVM執(zhí)行的程序,但是JVM之類(lèi)的東西是強(qiáng)烈地偏向于Java語(yǔ)言的。它一點(diǎn)也不像是通用的、公平的、語(yǔ)言中立的VM/OS。私下里,我會(huì)堅(jiān)持使用可移植的C++作大部分工作,用不同的語(yǔ)言作余下的工作。 “Java is not platform-independent, it is the platform”,B. S的這句評(píng)語(yǔ)對(duì)于C++用戶(hù)有著很大的影響,有些C++高手甚至把這句話(huà)作為自己的簽名檔,以表明對(duì)Java的態(tài)度和誓死捍衛(wèi)C++的決心。
? ? ?C++ 和 Java 這兩種編譯型語(yǔ)言都是跨平臺(tái)的,只是它們跨平臺(tái)的層次不同而已:前者是源碼層(Fortran 和 Pascal 也是),后者是可執(zhí)行文件層。也就是說(shuō),要移植的話(huà),C++ 程序必須在目的平臺(tái)上重新編譯,Java 則只需把可執(zhí)行文件拷到目的平臺(tái)上去,不必在那里重新編譯。我說(shuō)的 “可執(zhí)行文件” 的定義是 “編譯器的輸出文件”(C++ 的是 .exe,Java 的是 .class)。 ? ? ?