top
Loading...
且看微軟的.Net和Sun公司的J2EE如何對壘
導 讀:面對微軟推出的.Net FRAMEWORK,你可能會有以下疑問:
準確地講.Net平臺是什么?
如何將.Net的體系結構和J2EE對比?
從.Net的體系結構演繹出的一整套關于企業軟件開發方案中我們能學到此什么?
在本文中作者將為你解開這些疑問。

廖永康
原文出處:http://java.sun.com/features/2000/11/dotnetvsms.html


即使你沒有專門針對微軟平臺寫過程序,你可能也會聽到過微軟的.Net。這是微軟對最近一連串和非視窗事件競爭的回答。如果你讀到過有關新聞、來自微軟的撰稿、或者通過在MSDN端瀏覽得到的不完整的技術資料、或者你注意到了微軟專家開發者會議(會上已經演示了.Net平臺)的話,你可能至少還有兩大疑問:

* 準確地講.Net平臺是什么?

* 如何將.Net的體系結構和J2EE對比?

如果你再深入一步的話,你可能還有第三個疑問活躍在你的腦海里:

* 從.Net的體系結構演繹出的一整套關于企業軟件開發方案中我們能學到此什么?

.Net框架是其生命周期的十分早期階段的產品,微軟.Net部門還會不斷地更深入和仔細地開發它,但是無論怎樣,我們已經能夠從已有的資料對這些問題作出公正的正確的回答。

它是什么?(.Net是什么?)

現在在眾多的論壇中對.Net的反思,使人不禁聯想起三個瞎子摸象的寓言;根據你的洞察力,可能得到非常不同的結論:有人認為.Net是微軟下一代Visual Studio的開發環境;有人認為它只是一種新的編程語言(C#);還有人為它是基于XML和SOAP的一種新的數據交換和報文的工作框架。實際上,.Net包含了這幾部份內容,而且還會更多。

首先,讓我們看一些具體的細節,瀏覽一下組成.Net平臺的一系列技術構件:

l C#:是一種新寫的描述(書)構件的語言,它將C、C++和Java的元素集成起來,并增加一些特點如:元數據標記、相關元素的開發。

l “公共語言運行時”:它以中間語言(IL)格式,運行字節代碼,用一種語言寫的代碼和對象只要編譯器是針對這種語言開發的,顯然能夠編譯成IL運行時。

l 一組基本的可從“公共語言運行時”訪問的構件(元件),它可提供各種功能(如:連網功能、包容器功能等等)。

l ASP.NET:是新的ASP版本,支持將ASP編譯成公共語言運行時功能(所以用任何語言寫的ASP腳本,都能和IL捆綁在一起)。

l 視窗格式和Web格式:一種新的可從Visual Studio訪問的UI構件框架。(用戶接口=UI)。

l ADO:將XML和SLAP用于數據交換的新一代ADO數據訪問構件(元件)。

.Net和J2EE如何比較?

正如我們所能看見的.Net平臺,在其傘型結構下有一個技術矩陣(寶塔)。顯然微軟為了抓住視窗平臺的開發商,正在將這些技術變成現有平臺如J2EE和CORBA的代用品。但是怎樣對它們進行逐項比較呢?一種方法就是將.Net和J2EE作成以下對比列表:

.Net J2EE 關鍵差異
C#編程語言 Java編程語言 C#和Java均來自C和C++,最顯著的特 點(如垃圾收集層次結構的名字空間)在兩 個方面。C#借用了JavaBeans的某些構件概念(特性屬性、事件等),并增加了 某些自己的概念(如元數據標志),但將 這些特點合并成不同的語法。 Java以Java虛擬機方式運行在任何平臺上,而C#在可預見的將來,僅運行在視 窗環境內。C#隱含地結合到IL公共語 言運行時中,(見后),然后按合理的順 序(JIT)運行。編譯成的字節編碼或者整個編譯成的自然編碼。Java代碼按照Java 虛擬機字節代碼方式運行,它由VM解 析或JIT編譯,或者整個編譯成自然代碼。
.Net公共元件(填補“.Net 框架結構的SDK”) Java核心API 高層的.Net元件,包括支持用XML和SOAP 的分布式訪問(見ADO.NET)。
ASP.NET頁面(ASP.NET) Java服務器頁面(JSP) ASP.NET使用Visual Basic、C# 可能還有一 別的語言作為代碼段。通過公共語言運行 時全部編譯成自然代碼(與此相對應<相反> 是象APS那樣,每次都解析執行)。JSP使 用Java代碼(段或者JavaBeans參考),或者 編譯成Java字節代碼(按需或批編譯要根據 JSP實現系統來決定)。 .Net公共語言運行時允許以多種語言的代碼 (程序)在視窗環境下使用一組共享的元件。 優先于.Net框架的所有元件(公共元件、ASP.NET等)。
IL公共語言運行時 Java虛擬機和CORBA IDL和ORB Java的虛擬機規程,允許Java字節代碼, 在任何平臺上按JVM方式運行。 CORBA允許多種語言的代碼使用一組共享 的對象,在任何帶有ORB的平臺上運行, 并不是緊密地集成到J2EE框架內。 同樣的Web元件(如基于JSP的文件)在標準 的Java平臺上是沒有的,某些專有的元件 只能通過Java IDE等得到。
視窗格式和Web格式 Java的飄移 通過MS Visual Studio的IDE而不是在本文 所說的IDE,支持視窗格式和Web格式的 RAD開發,在許多Java的IDE和工具中都 支持“飄移”(Swing)。
ADO.NET和基于SOAP的Web服務 JDBC、EJB、JMS和Java XML庫(XML4J、JA-XP) ADO.NET建立在位于HTTP協議頂部的XML數據 交換的基礎上(指在遠程數據對象和多個應 用程序捆綁之間的數據交換)。一般說來, .Net的Web服務假定了SOAP發信模型。 而EJB、JDBC等將數據交換協議和開發者 處理權分離,不工作在HTTP、KMI/JRMP或 IIOP頂層。


該表的比較只抓住了表面現象,這里再總結一下.Net和J2EE的比較:

l 特點:.Net和J2EE都提供同樣優秀的特點,盡管提供的方法不同。

l 可移植性(Portability):.Net的核心只工作Windows環境下,但從理

論上講可以支持以多種語言開發(只要這些語言的子集/超集已經定義 好,并為他們建立了IL編譯器)。也就是說:SOAP的能力允許在其它平臺上的元件(部件)和.Net元件進行數據報文交換。而.Net中的一些元素:象SOAP,其恢復和查找協議,作為公共部份提供構架的核心部件(IL運行時環境、ASP.NET內部的視窗格式和Web格式元件“合同”等)仍由微軟掌握,微軟只扮演整個.Net開發環境和運行時環境提供者的角色。其實早就有了來自開發者協會要求微軟公開這些規程,但是這和微軟的標準經驗相違背。

另一方面,J2EE只要遵循Java VM(規則)和一組平臺需要的服務就可以在任何平臺上工作(EJB包容器、JMS服務等等)。所有這些定義了J2EE平臺的規程,都已經公開發表,并提供公眾閱讀。因此,許多供應商也提供兼容產品和開發環境。但是J2EE是單語言平臺,若用其它語言調用或訪問對象,可能需要通過CORBA,但是CORBA支持并不是平臺普遍存在的部分。

巨大的前景:

上述最后的幾點勾畫出.Net和J2EE的某些關鍵性的差異,以及微軟在這些方面所扮演的角色。微軟現在正在為.Net做兩件值得注意的事:通過將XML和SOAP集成到他們的信息傳輸方案中,從而為以其它編程語言開發商和非.Net部件打開通向.Net的道路。

通過讓語言元件交叉互動,.Net正在釋放Perl、Eiffel、Cobol和其它編程器,允許它們扮演微軟“沙盤”的角色。這些語言的愛好者應該特別遵守規則,因為他們中大部分人在微軟/SUN/OpenSource競爭中感受到約束和定界。因此,只要在他的元件發信層使用XML和SOAP,微軟就能支持他們將開放性部件加到他們的平臺上,從而擺脫對專用性的依賴。

正確的響應是甚麼?

對于微軟的開發商,.Net是一個好的構架,你可以將許多事情交給微軟的體系結構去完成。ASP.NET比ASP好,ADO.NET比ADO和DCOM出色,但有所差別,C# 比C和C++更好。.Net最初版將在2001年的某個時候可以得到,因此你有足夠的時間準備。但是可以肯定,它將成為微軟平臺的缺省(約定)開發環境。如果您現在正在微軟的開發構架中從事開發工作,將.Net的元件采納到你的體系結構中,肯定能夠獲得利益。

但是,.Net平臺的幾個期望目標極高,但不能保證全部起步,至少在短期內完成不了。例如IL公共語言運行時在使開發者獲益之前還有某些明顯的障礙需要克服。想要把每一種語言和元件運行時集成起來,必須定義這種語言的子集/超集,并清晰地影射到IL運行時上,和必須定義結構,以便提供IL需要的元數據,然后和必須開發適用于兩種編譯語言結構(對象、部件等)的編譯器(從XML到IL和從IL到XML),集成到IL部件字節代碼中,同時還要生成對現有IL元件的語言專用接口。

這里還有一些歷史的因由,必須開發非Java語言到JavaVM的眾多橋梁,如:Jpython、PERCobol、The Tcl/Java Project。同時,如果有足夠的興趣,幾年前就應將Bertrand Meyes和一些別的Eiffel folk一起放到Eiffel-to-Java VM系統中(幾年后),只有Jpython 例外。這些工具得到廣泛的采納,甚至在他們自己相關的委員會里也是這樣,即使它們似乎能夠提供一種方法,用你所偏愛的語言,為Java環境寫代碼(雖然不是整個J2EE構架)。然而為什么還這樣缺乏熱情?因為人們猶豫,不想承受從它們的開發語言中,將額外的翻譯工作加到目標構架上。如果Java環境是目標,人們通常會選擇學習Java。我預計,對.Net也是同樣正確的。人們將會選擇學習C#和用這種語言寫.Net的部件。

另一點要注意:基于.Net的SOAP將用于分布式通信,謹防性能損失。SOAP基本上意味著在HTTP上的XML。HTTP不是一個高性能的數據協議,因此XML隱含一個XML語法解析層,也就是需要更多的計算開銷。兩者相結合會大大減少相對另一種發信/通信信道的事務處理速率。XML是一種非常豐富的、十分強大的發信用的元語言。HTTP是非常靈活可移動的,因此可以防止許多防火墻的損失,但是如果事務處理速率對你是優先考慮的話,請保持你的選項打開。

對于Java和開放資源委員會

請不要把.Net作為微軟市場競爭的手段,繼續以你們喜愛的方式理解.Net可能更容易接受。但是.Net并不是一種精巧的標志,而是微軟策略的重大轉移,將為其平臺帶來福音。他們正在為使其它的構架和平臺在管理級上做得更好而奮斗。提供關于自身成本和無縫集成方面有用的可查詢的統計資料。現在他們正努力把Java和開放資源自身所特有的元語言,逐步開放,然后力圖直接滿足開發商的需要。在過去一段時間里,由于他們沒有做好,兩件事情失敗了。如果你認為自己是Java和無資源平臺的福音的傳播者,那么,競爭的性質就會改變。

另外,微軟的IL運行時,至少可能有一個值得注意的目標:就是清除編程語言進入結構框架的障礙。Java清除了平臺的障礙(當然在有限范圍內,例如你不能沒有硬件資源來制作軟件)。但是為了用J2EE來作開發工作,你必須在Java環境下工作。而.Net是想讓你使用你選擇的語言來建造.Net應用程序,這是十分美妙的。盡管還有一些大問題沒有解決。如:.Net中的IL方式什么時候和是否會實際上變成廣泛使用的(工具)(如上所述)。不管怎樣,這就表明了單語言的J2EE方式存在弱點。這個弱點的重要性可以懷疑,但是它依然存在,因此它值得Java委員會考慮。如果開發商真的認為是這樣,那么就可以把力量放在Java字節代碼生成器方面,以適應非Java語言,當然這需要組織和濃縮(匯總)。

再深入研究一下J2EE,立即可以得到一些結論。為了支撐該平臺和.Net相較量的優勢。首先XML支持要無縫地集成到結構框架中,我們且不說將XML SAX/DOM語法解析器作為一組標準服務或者在配置元件中,擴展XML的使用。這里需要XML的發信和操作處于隨時可用狀態。公認的做法是在JMS頂端用XML的內容發信,但是并不是所有的平臺都有這種設施,XML空間是一堆雜亂無章的標準,非關鍵因素標準,API和DTD是你處理元語言時期望的。

但是微軟已經將SOAP放在基礎層,很難把某些可理解和有用的東西放到開發商手里。J2EE的倡議者需要用他們的平臺做同樣的事。記住一種可能性是將XML發信提供者層放在JMS的頂部。后面緊接著Java命名和目錄接口或者帶LDAP的JNDI、NIS和COS命名等等。這種和標準SOAP/BizTalk供應商,EBXML供應商等等的結合將是種令人印象深刻的語句(說明)。

澄清和更正:

由于本文在2000年8月份發表的,有40位讀者以他們關心.Net和J2EE對比的想法返回給我們(見讀者回信),本文作者Jim Farley篩選過這些內容,同時用電子郵件回復他們,因此增加以下的澄清和更正。

澄清:

C#的編譯特點和Java的編譯特點對比似乎讓讀者產生混淆,為了更清楚一點,我們用另一種方法比較:C#代碼總是以自然的形式運行。Java代碼典型地是以解析型字節代碼運行;C#可整個編譯成自然代碼,或者編譯到公共語言運行時字節代碼中,然后在執行期間逐次編譯自然代碼。另一方面,Java代碼典型地以運行時解析型字節代碼方式運行(據此,其交叉平臺能力可以增長)。同時也能夠以逐次編譯上下文連接方式運行;也有了一些Java自然代碼編譯器(Jove、Bullet Train、JET等)。

作為旁注(附注),微軟要求遵循Java的約定解析性模式在這種模式中,設計用于虛擬機的字節代碼,本身不用于自然代碼優化,我沒有看到有力的數據證明或反駁這個要求,(一般的應針對字節代碼對比自然編譯語言,或者特殊針對 Java對比C#)。

在回應中,有幾位讀者指出J2EE支持XML,這說明了這樣一個事實:J2EE1.3版(現以草案方式發布)要求任何兼容J2EE的產品,必須包含Java XML SAX和DOM語法解析器。這正是我說的“把XML SAX/DOM捆綁到Java上。我已經要求他們采取進一步措施,以J2EE支持API方式直接支持XML協同工作。最理想的方法是基于J2EE的部件和服務,應讓XML在某種程度上自動支持內建(對發信、接口描述、輸出等)。


更正:

我在本文中說:C#“借用了某些JavaBeans的部件概念”。這句話沒有證據,正如幾位讀者指出,更合適的說法是“微軟C#的功能多于它們本身的COM和VB模型,這是由于來自其它已有的部件模型的影響".

北斗有巢氏 有巢氏北斗