簡介Scala編程語言

巧樂茲 14年前發布 | 5K 次閱讀 Scala

Scala編程語言近來抓住了很多開發者的眼球。如果你粗略瀏覽Scala的網站,你會覺得Scala是一種純粹的面向對象編程語言,而又無縫地結合了命令式和函數式的編程風格。</span>

Christopher Diggins認為: 不太久之前編程語言還可以毫無疑義地歸類成“命令式”或者“函數式”。Scala代表了一個新的語言品種,它抹平了這些人為劃分的界限。
   根據David Rupp在博客中的說法,Scala可能是下下一代Java。這么高的評價讓人不禁想看看它到底是什么東西。
  Scala有幾項關鍵特性表明了它的面向對象的本質。例如,Scala中的每個值都是一個對象,包括基本數據類型(即布爾值、數字等)在內,連函數也是對象。另外,類可以被子類化,而且Scala還提供了基于mixin的組合(mixin-based composition)。
  與只支持單繼承的語言相比,Scala具有更廣泛意義上的類重用。Scala允許定義新類的時候重用“一個類中新增的成員定義(即相較于其父類的差異之處)”。Scala稱之為mixin類組合。
  Scala還包含了若干函數式語言的關鍵概念,包括高階函數(Higher-Order Function)、局部套用(Currying)、嵌套函數(Nested Function)、序列解讀(Sequence Comprehensions)等等。
  Scala是靜態類型的,這就允許它提供泛型類、內部類、甚至多態方法(Polymorphic Method)。另外值得一提的是,Scala被特意設計成能夠與Java和.NET互操作。Scala當前版本還不能在.NET上運行(雖然上一版可以-_-b),但按照計劃將來可以在.NET上運行。
  Scala可以與Java互操作。它用scalac這個編譯器把源文件編譯成Java的class文件(即在JVM上運行的字節碼)。你可以從Scala中調用所有的Java類庫,也同樣可以從Java應用程序中調用Scala的代碼。用David Rupp的話來說,
  它也可以訪問現存的數之不盡的Java類庫,這讓(潛在地)遷移到Scala更加容易。
  這讓Scala得以使用為Java1.4、5.0或者6.0編寫的巨量的Java類庫和框架,Scala會經常性地針對這幾個版本的Java進行測試。Scala可能也可以在更早版本的Java上運行,但沒有經過正式的測試。Scala以BSD許可發布,并且數年前就已經被認為相當穩定了。
  說了這么多,我們還沒有回答一個問題:“為什么我要使用Scala?”Scala的設計始終貫穿著一個理念:
  創造一種更好地支持組件的語言。(《The Scala Programming Language》,Donna Malayeri)
  也就是說軟件應該由可重用的部件構造而成。Scala旨在提供一種編程語言,能夠統一和一般化分別來自面向對象和函數式兩種不同風格的關鍵概念。
  藉著這個目標與設計,Scala得以提供一些出眾的特性,包括:
   面向對象風格
  
函數式風格
   更高層的并發模型
  Scala把Erlang風格的基于actor的并發帶進了JVM。開發者現在可以利用Scala的actor模型在JVM上設計具伸縮性的并發應用程序,它會自動獲得多核心處理器帶來的優勢,而不必依照復雜的Java線程模型來編寫程序。
  
輕量級的函數語法
  o 高階
  o 嵌套
  o 局部套用(Currying)
  o 匿名
   與XML集成
  o 可在Scala程序中直接書寫XML
  o 可將XML轉換成Scala類
  
與Java無縫地互操作
  Scala的風格和特性已經吸引了大量的開發者,比如Debasish Ghosh就覺得:
  我已經把玩了Scala好一陣子,可以說我絕對享受這個語言的創新之處。
  總而言之,Scala是一種函數式面向對象語言,它融匯了許多前所未有的特性,而同時又運行于JVM之上。隨著開發者對Scala的興趣日增,以及越來越多的工具支持,無疑Scala語言將成為你手上一件必不可少的工具。
  Scala與Groovy的對比
  去年早些時候,一篇名為“Scala,Groovy的殺手? ”的博客對Scala和Groovy進行了對比:
  Scala和Groovy之間的核心區別在于前者是靜態類型的。有些人可能爭辯說這使得達到腳本化目標變得更加復雜了,而腳本化正是Groovy的動機。然而,Scala有完整的體系特征,這使Groovy看上去更像個玩具。比如,Scala有“sequence comprehensions”。該要素導致對算法的表述非常緊湊和強大。
  Scala還有更多被證明是非常有用的特性,如嵌套類,currying和代數類型模式匹配。它還支持類似于JDK1.5所增加的泛型和注解。這些還都只是冰山一角。
  之后,Derek Young撰文“Scala對比Groovy:靜態類型是性能的關鍵”。在文中他舉了一個實際的例子,試圖說明針對同樣的算法,Scala的性能遠高于Groovy。
  然而,Scala并不是盡善盡美的,它也有一些明顯的缺陷。Rick Hightower在最近發表的一篇博客中,尖銳地批評了Scala的語法問題:
  Scala并不是更好的選擇。在閱讀了Scala的文檔之后,我的想法是:雖然這種語言的特性聽起來挺好,但是語法卻讓我想放棄。為什么事情非要為了不同而不同?Scala讓Groovy看起來比以前更加美味可口。
  憎恨是個很強烈的詞。我恨Scala的語法。請不要再推進這種語法了。……Scala有好的思想嗎?有。借用過來就行了……
  總而言之,Scala看起來像下一個被過度宣傳的語言。只需要把其精華引入到Groovy中,然后扔掉那些糟糕的語法。我最喜歡的Scala特性是推理類型和強類型。C#3.0也有這些。(我不用C#,不見得我不喜歡它的一些特性。)
  Rick Hightower還建議Sun應該在Groovy上進行投資,而不是對JRuby作無謂的投資。
  Groovy更像Java,更容易上手,語法也讓開發者不反感。為什么Sun在JRuby上投那么多錢呢?
  投資應該給Groovy。這樣了解Java的開發者可以更快地學習Groovy,而且如果有工具支持他們,那么就更可能這樣做。
  為了說明Sun投資在Ruby上的不明智,Rick Hightower還引用了一幅統計圖表來說明企業采用Ruby的趨勢還是比較低的:
  
498)this.style.width=498;">
圖1
 另外,無論是Ruby、Scala還是Groovy都有對應的Web框架,且對應的框架都是用各自對應的語言編寫的。這些框架分別是Rails、Lift和Grails。盡管Lift和Grails中的許多東西都從Rails借鑒來的,但是Grails對其他已有Java技術框架進行了很好的繼承,這無疑會保護用戶或廠商在這方面的已有投資。Grails框架參考文檔中這樣描述:
  Grails構建在這些概念之上,并且顯著地減少了在Java平臺上構建Web應用的復雜程度。不同的是,這些是建立在已確立的如Spring和Hibernate這樣的Java技術之上的。
  目前,Scala和Groovy兩種語言都在快速發展的過程中。就目前的情況來看,Groovy的優勢在于易用性以及與Java無縫銜接,Scala的優勢在于性能和一些高級特性,如果在發展過程中兩者能互相借鑒對方的優點來充實自身,對開發者來講無疑是福音。正如第一篇所引用的博客作者最后提到的那樣:
  大家并不想看到一場殊死斗爭,而是想看到更注重實效思想的Groovy團隊能與更具有學術思想的Scala團隊一起合作,制作出一門既強大又易用的語言。
  你會將賭注押在誰身上呢?</span></div>

 本文由用戶 巧樂茲 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
寫博客

博客分類