微軟在 Visual J++ (J# 前身)裡面添加了很多不通用的特性, 很多人認為這是為了破壞Java語言跨平台性的舉動。 也就是說,這使得你用了微軟的 J++ 開發程式碼後就只能在微軟的平台使用!
微軟被 Sun 控告後, 先是把 J++ 改為 J# (J-Sharp), 後來乾脆改為 C# ( C-Charp ), 宣稱是從 C++ 改來的, 把 ++用力寫大字一些 就變成 #, Java 的 import 被改回 C++ 的 using namespace 概念, 但是整體而言, 實際上 C# 受 Java 的影響比較大!
微軟推出 C# 之後, 將之列為 .Net 平台的主要語言, 並宣稱不再推廣 J++ 與 J#, 要求大家改用 C# 開發微軟平台上的程式!
微軟與Sun在 2004/04/02 (於舊金山 SAN FRANCISCO, CA)達成和解! 根據報導, 微軟給了Sun總共16億美元,包括七億不信任賠償金與九億專利補償金。
The agreements involve payments of $700 million to Sun by Microsoft to resolve pending antitrust issues and $900 million to resolve patent issues.
現在請大家先看看微軟在其 MSDN 上關於 J# 的文件: http://msdn.microsoft.com/zh-tw/library/a4ty5t0t(VS.80).aspx
阿不過可能有些同學看完後也不知道那在說瞎密碗糕:-) 這是因為如果對Compiler如何編譯程式不太了解, 看該篇會一知半解! (不是翻譯得不好, 即使看英文版也一樣不太懂了!)
我稍微補充一下重點, 然後大家再看該文章就會比較容易懂!
(1)原始型別(Primitive type)或稱實值型別(value type), 是指在機器語言的Level用指令一次就直接處理的資料(或說硬體支援)!
(2)參考型別(Reference type)在Java其實是一個資料結構, 裡面紀錄 它參考到的物件的一些相關資料, 所以存取該物件都要用軟體做一些事 才有辦法完成!
(3)Java的物件都必須 new 才會去安排物件實體的空間, 該些空間的管理方式是隨時可以要隨時可以還掉, 沒有規定順序, 因此稱之為 Heap 區(堆積, 類似稻草堆!)
(4)堆疊區(Stack)一般規劃記憶體中較高位址一塊區域, 用一個指標來表示堆疊的頂端, 從高位址往低位址"成長", 因為最後安排或使用的會最先還掉, 要與還是相反順序, 因此稱為堆疊! 通常用來處理參數傳遞(parameter passing)與 函數內的自動變數(auto variable)!
(5)通常把程式與靜態資料放較低位址, 把堆疊安排在高位址往低位址長大,
堆積(Heap)就從程式+靜態資料的尾端由低位址往高位址用過去!
Java的虛擬機器(VM)有個 Method area專門放從 class 檔案搬入的 程式碼(Byte code), 此區相當於其他語言的"程式+靜態資料"的程式區!
(6) 一般所謂"程式+靜態資料"包括 函數內寫 static 的區域變數, 但是 Java 規定函數內不可以有這種 static 的區域變數! 寫在 class 內但是在函數外的 static 變數是指這類的物件共用一份資料! Java 把它們放在一個特殊 Heap區(不是我們 new 物件時用的 Heap 區)! 該特殊Heap區是Java的VM在使用與管理, 其實這跟 Java VM 的實作有關, 例如 Hotspot VM 與 JRockit JVM 實作方式就不太一樣!
Java 的執行效能一直是個話題, 但是JDK 1.4 的 JVM 做了許多改變, 使得 JVM 的效能明顯提昇許多! 目前宣稱 Java 的執行效能可以達到 用 C語言寫的大約一半效能。