應IT168寫的專稿.http://tech.it168.com/j/2007-08-23/200708232214378.shtml
Java能為應用程序提供統一的平臺嗎?
自由紫風
Java作為一種成熟的語言,同時作為一種優秀的平臺,已經廣為接受。很多的程序員對Java技術很精通。如果說在進行軟件開發的時候,把Java這個平臺拋掉或對之置若罔聞,對現在的開發者來說,這是一件忍痛割愛的事情。不管是為了更好的提高程序的性能或是穩定性,還是看中了Java非常豐富的類庫,非Java應用程序在JVM上運行已經吊足了程序員的胃口。那么,Java可以為應用程序提供統一的運行平臺嗎?JVM能承擔這一艱巨的任務否?
一、 引言
最近筆者讀到一篇”Use Java to Improve Drupal's Scalability”的文章。作者(Geert Bevin)在使用Drupal(一套采用GPL授權的開放源碼軟件,它可以讓個人或社區使用者很容易地發表、管理并組織一個網站里大量且多樣的內容,已經有許多個人和組織采用Drupal來建立各種不同的網站)時遇到了程序穩定性方面的瓶頸。由于Drupal使用數據庫作為緩存,而PHP在跨越Request時是不會保存對象的狀態信息的,所以他決定使用Terracotta——一個JVM級的開源群集框架,能提供:HTTP Session復制,分布式緩存,POJO群集,跨越群集的JVM來實現分布式應用程序協調。使用這一替代方案后,盡管他也遇到了一些別的小問題,但穩定性的問題最終得以解決。同時,將PHP在Java下運行,還可以得到更加安全的運行環境。
上面的例子,我們可以看出,應用程序雖然采用了非Java的技術來構建,但最終在Java的環境下運行,并通過JVM來提高應用程序的穩定性和性能。而且,非Java編寫的程序可以在JVM上更加快速的運行,這是非常有意思且有意義的事情。而在不久之前,也許三年或四年前,程序員經常報怨,一種語言編寫的程序往往只能在特定的環境下運行。當然,這也包括Java本身。
當然,如今而言,這聽上去有點不夠人性化。因為不管是PHP應用程序,Ruby on Rails應用程序,或是.NET應用程序,似乎都可以在Java環境下運行了。更有甚者宣稱,這三種應用程序在Java環境下的運行效率比他們在各自特定的環境下運行的效率還要高。
不管是為了更好的提高程序的性能或是穩定性,還是看中了Java非常豐富的類庫,非Java應用程序在JVM上運行已經吊足了程序員的胃口。那么,Java可以為應用程序提供統一的運行平臺嗎?JVM能承擔這一艱巨的任務否?
二、 在JVM中運行.NET依舊能保證性能
Mainsoft公司最近發布了2.0版本的Mainsoft for Java EE(原名Visual Mainwin),同時發布的還有一份有趣的白皮書 。據該白皮書稱,一個基于.NET的應用程序,若是借助于Mainsoft for Java EE技術交叉編譯之后運行于Java EE平臺上,那么在某些方面的性能甚至會強于原有的.NET應用程序。
交叉編譯引擎將.NET Framework生成的Microsoft Intermediate Language(MSIL)交叉編譯成Java的字節代碼。然后基于Java的.NET Framework實現即可支持應用程序運行于Java平臺之上。不但如此,Visual Studio擴展還能夠允許開發者在Java EE平臺上編寫、編譯、部署以及調試Web或服務器應用程序。
因為代碼的交叉編譯發生于字節碼級別,所以其過程并不需要源文件轉換——這就意味著開發者仍舊可以使用Visual Studio.Net作為他們可移植程序的開發環境。Mainsoft還使用Java重新實現了很大的一部分.NET Framework,包括ASP.Net、ADO.Net以及Web Service API等。不過因為Mainsoft for Java EE主要專注于Web以及服務器應用程序方面,所以類似Windows Form的組件則沒有提供。

圖1. 將ASP.NET和.NET Server部署在Java EE上示意圖
遷移后的Java EE應用程序可以運行于IBM WebSphere、BEA WebLogic和Apache Tomcat之上。在完全相同的硬件條件下,遷移后的Java EE應用程序(運行于WebSphere之上):每秒處理請求數(Requests Per Second,RPS)比原有.NET應用程序提高了8%;具有更好的CPU可伸縮性 ,在RPS方面幾乎是線性增長的;在各種經過測試的負載情況下,都提高了至少4%的響應時間;在重負載情況下,RPS提高了至少5% 。
從客戶的角度來看這的確是一種很好且很吸引人的技術,比如客戶已經傾向于J2EE的解決方案,而對原有的某些采用.NET實現的系統,假期再采用J2EE來重寫,其中的人力物力的浪費可想而知。此外.NET和J2EE平臺現在來很難說誰優誰劣,各有所長,如果能夠發揮各自的優勢豈不是非常妙的事情。
通常要實現.NET與J2EE之間的互操作只能通過高層接口,如WebService等,效率比較低,此外必須部署和維護不同的操作系統等問題,現在可以把.NET的程序編譯成JVM Bytecode,如此一來,兩類程序可以融合在一塊。不過互操作還是得通過高層接口才能實現,不知道Mainsoft在他們之間的互操作上有什么好方法。這方面有JIntegra的產品,ArcGIS用的就是這個產品。
三、 Ruby on JVM
Ruby on JVM就是說把Ruby放到JVM上運行,換句話說,在JVM這個平臺上可以去運行Ruby,為什么會把Ruby放到JVM上運行呢?因為很多人最奇怪的這一個問題就是,Ruby有它自己的平臺,它為什么就會放到JVM上運行?實際上,廣大的程序員們已經知道,Java本身是已經被大家廣為接受的一個平臺,已經有很多的程序員非常熟悉Java技術知識,所以說Java這個平臺本身已經得到了大家的一個認可,那么,如果在開發的時候把Java這個平臺去拋掉不利用,對Java開發者來說,這是一件不可能的事情。
Ruby可能現在受程序員所關注,可能主要是由于Ruby on rails的興起,而Ruby on rails帶給大家的是什么呢?最主要的體現是開發效率的提升。有媒體宣稱Ruby on Rails可以給軟件開發帶來十倍開發效率的提升,當然這不排除炒作的成分。即便拋去這個廣告因素來說,可能也確確實實有幾倍的效率提升。而人們總是愿意用這種最少的力量去干盡可能多的事情,那既然有像Ruby這么好的開發語言,人們則希望能把Ruby運用在自己的實際的工作之中。如果把Ruby這樣好的語言編寫的程序,和Java這樣一個比較成熟的平臺,兩者結合起來的話,則能把二者的優勢結合起來,對程序員來說也是一個非常好的選擇。
Ruby的優點就是它開發效率高,而Java的優點就是它資源非常豐富。而在企業級應用,已經有大量且成熟的Java EE解決方案,這樣兩者可以互補。如果把Ruby放到JVM這個平臺上,在Ruby的代碼里就可以使用Java的類庫。而Java已經有很多現成的且做得很好的類庫及解釋方案,都可以在Ruby代碼中得到復用;另外一方面,可以把Ruby的應用部署到JVM上。
要使Ruby運行在JVM上,主要的方式有兩種。第一,因為Ruby是一種解釋性的語言,利用Java開發一個Ruby的解釋器,然后讓Ruby的應用程序運行在JVM平臺上,而這也確確實實是現在可能比較主流的方式——JRuby;那另外一種方式,除了解釋的方式外,還可以采用編譯的方式,把Ruby的代碼編譯成Java Bytecode,然后讓Bytecode去運行在JVM的平臺上——XRuby。
四、 JVM——高層次的OS
在這樣的一場游戲中,我們似乎可以把Java看作為構建于OS(操作系統)之上高層次的OS——可以為應用程序或框架提供重要的底層服務及功能。但這些服務及功能非一般的普通OS技術能提供,例如普通的OS可能有:內存管理;線程,處理及同步;執行本地程序或解釋Shell腳本。而JVM這層OS,可提供:簡易的垃圾回收;在應用程序中對內存進行安全管理;即時編譯技術(JIT,Just In Time)執行動態代碼。
在Windows程序設計領域處于發展初期時,Windows程序員可使用的編程工具唯有API函數。這些函數在程序員手中猶如“積木塊”一樣,可搭建出各種界面豐富、功能靈活的應用程序。不過,由于這些函數結構復雜,所以往往難以理解,而且容易誤用。而隨著軟件技術的不斷發展,在Windows平臺上出現了很多優秀的可視化編程環境,程序員可以采用“所見即所得”的編程方式來開發具有精美用戶界面和功能的應用程序。這些可視化編程環境操作簡便、界面友好,比如:Visual C++,Delphi,Visual Basic等等。在這些工具中提供了大量的類庫和各種控件,它們替代了API的神秘功能。事實上,這些類庫和控件都是構筑在Windows API的基礎上的,但它們使用方便,加速了Windows應用程序的開發,所以受到程序員的普遍采用。有了這些類庫和控件,程序員們便可以把主要精力放在 整體功能的設計上,而不必過于關注具體細節。不過,這也導致了非常多的程序員在類庫面前“固步自封”,對下層API函數的強大功能一無所知。
當OS技術開始流行后,隨著C/S開發模式的發展,每種語言/編譯器/IDE等都具有各自專用的API和運行時。因此,在程序員的世界里充滿了各種各樣的內庫及可供程序員調用的組件,有如Glibs/MSVC、OWL/MFC、VBRUN、Smalltalk VMs等等。
Java和.NET都競爭著開發高層次的OS。.NET由于嵌入進了Windows操作系統,因此顯得更加的專業。但是,Java顯然更加的關注如何使JVM為更多的開發語言提供更寬闊的平臺。因此,Sun宣稱,Java EE 7將會為更多的開發語言提供更好的統一平臺。當然開源的Java JDK將使這一宣稱更具可操作性,使Java不但可以嵌入到Windows中去,同時還有Solaris……
五、 小論
網上已經有將CRL Bytecode轉成Java bytecode的編譯器。據稱,這使用得在.NET環境下開發的應用程序,其運行速度比在.NET環境下要塊得多。同時,最近,相關組織已經采用Java開發了兩個操作系統:JX和JNode,當然這只是很前沿的探索,并非像Windows一樣的成熟。IBM也宣稱要在這方面進行更大的投入研究。同時,BEA采用Java開發的LiquidVM不再需要操作系統,它可以在自己的VMWare上運行。
我們有理由相信,走過了十多年風風雨雨的Java,是有足夠的能力和潛力為應用程序提供一個統一的運行平臺的。不管是PHP應用程序,Ruby on Rails應用程序,或是.NET應用程序,應該都可以在Java環境下運行,且應用程序在Java環境下的運行效率比在他們各自特定的環境下運行的效率還要高。這就是Java的魅力,同時也是它的潛力。