微軟當年的 J++ 究竟是什麼?為什麼 Sun 要告它? | 知乎問答精選

 

A-A+

微軟當年的 J++ 究竟是什麼?為什麼 Sun 要告它?

2019年08月22日 知乎問答精選 暫無評論 閱讀 2 ℃ 次

【貓殺的回答(132票)】:

J++是什麼?

J++是微軟的Java實現版本,表達式、關鍵字、語法規約都和Java一致,符合Java的語言規範,2004年1月停止支持。

Sun為什麼要告微軟

Sun一開始是授權微軟可以使用Java的,隨後對微軟提起了商標侵權的訴訟,因為Sun的商標授權協議裡要求實現必須是「兼容的」,才能使用Java的商標。而微軟的MSJVM沒有通過Java的符合性測試。最終Sun和微軟和解,條件是J++只能開發到1.1.4版本,並且停止MSJVM的分發和下載。

J++的部分技術被回收利用,吸收到了.Net平台,演化成為J#,最終到現在的C#。

J++與Java的不同點

  • J++沒有實現部分Java的特徵,如RMI (Remote Method Invocation), JNI (Java Native Interface)

  • J++增加了一些Java沒有的特徵,如callback,delegate,event,從這時起就已經算是一個不同於Java的新語言了。現在可以在C#裡看到這些特徵。
  • J++沒有遵守Java對操作系統層調用的標準,而是採用了J/Direct框架,提供了一套完全繞過Java類庫與API訪問OS的機制,能直接調用Win32 API,因而有更好的性能。在現在的.Net框架中,有一套P/Invoke機制與其對應。
  • 使用了MS擴展特徵的J++程序不能直接運行在Java SDK上,但有項目能使這些程序跑在開源的JVM上。不過這些擴展並沒有被廣泛的使用。
  • J++支持ActiveX
  • J++提供了WFC(Windows Foundation Classes)框架,封裝了Win 32 API以及DHTML對像模型,主要用於在Windows上開發GUI應用程序。

可以看到,J++對Java做了大量的改進,這些改進後來都吸收到了.Net平台以及C#語言當中。

After Math

從法律和道義的角度來講,微軟違約很不厚道這點毋庸置疑,以下主要是從技術的角度來進行評價,一言以概之,時間證明Sun並沒有站在先進生產力的一邊。

最核心的槽點,可能就是J++搞私有API/不跨平台。但這直接帶來了性能上的提升,雖然影響了跨平台,但作為一種工程上的trade off,不一定是壞事,想想當年的電腦有多慢吧。現在微軟官方的.Net CLR實現出於性能考慮,同樣把不少工作推到了平台相關的native代碼層上,也並沒有影響mono實現跨平台,可見這個槽點根本就不算個事。

J++可以認為一直延伸到了今天的.Net一系的產品線,所以要評價J++是怎樣一種存在,在很大程度上需要把今天的C#/.Net和Java對比。現在Java和C#相比,除了(官方)跨平台,以及因為起步早+成本相對可以較低所以行業應用較多以外,毫無擼點,語言特徵方面C#更是甩Java幾條街。

J++增加的語法特徵,不少延續到了C#上,用過都知道爽。

JNI和C# P/Invoke相比,易用性完全不在一個檔次上。

Java至今還雞肋的泛型,誰用誰蛋碎。

由於mono項目的存在,使得C#跨平台根本不是問題,唯一影響其廣泛在開源社區被採用(如默認在Linux發行版中集成)是因為開源社區普遍不待見微軟,並且對微軟的CP(Community Promise,微軟承諾允許開源社區自由的對包括C#在內的部分微軟專利產品、規範編寫自己的實現)持保留意見。但這並不影響mono的廣泛使用,不少的應用程序、開發框架都採用mono作為腳本引擎,比如Unity3D引擎。

最近在研究把CoffeeScript編譯到CLR上執行,順便再說下運行時環境,JVM vs CLR。這麼多年來,產生了一些編譯到Java byte code,然後在JVM上運行的的語言,比如Scala,但並沒有證據表明Sun一開始的設計就考慮到了JVM大生態圈的建立。而.Net CLR則提供了一系列相當凶殘的方案,比如DLR(Dynamic Language Runtime),編譯器的開發者只需要解析出代碼的AST(Abstract Syntax Tree),再加上少量的glue code,就能把一種新語言target到.Net上運行,完全無需操心代碼生成、代碼優化、runtime等等需要花費大量精力的編譯器後端環節,並且能在後續.Net升級時,自動獲得新的改進(比如更加NB的代碼優化算法)。這代表什麼?一個開發者甚至不需要把《編譯原理》一書讀完,翻了前幾章能寫個詞法分析和語法分析,會解決Grammar的Shift-Reduce conflict,就能擼出一個能用於生產的以CLR為目標平台的編譯器出來。不管最後結果會如何,從技術的角度而言,微軟的解決方案是更有利於開發生態的建立。

從這些角度來看,J++雖然不能說是完爆Java,青出於藍四個字還是能提的,進步的態度和力度都是值得稱道的。微軟在當年受制於Sun的許可協議時,尚且大膽的對Java進行擴展改進,後續衍生的C#/.Net平台的每個新版本的演化力度都不弱,反觀Java這麼多年來的進展,不免讓人呵上一呵。

和微軟現在C#的Community Promise相對比,當年Sun給微軟的Java授權協議,不得不說實在是太狹隘了,最終在一定程度上限制了自身的發展。

【Ivony的回答(124票)】:

考慮了很久,決定還是用戲說的方式來回答這個問題。因為商業公司的很多決定背後的原因並不是公開透明的,換言之我們永遠也不可能知道為什麼Sun要阻止微軟開發J++和J#,既然如此,不如不那麼強調考證,一起來看一下那段歷史。

由於本答案是戲說,所以下文僅代表個人對於商業公司行為的揣測,不代表真實情況。

首先我們看J++是個什麼玩意兒。

實際上在語言上,J++和Java的關係可以類比為C++和C的關係,J++是Java語言的一個超集,在Java的基礎上擴展了很多的特性,僅此而已。

那麼到底是什麼導致了Sun對於J++/J#如此惱怒呢?其實主要的原因是:Java的純粹情結。

事實上Java這個語言今天發展的這麼爛,和Java的純粹情節不無關係,Java的創造者是一些完美主義者,他們認為Java應該是一個純粹的語言,這個純粹體現在平台無關,類庫無關,公司無關。

這個純粹情結說的好聽點叫做浪漫,說的不好聽點就是做夢。

與Java相似,微軟也是個純粹的公司。不過微軟是個純粹的商業公司,什麼東西第一考慮的是實用性。神馬有了接口所以沒有必要發明委託,用觀察者模式代替事件。微軟說,這尼瑪都是放屁,這麼寫代碼學習門檻怎麼降低,隨便來個傻子就可以把你優雅完美的設計給整成bullshit。工具是為產出服務的,語言這東西最好是每個場景都有對應的語法支持,而不是拿一堆螺絲齒輪自己組合成各種模式。

接下來,微軟僱傭Anders對Java語言進行了徹底的改造,改造後的結果(也就是J++)顯然讓Java感到了十足的冒犯,如果僅僅只是語言上的改造,Sun公司似乎沒有足夠的理由去跟微軟交惡,畢竟Windows是最流行的操作系統,Java還指望微軟給開發Windows平台的JVM或是為Sun開發Windows平台的JVM提供便利。

這時候輪到微軟犯傻了,微軟竟然把Java官方的類庫實現給改了,還有許多要增加的語言特性竟然會依賴於微軟擴展類庫的實現(這裡插一句,其實Java的官方庫也是個bullshit,這個誰用誰知道,所以微軟也可能是受不了了)。這下子終於讓Java那群揣著夢想的人不能忍了,在他們看來微軟這就是把Java抓了去找來幾個黑鬼輪X啊,真是是可忍孰不可忍,叔可忍嬸也不能忍。

但是,到底要怎麼才能說服Sun的高管去得罪微軟呢?

很顯然,網景這個曾經的好基友死的正是時候。微軟通過IE的私有擴展在市場競爭上幹掉了網景,遲早有一天微軟也會通過這樣的手段幹掉Java的(而且他現在正在這麼干),這看起來真TM是無懈可擊的理由。終於,因為害怕自己成為第二個網景,升陽MM終於顫巍巍的拿起了自己手裡的商標權,朝微軟大叔後腦勺狠狠的砸了下去,,,,,

不過,,,,,多年以後,升陽MM極不情願的把自己交給滿口金牙的甲骨文伯父時,準會想起當年揮起大棒砸暈微軟叔叔的那個明媚的下午。。。

呃,,,,,這句應該放開頭才對

如果點贊多我就繼續往下編關於升陽MM和十八摸大伯還有甲骨文伯父那些不堪回首的往事,,,

=====================================================

補充技術材料:

事實上微軟C#語言有很多成功的特性是與類庫掛鉤的。

例如委託和基於委託的事件、枚舉、數組。

委託衍生出來的lambda表達式,表達式樹,LINQ表達式,dynamic語法,async/await語法等等。這些都是依賴於類庫裡面特定的實現的。

儘管這樣一來C#變的不是一個純粹的語言,但事實證明,who cares。

【pansz的回答(44票)】:

J++ 是對 Java 的一些修改,或者叫改進,大部分兼容 Java,不過對某些特性並不 100% 支持,當然那些改進都只能在微軟的平台下存在。

而這個思想違背了 Java 的根基,畢竟 Java 的目標是一次編寫到處部署,但如果大家都用微軟的 J++ 去,那麼意味著不同平台移植還是涉及到修改代碼重新編譯,跟 C 成了一樣的性質, Java 的跨平台特性就不存在了,這就意味著 Sun 的 Java 就被釜底抽薪了,一旦這個釜底抽薪完成,這個世界上就沒 Sun/Java 什麼事了。所以可以理解為,為了 Java 的生死存亡,Sun 必須告微軟。

之所以現在 Java 能夠大量的用於服務器端,很重要的因素還是因為 Sun 保持了 Java 的純淨性,使得它仍然能夠跨平台,要知道服務器有一部分甚至都不是 Linux,而是私人定制的 Unix,跨平台部署很多時候非常重要,當然最痛恨它的自然是微軟,你們都到 Linux/Unix 裡面部署服務器了,我微軟的服務器賣給誰呢?

從微軟的角度,動搖 Java 的根基當然是絕對正確的選擇,而從業界的角度,微軟想把 Java 也變成捆綁到微軟平台的東西,自然也是絕對不正義的。

至於說 Mono 可以用於跨平台,我只能說呵呵。Mono 平台能兼容多少 C# 應用?以那種兼容性敢部署自己的生產系統上去麼?還別說 C# .NET 本身是微軟的知識產權,你開源製造一個 C# 一個 .NET 平台微軟可是隨時能告你專利侵權的,微軟雖然口頭上承諾了不告Mono,但這並不等於說微軟無權告Mono,也不等於說微軟授權給Mono做這件事情了。所以如果你想用 Mono 幹活,無論是其兼容性,穩定性,還是法律風險方面,都得不償失。真的喜歡 C# 和 .NET,請直接用微軟平台,當然這也就意味著你與 Linux 的世界無緣了。

雖然 C# .NET 很優秀,可是這個世界上畢竟還有人不願意被綁在微軟的平台上,所以自然會有人抵制它,這,無可厚非。

其實若干年後,Google 的 android 似乎做者類似的事情,重新分裂了 Java,為什麼這次的結果就不同了呢?一方面是時代不同了,另一方面是因為 android 本身開源。而微軟的 .NET 平台不是開源的。即便 Google 消失了,android 本身仍然屬於全人類。而 .NET 卻不是。

微軟的 C# 很牛,.NET 很厲害,技術架構很先進,一切都很好很好很好,但,它只屬於微軟,不是開源的,不屬於全人類,大家不願意選擇一個受到一個商業公司完全控制的技術,就是這樣。

——順便說一下,其實 Sun 也是這樣想的。

補充評論中的觀點:

有人說跨平台很扯,那麼大家今天不談跨平台了,談談一個簡單的問題:如果我就是想在 Linux 平台上選一個開發環境, C# 是首選麼?明眼人都應該明白這個道理, mono 至少不是一等公民,是屬於微軟沒把它當親兒子,Linux 社區更沒把它當自己人的存在。

微軟要的是一個微軟作為一等公民的環境,如果你使用 C#,微軟的環境才是首選,Linux 只是需要跨平台適配的時候才勉強用一下的。——但現實是,大家需要一個用 Linux 作為一等公民的環境,需要一個在 Linux 上開發調試,微軟平台是否支持都沒什麼關係的環境。

那麼,為 Linux 平台保留一個商業可用的環境,就顯得尤其重要了。即便它現在的接盤俠是 Oracle 也不能改變這個事實:Java 在 Linux 上的表現,目前大公司可以信賴和依賴它,而一旦依從微軟,這一切將不復存在。

【葉崢波的回答(3票)】:

簡單地說,就是sum授權微軟用java,打算是裡利用微軟的知名度,擴大java的使用率。結果發現通過微軟平台開發的java程序,只能在win平台可以用,而在其他平台總有這樣那樣的問題。於是談崩了,就是這樣。

【明月暗雨的回答(0票)】:

他把Java變成了微軟自己的java

標籤:-Java -微軟(Microsoft) -Java程序員


相關資源:





給我留言