First they ignore you
          then they ridicule you
          then they fight you
          then you win
              -- Mahatma Gandhi
          Chinese => English     英文 => 中文             
          隨筆-221  評(píng)論-1047  文章-0  trackbacks-0
          讓我們來(lái)回顧一下主流語(yǔ)言的發(fā)展歷程:機(jī)器語(yǔ)言(由01組成) -> 匯編語(yǔ)言 -> ... ->?C語(yǔ)言 -> C++ -> Java -> ?

          不知道大家有沒(méi)有發(fā)現(xiàn)在語(yǔ)言發(fā)展過(guò)程中,存在這么一個(gè)規(guī)律:能成為未來(lái)主流語(yǔ)言的,必與當(dāng)前主流語(yǔ)言屬同一‘語(yǔ)系’,換句話說(shuō),由王子繼承王位。

          在C語(yǔ)言之前,似乎還處于‘春秋戰(zhàn)國(guó)’,各種編程語(yǔ)言混戰(zhàn),于20世紀(jì)70年代,C語(yǔ)言成為‘秦始皇’,各種軟件甚至操作系統(tǒng)也改用C語(yǔ)言編寫。但可惜C語(yǔ)言是面向過(guò)程的,程序代碼一多,邏輯流程就容易混亂,再加上全局變量和可運(yùn)算指針的添亂,使程序員調(diào)試程序萬(wàn)般辛苦。

          20世紀(jì)80年代,C++應(yīng)運(yùn)而生,它繼承了C語(yǔ)言(包括C語(yǔ)言的語(yǔ)法),并添加了類等特性,使C++成為一種面向?qū)ο蟮恼Z(yǔ)言。但C++的多繼承,人工內(nèi)存管理,從C語(yǔ)言那里繼承的可運(yùn)算指針等問(wèn)題同樣使程序員萬(wàn)般痛苦。

          20世紀(jì)90年代,正當(dāng)人們飽受煎熬的時(shí)候,Java誕生了,她去除了C++中的糟粕,保留了C++中的精華(包括語(yǔ)法),并添加了一些自己的特性,比如垃圾回收器,接口等。我聽(tīng)很多由C++轉(zhuǎn)Java的朋友說(shuō)過(guò)這么一句話:用Java寫程序簡(jiǎn)直是一種享受??上ava的那優(yōu)美的語(yǔ)法使之失去了‘輕盈’的身軀,程序員需要寫相對(duì)比較多的代碼來(lái)完成同樣的功能。此外Java代碼即使編譯為class文件,也能被“高質(zhì)量”反編譯為Java文件獲得源碼。

          21世紀(jì)初,Groovy(?http://groovy.codehaus.org? 背后有SpringSource,Big Sky等公司的支持)橫空出世,她幾乎兼容Java的所有語(yǔ)法,并能無(wú)需轉(zhuǎn)換直接利用Java所寫的類及接口,在Spring2中可以透明地注入Groovy對(duì)象(與注入Java對(duì)象沒(méi)有任何區(qū)別),且擁有自己的一些‘敏捷’特性,如動(dòng)態(tài)類型,Closure,Mixins等,以及對(duì)應(yīng)J2EE中如JSP, Servlet的Groovy敏捷版--GSP以及Groovlet等,不但如此她還擁有Ruby最引以為傲的Ruby on Rails的對(duì)應(yīng)實(shí)現(xiàn)版本但非克?。璆rails(?http://grails.org? 背后有SpringSource和Oracle的支持),此外Groovy代碼編譯為class文件后,即使不混淆,反編譯后獲得的Java源代碼也“極難”讀懂(換句話說(shuō),如果您能讀懂這些反編譯得來(lái)的源碼,那您早就用不著hack人家的class文件了),原因是Groovy自身就是用Java編寫的,class文件烙有Groovy的印跡。?指代誰(shuí)至今還不太明了,但Groovy至少已經(jīng)具備了繼承王位的必要條件--語(yǔ)言本身是利用當(dāng)前主流語(yǔ)言所編寫,并與當(dāng)前主流語(yǔ)言的語(yǔ)法相似,且能夠結(jié)束當(dāng)前主流語(yǔ)言的弊病

          綜上所述,選擇Java世界中動(dòng)態(tài)語(yǔ)言Groovy(Groovy = Java + Python + Ruby + Smalltalk),至少是明智的,不僅因?yàn)樗荍VM上JCP全票通過(guò)的官方標(biāo)準(zhǔn)語(yǔ)言,更因?yàn)樗砩暇哂型鮾?chǔ)的特質(zhì)。Groovy之于Java猶如Java之于C++。另外,由于Groovy本身就是用Java寫的,所以對(duì)Groovy的‘投資’能夠得到保值。因?yàn)镚roovy的程序能運(yùn)行于JDK1.4+之上,所以Groovy的新特性(比如Groovy1.1中新添加的Annotations以及static import)不會(huì)像Java中的新特性(比如Java5中的Generics以及Annotations等)那樣無(wú)法在舊版JDK上使用,這就起到了保值作用。如果說(shuō)Java實(shí)現(xiàn)了跨平臺(tái),那么Groovy不僅實(shí)現(xiàn)了跨平臺(tái)而且實(shí)現(xiàn)了跨Java平臺(tái)。

          附關(guān)于Groovy的JCP投票結(jié)果:




          再來(lái)看一個(gè)Groovy官方網(wǎng)站(?http://groovy.codehaus.org )上的例子,在官方網(wǎng)站上還有許多教程和應(yīng)用實(shí)例,大家不妨去看看。
          利用已存在的Java類庫(kù):
          import?org.apache.commons.lang.WordUtils

          class?Greet?{
          ??def?name
          ??Greet(who)?{?name?
          =?who[0].toUpperCase()?+?who[1..-1]?}
          ??def?salute()?{?println?
          "Hello?$name!"?}
          }

          class?Greeter?extends?Greet?{
          ??Greeter(who)?{?name?
          =?WordUtils.capitalize(who)?}
          }

          new?Greeter('world').salute()


          最后,看看Groovy與其他Java世界的動(dòng)態(tài)語(yǔ)言的受關(guān)注程度的比較吧,從圖中可以看出,Groovy有壓倒性趨勢(shì):



          --------------------------------------------------------------------------------------
          文中提到的通過(guò)反編譯獲得源碼:
          HelloWorld.groovy編譯為HelloWorld.class,然后將HelloWorld.class反編譯為HelloWorld.java

          HelloWorld.groovy的源碼:
          class?HelloWorld?{
          ????
          static?void?main(String[]?args)?{
          ??????????println?
          "Hello,?world!"
          ????}
          }


          HelloWorld.class反編譯得到的Java文件HelloWorld.java:
          //?Decompiled?by?Jad?v1.5.8g.?Copyright?2001?Pavel?Kouznetsov.
          //?Jad?home?page:?http://www.kpdus.com/jad.html
          //?Decompiler?options:?packimports(3)?
          //?Source?File?Name:???HelloWorld.groovy

          import?groovy.lang.GroovyObject;
          import?groovy.lang.MetaClass;
          import?org.codehaus.groovy.runtime.ScriptBytecodeAdapter;

          public?class?HelloWorld
          ????
          implements?GroovyObject
          {

          ????
          public?HelloWorld()
          ????{
          ????????MetaClass?metaclass;
          ????????Class?class1?
          =?HelloWorld.class;
          ????????Class?class2?
          =?groovy.lang.MetaClass.class;
          ????????metaclass?
          =?(MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1,?org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class,?"initMetaClass",?new?Object[]?{
          ????????????
          this
          ????????}),?class2);
          ????????metaclass;
          ????????(MetaClass)ScriptBytecodeAdapter.castToType(metaclass,?class2);
          ????????
          this;
          ????????JVM?INSTR?swap?;
          ????????metaClass;
          ????????JVM?INSTR?pop?;
          ????}

          ????
          public?static?void?main(String?args[])
          ????{
          ????????Class?class1?
          =?HelloWorld.class;
          ????????Class?class2?
          =?groovy.lang.MetaClass.class;
          ????????ScriptBytecodeAdapter.invokeStaticMethodN(class1,?class1,?
          "println",?new?Object[]?{
          ????????????
          "Hello,?world!"
          ????????});
          ????}

          ????
          public?MetaClass?getMetaClass()
          ????{
          ????????Class?class2;
          ????????MetaClass?metaclass;
          ????????Class?class1?
          =?HelloWorld.class;
          ????????class2?
          =?groovy.lang.MetaClass.class;
          ????????
          if(!ScriptBytecodeAdapter.compareEqual(metaClass,?null))
          ????????????
          break?MISSING_BLOCK_LABEL_118;
          ????????metaclass?
          =?(MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1,?org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class,?"initMetaClass",?new?Object[]?{
          ????????????
          this
          ????????}),?class2);
          ????????metaclass;
          ????????(MetaClass)ScriptBytecodeAdapter.castToType(metaclass,?class2);
          ????????
          this;
          ????????JVM?INSTR?swap?;
          ????????metaClass;
          ????????JVM?INSTR?pop?;
          ????????
          return?(MetaClass)ScriptBytecodeAdapter.castToType(metaClass,?class2);
          ????}

          ????
          public?Object?invokeMethod(String?method,?Object?arguments)
          ????{
          ????????Class?class1;
          ????????MetaClass?metaclass;
          ????????class1?
          =?HelloWorld.class;
          ????????Class?class2?
          =?groovy.lang.MetaClass.class;
          ????????
          if(!ScriptBytecodeAdapter.compareEqual(metaClass,?null))
          ????????????
          break?MISSING_BLOCK_LABEL_121;
          ????????metaclass?
          =?(MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1,?org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class,?"initMetaClass",?new?Object[]?{
          ????????????
          this
          ????????}),?class2);
          ????????metaclass;
          ????????(MetaClass)ScriptBytecodeAdapter.castToType(metaclass,?class2);
          ????????
          this;
          ????????JVM?INSTR?swap?;
          ????????metaClass;
          ????????JVM?INSTR?pop?;
          ????????
          return?ScriptBytecodeAdapter.invokeMethodN(class1,?metaClass,?"invokeMethod",?new?Object[]?{
          ????????????
          this,?method,?arguments
          ????????});
          ????}

          ????
          public?Object?getProperty(String?property)
          ????{
          ????????Class?class1;
          ????????MetaClass?metaclass;
          ????????class1?
          =?HelloWorld.class;
          ????????Class?class2?
          =?groovy.lang.MetaClass.class;
          ????????
          if(!ScriptBytecodeAdapter.compareEqual(metaClass,?null))
          ????????????
          break?MISSING_BLOCK_LABEL_118;
          ????????metaclass?
          =?(MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1,?org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class,?"initMetaClass",?new?Object[]?{
          ????????????
          this
          ????????}),?class2);
          ????????metaclass;
          ????????(MetaClass)ScriptBytecodeAdapter.castToType(metaclass,?class2);
          ????????
          this;
          ????????JVM?INSTR?swap?;
          ????????metaClass;
          ????????JVM?INSTR?pop?;
          ????????
          return?ScriptBytecodeAdapter.invokeMethodN(class1,?metaClass,?"getProperty",?new?Object[]?{
          ????????????
          this,?property
          ????????});
          ????}

          ????
          public?void?setProperty(String?property,?Object?value)
          ????{
          ????????Class?class1;
          ????????MetaClass?metaclass;
          ????????class1?
          =?HelloWorld.class;
          ????????Class?class2?
          =?groovy.lang.MetaClass.class;
          ????????
          if(!ScriptBytecodeAdapter.compareEqual(metaClass,?null))
          ????????????
          break?MISSING_BLOCK_LABEL_121;
          ????????metaclass?
          =?(MetaClass)ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.invokeStaticMethodN(class1,?org.codehaus.groovy.runtime.ScriptBytecodeAdapter.class,?"initMetaClass",?new?Object[]?{
          ????????????
          this
          ????????}),?class2);
          ????????metaclass;
          ????????(MetaClass)ScriptBytecodeAdapter.castToType(metaclass,?class2);
          ????????
          this;
          ????????JVM?INSTR?swap?;
          ????????metaClass;
          ????????JVM?INSTR?pop?;
          ????????ScriptBytecodeAdapter.invokeMethodN(class1,?metaClass,?
          "setProperty",?new?Object[]?{
          ????????????
          this,?property,?value
          ????????});
          ????????
          return;
          ????}

          ????
          public?void?setMetaClass(MetaClass?value)
          ????{
          ????????Class?class2;
          ????????Class?class1?
          =?HelloWorld.class;
          ????????class2?
          =?groovy.lang.MetaClass.class;
          ????????value;
          ????????(MetaClass)ScriptBytecodeAdapter.castToType(value,?class2);
          ????????
          this;
          ????????JVM?INSTR?swap?;
          ????????metaClass;
          ????????JVM?INSTR?pop?;
          ????}

          ????
          void?super$1$wait()
          ????{
          ????????
          super.wait();
          ????}

          ????String?
          super$1$toString()
          ????{
          ????????
          return?super.toString();
          ????}

          ????
          void?super$1$wait(long?l)
          ????{
          ????????
          super.wait(l);
          ????}

          ????
          void?super$1$notify()
          ????{
          ????????
          super.notify();
          ????}

          ????
          void?super$1$notifyAll()
          ????{
          ????????
          super.notifyAll();
          ????}

          ????Class?
          super$1$getClass()
          ????{
          ????????
          return?super.getClass();
          ????}

          ????
          boolean?super$1$equals(Object?obj)
          ????{
          ????????
          return?super.equals(obj);
          ????}

          ????Object?
          super$1$clone()
          ????{
          ????????
          return?super.clone();
          ????}

          ????
          int?super$1$hashCode()
          ????{
          ????????
          return?super.hashCode();
          ????}

          ????
          void?super$1$wait(long?l,?int?i)
          ????{
          ????????
          super.wait(l,?i);
          ????}

          ????
          void?super$1$finalize()
          ????{
          ????????
          super.finalize();
          ????}

          ????
          transient?MetaClass?metaClass;
          ????
          public?static?Long?__timeStamp;

          ????
          static?
          ????{
          ????????Long?long1;
          ????????Class?class1?
          =?HelloWorld.class;
          ????????Class?class2?
          =?groovy.lang.MetaClass.class;
          ????????long1?
          =?new?Long(0x1121e0ead4dL);
          ????????Long?_tmp?
          =?long1;
          ????????__timeStamp?
          =?(Long)long1;
          ????}
          }



          附:通過(guò)與Java的比較,迅速掌握Groovy
          posted on 2007-03-03 01:16 山風(fēng)小子 閱讀(9782) 評(píng)論(14)  編輯  收藏 所屬分類: Groovy & Grails
          主站蜘蛛池模板: 华安县| 射阳县| 区。| 常德市| 鄯善县| 铜鼓县| 巴楚县| 乌鲁木齐县| 上饶市| 洞口县| 星子县| 晋中市| 博客| 革吉县| 祁阳县| 克什克腾旗| 翁源县| 洪洞县| 宾阳县| 静海县| 永川市| 天津市| 凤山县| 姜堰市| 儋州市| 类乌齐县| 江阴市| 永胜县| 清苑县| 四子王旗| 原阳县| 西平县| 仁怀市| 阳春市| 雷山县| 巫溪县| 万州区| 金乡县| 台州市| 汪清县| 抚顺县|