“Java虛擬機(jī)”令程序員迷失?
Java目前不可謂不火,但是由于JVM虛擬機(jī)帶來(lái)的一些問(wèn)題隱患,不得不引起我們的注意。虛擬機(jī)甚至可能將Java帶入萬(wàn)劫不復(fù)的境地。
在Java出現(xiàn)之前我一直是Smalltalk(注:Smalltalk被公認(rèn)為歷史上第二個(gè)面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,和第一個(gè)真正的集成開(kāi)發(fā)環(huán)境。)的愛(ài)好者。從Smalltalk轉(zhuǎn)向Java的經(jīng)歷,到現(xiàn)在依然讓我記憶猶新,從一門(mén)語(yǔ)言轉(zhuǎn)向另一門(mén)語(yǔ)言并不是一件輕松的事情。我依然記得當(dāng)你真正掌握這門(mén)新語(yǔ)言時(shí)所到達(dá)的臨界狀態(tài),掌握一門(mén)新語(yǔ)言往往需要花費(fèi)數(shù)月甚至數(shù)年的時(shí)間,經(jīng)過(guò)這段時(shí)間的歷練,你才能做出真正優(yōu)秀的設(shè)計(jì),以及知道如何最好的應(yīng)用它的哪一個(gè)模式,如何避免錯(cuò)誤發(fā)生,以及如何進(jìn)行性能調(diào)優(yōu)等等。
最近因?yàn)楣ぷ餍枰乙剡^(guò)頭來(lái)看一些以前的Smalltalk代碼,這時(shí)我發(fā)現(xiàn),在經(jīng)歷過(guò)這一段學(xué)習(xí)Java編程的階段后,我已經(jīng)很難清晰的理解過(guò)去自己所編寫(xiě)的Smalltalk代碼,很明顯,我肯定不能再稱自己是一個(gè)合格的Smalltalk程序員。
說(shuō)這些只是為了表達(dá)我的一個(gè)觀點(diǎn):我認(rèn)為每個(gè)人只可能精通一門(mén)編程語(yǔ)言,換句話說(shuō),如果你什么都精通,其實(shí)也就說(shuō)你什么都精通。我喜歡一個(gè)只有一門(mén)語(yǔ)言、漂亮簡(jiǎn)單的“扁平結(jié)構(gòu)”世界。在這樣一個(gè)世界中,程序員之間交流會(huì)變得更加輕松,每個(gè)人可以彼此分享共同的經(jīng)驗(yàn),而且不也不用來(lái)回的在不同的語(yǔ)言之間跳來(lái)跳去。
當(dāng)Java第一次面世的時(shí)候,曾經(jīng)有些Java虛擬機(jī)方面的家伙進(jìn)行一些沒(méi)有前途的嘗試:讓Java運(yùn)行在Smalltalk虛擬機(jī)上。盡管他們擁有一個(gè)非常酷的叫做通用虛擬機(jī)(Universal Virtual Machine,UVM)的技術(shù),但是歸根到底,這實(shí)際上還是一個(gè)保護(hù)Smalltalk地盤(pán)的反抗行為。從理論上說(shuō)這可能是一個(gè)好的思路,人們不再用必須學(xué)習(xí)一種新的語(yǔ)法就可以體驗(yàn)新語(yǔ)言的好處;但是實(shí)際上并非如此,使用Java本地接口JNI編程來(lái)使兩者聯(lián)系起來(lái)是一件令程序員非常痛苦的事情,這簡(jiǎn)直就是一場(chǎng)噩夢(mèng),程序員在編程的時(shí)候要陷入很多麻煩,例如在不同語(yǔ)言類型之間存在很多數(shù)據(jù)類型轉(zhuǎn)化的問(wèn)題。
要想在Java下進(jìn)行Smalltalk編程,或者在Smalltalk下進(jìn)行Java編程,你需要非常精通兩種語(yǔ)言,而且你需要擁有一個(gè)非常發(fā)達(dá)的大腦來(lái)調(diào)試虛擬機(jī)注冊(cè)表和大量設(shè)置DOS堆棧的個(gè)數(shù)。
數(shù)年以來(lái),微軟的家伙一直在抨擊Java程序的速度慢,它們認(rèn)為Java程序是解釋型字節(jié)碼,而不是完全編譯好的,這也是人們懷疑Java性能的一個(gè)主要借口,而多數(shù)微軟的語(yǔ)言則都被編譯為解釋好的p-code。然而現(xiàn)在微軟又開(kāi)始鼓吹它的通用語(yǔ)言運(yùn)行時(shí)(CLR),將其稱為編程的圣杯。這一點(diǎn)和 Smalltalk/Java混合UVM非常相似。實(shí)際上,CLR上似乎只運(yùn)行微軟的語(yǔ)言,自從其問(wèn)世以來(lái)并沒(méi)有引起太多其他語(yǔ)言的程序員倒戈。
現(xiàn)在有一種現(xiàn)象令我感到非常憂慮,“Java虛擬機(jī)可以完成一切”的觀點(diǎn)正在逐漸復(fù)蘇。人們的精力不再集中在Java和這個(gè)語(yǔ)言向前發(fā)展所需要的改進(jìn)上,人們把精力都投入到讓Java虛擬機(jī)JVM去運(yùn)行Ruby、PHP或其它同類流行語(yǔ)言上,還有讓Java虛擬機(jī)支持Java FX這個(gè)幾乎和Java語(yǔ)法無(wú)關(guān)的技術(shù)上。如果這一切都實(shí)現(xiàn)了,留給我們的又是什么呢?
我們擁有了一個(gè)不僅僅可以運(yùn)行Java還可以運(yùn)行其它語(yǔ)言的虛擬機(jī);我們擁有了很多不使用Java編寫(xiě)但可以編譯為Java的語(yǔ)言;我們擁有一些失去了自身價(jià)值定位的東西。換言之,我們迷失了自己的方向,失去了準(zhǔn)確的定位。
對(duì)于我們這些編程序的人來(lái)說(shuō),我依然認(rèn)為熟練掌握多種語(yǔ)言實(shí)際上是行不通的,我們最終會(huì)變?yōu)槎鞒绦騿T,只能編寫(xiě)性能糟糕和設(shè)計(jì)惡劣的程序,更不用說(shuō)隨著環(huán)境和語(yǔ)言的切換,調(diào)試方面的噩夢(mèng)隨處可見(jiàn)。
那么為什么人們對(duì)虛擬機(jī)的熱情如此高漲呢?你或許會(huì)說(shuō),其它語(yǔ)言是動(dòng)態(tài)的而Java是靜態(tài)的;或者其它語(yǔ)言像PHP、Ruby更適于Web編程;或者什么其它的原因?這些都是現(xiàn)實(shí),不過(guò)我認(rèn)為,我們應(yīng)該去完善Java來(lái)解決這些問(wèn)題,而不是增加復(fù)雜度朝著虛擬機(jī)使勁,讓其支持這些幾年前已經(jīng)不存在的語(yǔ)言。對(duì)于Java來(lái)說(shuō),沒(méi)有什么錯(cuò)誤和難題是不可以被解決的。我認(rèn)為這才是人們應(yīng)該關(guān)注的地方,而不是讓JVM變成一個(gè)雜而不精的東西,否者Java最終將面臨與Smalltalk相同的命運(yùn)。
歷史總是在驚人的重復(fù),如果我們不把Java看作一門(mén)語(yǔ)言,而僅僅看作是一些“Java技術(shù)”之類的東西的話,我們就正在讓它走向滅亡,使其相對(duì)于其它語(yǔ)言的優(yōu)勢(shì)逐漸削弱,同時(shí)也讓編寫(xiě)優(yōu)秀軟件變?yōu)橐患y的事情。
【編輯推薦】