且看微軟的.Net與Sun公司的J2EE如何對(duì)壘
發(fā)表時(shí)間:2024-02-08 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]導(dǎo) 讀:面對(duì)微軟推出的.Net FRAMEWORK,你可能會(huì)有以下疑問(wèn): 準(zhǔn)確地講.Net平臺(tái)是什么? 如何將.Net的體系結(jié)構(gòu)和J2EE對(duì)比? 從.Net的體系結(jié)構(gòu)演繹出的一整套關(guān)于企業(yè)軟件開(kāi)發(fā)方案中我們能學(xué)到此什么? 在本文中作者將為你解開(kāi)這些疑問(wèn)。 廖永康 原文出處:http://java....
導(dǎo) 讀:面對(duì)微軟推出的.Net FRAMEWORK,你可能會(huì)有以下疑問(wèn):
準(zhǔn)確地講.Net平臺(tái)是什么?
如何將.Net的體系結(jié)構(gòu)和J2EE對(duì)比?
從.Net的體系結(jié)構(gòu)演繹出的一整套關(guān)于企業(yè)軟件開(kāi)發(fā)方案中我們能學(xué)到此什么?
在本文中作者將為你解開(kāi)這些疑問(wèn)。
廖永康
原文出處:http://java.sun.com/features/2000/11/dotnetvsms.html
即使你沒(méi)有專門(mén)針對(duì)微軟平臺(tái)寫(xiě)過(guò)程序,你可能也會(huì)聽(tīng)到過(guò)微軟的.Net。這是微軟對(duì)最近一連串和非視窗事件競(jìng)爭(zhēng)的回答。如果你讀到過(guò)有關(guān)新聞、來(lái)自微軟的撰稿、或者通過(guò)在MSDN端瀏覽得到的不完整的技術(shù)資料、或者你注意到了微軟專家開(kāi)發(fā)者會(huì)議(會(huì)上已經(jīng)演示了.Net平臺(tái))的話,你可能至少還有兩大疑問(wèn):
* 準(zhǔn)確地講.Net平臺(tái)是什么?
* 如何將.Net的體系結(jié)構(gòu)和J2EE對(duì)比?
如果你再深入一步的話,你可能還有第三個(gè)疑問(wèn)活躍在你的腦海里:
* 從.Net的體系結(jié)構(gòu)演繹出的一整套關(guān)于企業(yè)軟件開(kāi)發(fā)方案中我們能學(xué)到此什么?
.Net框架是其生命周期的十分早期階段的產(chǎn)品,微軟.Net部門(mén)還會(huì)不斷地更深入和仔細(xì)地開(kāi)發(fā)它,但是無(wú)論怎樣,我們已經(jīng)能夠從已有的資料對(duì)這些問(wèn)題作出公正的正確的回答。
它是什么?(.Net是什么?)
現(xiàn)在在眾多的論壇中對(duì).Net的反思,使人不禁聯(lián)想起三個(gè)瞎子摸象的寓言;根據(jù)你的洞察力,可能得到非常不同的結(jié)論:有人認(rèn)為.Net是微軟下一代Visual Studio的開(kāi)發(fā)環(huán)境;有人認(rèn)為它只是一種新的編程語(yǔ)言(C#);還有人為它是基于XML和SOAP的一種新的數(shù)據(jù)交換和報(bào)文的工作框架。實(shí)際上,.Net包含了這幾部份內(nèi)容,而且還會(huì)更多。
首先,讓我們看一些具體的細(xì)節(jié),瀏覽一下組成.Net平臺(tái)的一系列技術(shù)構(gòu)件:
l C#:是一種新寫(xiě)的描述(書(shū))構(gòu)件的語(yǔ)言,它將C、C++和Java的元素集成起來(lái),并增加一些特點(diǎn)如:元數(shù)據(jù)標(biāo)記、相關(guān)元素的開(kāi)發(fā)。
l “公共語(yǔ)言運(yùn)行時(shí)”:它以中間語(yǔ)言(IL)格式,運(yùn)行字節(jié)代碼,用一種語(yǔ)言寫(xiě)的代碼和對(duì)象只要編譯器是針對(duì)這種語(yǔ)言開(kāi)發(fā)的,顯然能夠編譯成IL運(yùn)行時(shí)。
l 一組基本的可從“公共語(yǔ)言運(yùn)行時(shí)”訪問(wèn)的構(gòu)件(元件),它可提供各種功能(如:連網(wǎng)功能、包容器功能等等)。
l ASP.NET:是新的ASP版本,支持將ASP編譯成公共語(yǔ)言運(yùn)行時(shí)功能(所以用任何語(yǔ)言寫(xiě)的ASP腳本,都能和IL捆綁在一起)。
l 視窗格式和Web格式:一種新的可從Visual Studio訪問(wèn)的UI構(gòu)件框架。(用戶接口=UI)。
l ADO:將XML和SLAP用于數(shù)據(jù)交換的新一代ADO數(shù)據(jù)訪問(wèn)構(gòu)件(元件)。
.Net和J2EE如何比較?
正如我們所能看見(jiàn)的.Net平臺(tái),在其傘型結(jié)構(gòu)下有一個(gè)技術(shù)矩陣(寶塔)。顯然微軟為了抓住視窗平臺(tái)的開(kāi)發(fā)商,正在將這些技術(shù)變成現(xiàn)有平臺(tái)如J2EE和CORBA的代用品。但是怎樣對(duì)它們進(jìn)行逐項(xiàng)比較呢?一種方法就是將.Net和J2EE作成以下對(duì)比列表:
.Net J2EE 關(guān)鍵差異
C#編程語(yǔ)言 Java編程語(yǔ)言 C#和Java均來(lái)自C和C++,最顯著的特 點(diǎn)(如垃圾收集層次結(jié)構(gòu)的名字空間)在兩 個(gè)方面。C#借用了JavaBeans的某些構(gòu)件概念(特性屬性、事件等),并增加了 某些自己的概念(如元數(shù)據(jù)標(biāo)志),但將 這些特點(diǎn)合并成不同的語(yǔ)法。 Java以Java虛擬機(jī)方式運(yùn)行在任何平臺(tái)上,而C#在可預(yù)見(jiàn)的將來(lái),僅運(yùn)行在視 窗環(huán)境內(nèi)。C#隱含地結(jié)合到IL公共語(yǔ) 言運(yùn)行時(shí)中,(見(jiàn)后),然后按合理的順 序(JIT)運(yùn)行。編譯成的字節(jié)編碼或者整個(gè)編譯成的自然編碼。Java代碼按照J(rèn)ava 虛擬機(jī)字節(jié)代碼方式運(yùn)行,它由VM解 析或JIT編譯,或者整個(gè)編譯成自然代碼。
.Net公共元件(填補(bǔ)“.Net 框架結(jié)構(gòu)的SDK”) Java核心API 高層的.Net元件,包括支持用XML和SOAP 的分布式訪問(wèn)(見(jiàn)ADO.NET)。
ASP.NET頁(yè)面(ASP.NET) Java服務(wù)器頁(yè)面(JSP) ASP.NET使用Visual Basic、C# 可能還有一 別的語(yǔ)言作為代碼段。通過(guò)公共語(yǔ)言運(yùn)行 時(shí)全部編譯成自然代碼(與此相對(duì)應(yīng)<相反> 是象APS那樣,每次都解析執(zhí)行)。JSP使 用Java代碼(段或者JavaBeans參考),或者 編譯成Java字節(jié)代碼(按需或批編譯要根據(jù) JSP實(shí)現(xiàn)系統(tǒng)來(lái)決定)。 .Net公共語(yǔ)言運(yùn)行時(shí)允許以多種語(yǔ)言的代碼 (程序)在視窗環(huán)境下使用一組共享的元件。 優(yōu)先于.Net框架的所有元件(公共元件、ASP.NET等)。
IL公共語(yǔ)言運(yùn)行時(shí) Java虛擬機(jī)和CORBA IDL和ORB Java的虛擬機(jī)規(guī)程,允許Java字節(jié)代碼, 在任何平臺(tái)上按JVM方式運(yùn)行。 CORBA允許多種語(yǔ)言的代碼使用一組共享 的對(duì)象,在任何帶有ORB的平臺(tái)上運(yùn)行, 并不是緊密地集成到J2EE框架內(nèi)。 同樣的Web元件(如基于JSP的文件)在標(biāo)準(zhǔn) 的Java平臺(tái)上是沒(méi)有的,某些專有的元件 只能通過(guò)Java IDE等得到。
視窗格式和Web格式 Java的飄移 通過(guò)MS Visual Studio的IDE而不是在本文 所說(shuō)的IDE,支持視窗格式和Web格式的 RAD開(kāi)發(fā),在許多Java的IDE和工具中都 支持“飄移”(Swing)。
ADO.NET和基于SOAP的Web服務(wù) JDBC、EJB、JMS和Java XML庫(kù)(XML4J、JA-XP) ADO.NET建立在位于HTTP協(xié)議頂部的XML數(shù)據(jù) 交換的基礎(chǔ)上(指在遠(yuǎn)程數(shù)據(jù)對(duì)象和多個(gè)應(yīng) 用程序捆綁之間的數(shù)據(jù)交換)。一般說(shuō)來(lái), .Net的Web服務(wù)假定了SOAP發(fā)信模型。 而EJB、JDBC等將數(shù)據(jù)交換協(xié)議和開(kāi)發(fā)者 處理權(quán)分離,不工作在HTTP、KMI/JRMP或 IIOP頂層。
該表的比較只抓住了表面現(xiàn)象,這里再總結(jié)一下.Net和J2EE的比較:
l 特點(diǎn):.Net和J2EE都提供同樣優(yōu)秀的特點(diǎn),盡管提供的方法不同。
l 可移植性(Portability):.Net的核心只工作Windows環(huán)境下,但從理
論上講可以支持以多種語(yǔ)言開(kāi)發(fā)(只要這些語(yǔ)言的子集/超集已經(jīng)定義 好,并為他們建立了IL編譯器)。也就是說(shuō):SOAP的能力允許在其它平臺(tái)上的元件(部件)和.Net元件進(jìn)行數(shù)據(jù)報(bào)文交換。而.Net中的一些元素:象SOAP,其恢復(fù)和查找協(xié)議,作為公共部份提供構(gòu)架的核心部件(IL運(yùn)行時(shí)環(huán)境、ASP.NET內(nèi)部的視窗格式和Web格式元件“合同”等)仍由微軟掌握,微軟只扮演整個(gè).Net開(kāi)發(fā)環(huán)境和運(yùn)行時(shí)環(huán)境提供者的角色。其實(shí)早就有了來(lái)自開(kāi)發(fā)者協(xié)會(huì)要求微軟公開(kāi)這些規(guī)程,但是這和微軟的標(biāo)準(zhǔn)經(jīng)驗(yàn)相違背。
另一方面,J2EE只要遵循Java VM(規(guī)則)和一組平臺(tái)需要的服務(wù)就可以在任何平臺(tái)上工作(EJB包容器、JMS服務(wù)等等)。所有這些定義了J2EE平臺(tái)的規(guī)程,都已經(jīng)公開(kāi)發(fā)表,并提供公眾閱讀。因此,許多供應(yīng)商也提供兼容產(chǎn)品和開(kāi)發(fā)環(huán)境。但是J2EE是單語(yǔ)言平臺(tái),若用其它語(yǔ)言調(diào)用或訪問(wèn)對(duì)象,可能需要通過(guò)CORBA,但是CORBA支持并不是平臺(tái)普遍存在的部分。
巨大的前景:
上述最后的幾點(diǎn)勾畫(huà)出.Net和J2EE的某些關(guān)鍵性的差異,以及微軟在這些方面所扮演的角色。微軟現(xiàn)在正在為.Net做兩件值得注意的事:通過(guò)將XML和SOAP集成到他們的信息傳輸方案中,從而為以其它編程語(yǔ)言開(kāi)發(fā)商和非.Net部件打開(kāi)通向.Net的道路。
通過(guò)讓語(yǔ)言元件交叉互動(dòng),.Net正在釋放Perl、Eiffel、Cobol和其它編程器,允許它們扮演微軟“沙盤(pán)”的角色。這些語(yǔ)言的愛(ài)好者應(yīng)該特別遵守規(guī)則,因?yàn)樗麄冎写蟛糠秩嗽谖④?SUN/OpenSource競(jìng)爭(zhēng)中感受到約束和定界。因此,只要在他的元件發(fā)信層使用XML和SOAP,微軟就能支持他們將開(kāi)放性部件加到他們的平臺(tái)上,從而擺脫對(duì)專用性的依賴。
正確的響應(yīng)是甚麼?
對(duì)于微軟的開(kāi)發(fā)商,.Net是一個(gè)好的構(gòu)架,你可以將許多事情交給微軟的體系結(jié)構(gòu)去完成。ASP.NET比ASP好,ADO.NET比ADO和DCOM出色,但有所差別,C# 比C和C++更好。.Net最初版將在2001年的某個(gè)時(shí)候可以得到,因此你有足夠的時(shí)間準(zhǔn)備。但是可以肯定,它將成為微軟平臺(tái)的缺。s定)開(kāi)發(fā)環(huán)境。如果您現(xiàn)在正在微軟的開(kāi)發(fā)構(gòu)架中從事開(kāi)發(fā)工作,將.Net的元件采納到你的體系結(jié)構(gòu)中,肯定能夠獲得利益。
但是,.Net平臺(tái)的幾個(gè)期望目標(biāo)極高,但不能保證全部起步,至少在短期內(nèi)完成不了。例如IL公共語(yǔ)言運(yùn)行時(shí)在使開(kāi)發(fā)者獲益之前還有某些明顯的障礙需要克服。想要把每一種語(yǔ)言和元件運(yùn)行時(shí)集成起來(lái),必須定義這種語(yǔ)言的子集/超集,并清晰地影射到IL運(yùn)行時(shí)上,和必須定義結(jié)構(gòu),以便提供IL需要的元數(shù)據(jù),然后和必須開(kāi)發(fā)適用于兩種編譯語(yǔ)言結(jié)構(gòu)(對(duì)象、部件等)的編譯器(從XML到IL和從IL到XML),集成到IL部件字節(jié)代碼中,同時(shí)還要生成對(duì)現(xiàn)有IL元件的語(yǔ)言專用接口。
這里還有一些歷史的因由,必須開(kāi)發(fā)非Java語(yǔ)言到JavaVM的眾多橋梁,如:Jpython、PERCobol、The Tcl/Java Project。同時(shí),如果有足夠的興趣,幾年前就應(yīng)將Bertrand Meyes和一些別的Eiffel folk一起放到Eiffel-to-Java VM系統(tǒng)中(幾年后),只有Jpython 例外。這些工具得到廣泛的采納,甚至在他們自己相關(guān)的委員會(huì)里也是這樣,即使它們似乎能夠提供一種方法,用你所偏愛(ài)的語(yǔ)言,為Java環(huán)境寫(xiě)代碼(雖然不是整個(gè)J2EE構(gòu)架)。然而為什么還這樣缺乏熱情?因?yàn)槿藗儶q豫,不想承受從它們的開(kāi)發(fā)語(yǔ)言中,將額外的翻譯工作加到目標(biāo)構(gòu)架上。如果Java環(huán)境是目標(biāo),人們通常會(huì)選擇學(xué)習(xí)Java。我預(yù)計(jì),對(duì).Net也是同樣正確的。人們將會(huì)選擇學(xué)習(xí)C#和用這種語(yǔ)言寫(xiě).Net的部件。
另一點(diǎn)要注意:基于.Net的SOAP將用于分布式通信,謹(jǐn)防性能損失。SOAP基本上意味著在HTTP上的XML。HTTP不是一個(gè)高性能的數(shù)據(jù)協(xié)議,因此XML隱含一個(gè)XML語(yǔ)法解析層,也就是需要更多的計(jì)算開(kāi)銷(xiāo)。兩者相結(jié)合會(huì)大大減少相對(duì)另一種發(fā)信/通信信道的事務(wù)處理速率。XML是一種非常豐富的、十分強(qiáng)大的發(fā)信用的元語(yǔ)言。HTTP是非常靈活可移動(dòng)的,因此可以防止許多防火墻的損失,但是如果事務(wù)處理速率對(duì)你是優(yōu)先考慮的話,請(qǐng)保持你的選項(xiàng)打開(kāi)。
對(duì)于Java和開(kāi)放資源委員會(huì)
請(qǐng)不要把.Net作為微軟市場(chǎng)競(jìng)爭(zhēng)的手段,繼續(xù)以你們喜愛(ài)的方式理解.Net可能更容易接受。但是.Net并不是一種精巧的標(biāo)志,而是微軟策略的重大轉(zhuǎn)移,將為其平臺(tái)帶來(lái)福音。他們正在為使其它的構(gòu)架和平臺(tái)在管理級(jí)上做得更好而奮斗。提供關(guān)于自身成本和無(wú)縫集成方面有用的可查詢的統(tǒng)計(jì)資料,F(xiàn)在他們正努力把Java和開(kāi)放資源自身所特有的元語(yǔ)言,逐步開(kāi)放,然后力圖直接滿足開(kāi)發(fā)商的需要。在過(guò)去一段時(shí)間里,由于他們沒(méi)有做好,兩件事情失敗了。如果你認(rèn)為自己是Java和無(wú)資源平臺(tái)的福音的傳播者,那么,競(jìng)爭(zhēng)的性質(zhì)就會(huì)改變。
另外,微軟的IL運(yùn)行時(shí),至少可能有一個(gè)值得注意的目標(biāo):就是清除編程語(yǔ)言進(jìn)入結(jié)構(gòu)框架的障礙。Java清除了平臺(tái)的障礙(當(dāng)然在有限范圍內(nèi),例如你不能沒(méi)有硬件資源來(lái)制作軟件)。但是為了用J2EE來(lái)作開(kāi)發(fā)工作,你必須在Java環(huán)境下工作。而.Net是想讓你使用你選擇的語(yǔ)言來(lái)建造.Net應(yīng)用程序,這是十分美妙的。盡管還有一些大問(wèn)題沒(méi)有解決。如:.Net中的IL方式什么時(shí)候和是否會(huì)實(shí)際上變成廣泛使用的(工具)(如上所述)。不管怎樣,這就表明了單語(yǔ)言的J2EE方式存在弱點(diǎn)。這個(gè)弱點(diǎn)的重要性可以懷疑,但是它依然存在,因此它值得Java委員會(huì)考慮。如果開(kāi)發(fā)商真的認(rèn)為是這樣,那么就可以把力量放在Java字節(jié)代碼生成器方面,以適應(yīng)非Java語(yǔ)言,當(dāng)然這需要組織和濃縮(匯總)。
再深入研究一下J2EE,立即可以得到一些結(jié)論。為了支撐該平臺(tái)和.Net相較量的優(yōu)勢(shì)。首先XML支持要無(wú)縫地集成到結(jié)構(gòu)框架中,我們且不說(shuō)將XML SAX/DOM語(yǔ)法解析器作為一組標(biāo)準(zhǔn)服務(wù)或者在配置元件中,擴(kuò)展XML的使用。這里需要XML的發(fā)信和操作處于隨時(shí)可用狀態(tài)。公認(rèn)的做法是在JMS頂端用XML的內(nèi)容發(fā)信,但是并不是所有的平臺(tái)都有這種設(shè)施,XML空間是一堆雜亂無(wú)章的標(biāo)準(zhǔn),非關(guān)鍵因素標(biāo)準(zhǔn),API和DTD是你處理元語(yǔ)言時(shí)期望的。
但是微軟已經(jīng)將SOAP放在基礎(chǔ)層,很難把某些可理解和有用的東西放到開(kāi)發(fā)商手里。J2EE的倡議者需要用他們的平臺(tái)做同樣的事。記住一種可能性是將XML發(fā)信提供者層放在JMS的頂部。后面緊接著Java命名和目錄接口或者帶LDAP的JNDI、NIS和COS命名等等。這種和標(biāo)準(zhǔn)SOAP/BizTalk供應(yīng)商,EBXML供應(yīng)商等等的結(jié)合將是種令人印象深刻的語(yǔ)句(說(shuō)明)。
澄清和更正:
由于本文在2000年8月份發(fā)表的,有40位讀者以他們關(guān)心.Net和J2EE對(duì)比的想法返回給我們(見(jiàn)讀者回信),本文作者Jim Farley篩選過(guò)這些內(nèi)容,同時(shí)用電子郵件回復(fù)他們,因此增加以下的澄清和更正。
澄清:
C#的編譯特點(diǎn)和Java的編譯特點(diǎn)對(duì)比似乎讓讀者產(chǎn)生混淆,為了更清楚一點(diǎn),我們用另一種方法比較:C#代碼總是以自然的形式運(yùn)行。Java代碼典型地是以解析型字節(jié)代碼運(yùn)行;C#可整個(gè)編譯成自然代碼,或者編譯到公共語(yǔ)言運(yùn)行時(shí)字節(jié)代碼中,然后在執(zhí)行期間逐次編譯自然代碼。另一方面,Java代碼典型地以運(yùn)行時(shí)解析型字節(jié)代碼方式運(yùn)行(據(jù)此,其交叉平臺(tái)能力可以增長(zhǎng))。同時(shí)也能夠以逐次編譯上下文連接方式運(yùn)行;也有了一些Java自然代碼編譯器(Jove、Bullet Train、JET等)。
作為旁注(附注),微軟要求遵循Java的約定解析性模式在這種模式中,設(shè)計(jì)用于虛擬機(jī)的字節(jié)代碼,本身不用于自然代碼優(yōu)化,我沒(méi)有看到有力的數(shù)據(jù)證明或反駁這個(gè)要求,(一般的應(yīng)針對(duì)字節(jié)代碼對(duì)比自然編譯語(yǔ)言,或者特殊針對(duì) Java對(duì)比C#)。
在回應(yīng)中,有幾位讀者指出J2EE支持XML,這說(shuō)明了這樣一個(gè)事實(shí):J2EE1.3版(現(xiàn)以草案方式發(fā)布)要求任何兼容J2EE的產(chǎn)品,必須包含Java XML SAX和DOM語(yǔ)法解析器。這正是我說(shuō)的“把XML SAX/DOM捆綁到Java上。我已經(jīng)要求他們采取進(jìn)一步措施,以J2EE支持API方式直接支持XML協(xié)同工作。最理想的方法是基于J2EE的部件和服務(wù),應(yīng)讓XML在某種程度上自動(dòng)支持內(nèi)建(對(duì)發(fā)信、接口描述、輸出等)。
更正:
我在本文中說(shuō):C#“借用了某些JavaBeans的部件概念”。這句話沒(méi)有證據(jù),正如幾位讀者指出,更合適的說(shuō)法是“微軟C#的功能多于它們本身的COM和VB模型,這是由于來(lái)自其它已有的部件模型的影響".