Java以外的選擇 Scala編程語(yǔ)言簡(jiǎn)介
51CTO編輯推薦:Scala編程語(yǔ)言專題
Scala編程語(yǔ)言近來(lái)抓住了很多開發(fā)者的眼球。如果你粗略瀏覽Scala的網(wǎng)站,你會(huì)覺得Scala是一種純粹的面向?qū)ο缶幊陶Z(yǔ)言,而又無(wú)縫地結(jié)合了命令式和函數(shù)式的編程風(fēng)格。Christopher Diggins認(rèn)為:不太久之前編程語(yǔ)言還可以毫無(wú)疑義地歸類成“命令式”或者“函數(shù)式”。Scala代表了一個(gè)新的語(yǔ)言品種,它抹平了這些人為劃分的界限。
根據(jù)David Rupp在博客中的說(shuō)法,Scala可能是下下一代Java。這么高的評(píng)價(jià)讓人不禁想看看它到底是什么東西。
一種可伸縮語(yǔ)言
Scala 的名稱表明,它還是一種高度可伸縮的語(yǔ)言。
Scala 是一種函數(shù)對(duì)象混合的語(yǔ)言,具有一些強(qiáng)大的優(yōu)點(diǎn):
◆ 首先,Scala 可編譯為 Java 字節(jié)碼,這意味著它在 JVM 上運(yùn)行。除了允許繼續(xù)利用豐富的 Java 開源生態(tài)系統(tǒng)之外,Scala 還可以集成到現(xiàn)有的 IT 環(huán)境中,無(wú)需進(jìn)行遷移。
◆ 其次,Scala 基于 Haskell 和 ML 的函數(shù)原則,大量借鑒了 Java 程序員鐘愛的面向?qū)ο蟾拍?。因此,它可以將兩個(gè)領(lǐng)域的優(yōu)勢(shì)混合在一起,從而提供了顯著的優(yōu)點(diǎn),而且不會(huì)失去我們一直依賴的熟悉的技術(shù)。
◆ 最后,Scala 由 Martin Odersky 開發(fā),他可能是 Java 社區(qū)中研究 Pizza 和 GJ 語(yǔ)言的最著名的人,GJ 是 Java 5 泛型的工作原型。而且,它給人一種 “嚴(yán)肅” 的感覺;該語(yǔ)言并不是一時(shí)興起而創(chuàng)建的,它也不會(huì)以同樣的方式被拋棄。
Scala有幾項(xiàng)關(guān)鍵特性表明了它的面向?qū)ο蟮谋举|(zhì)。例如,Scala中的每個(gè)值都是一個(gè)對(duì)象,包括基本數(shù)據(jù)類型(即布爾值、數(shù)字等)在內(nèi),連函數(shù)也是對(duì)象。另外,類可以被子類化,而且Scala還提供了基于mixin的組合(mixin-based composition)。
與只支持單繼承的語(yǔ)言相比,Scala具有更廣泛意義上的類重用。Scala允許定義新類的時(shí)候重用“一個(gè)類中新增的成員定義(即相較于其父類的差異之處)”。Scala稱之為mixin類組合。
Scala還包含了若干函數(shù)式語(yǔ)言的關(guān)鍵概念,包括高階函數(shù)(Higher-Order Function)、局部套用(Currying)、嵌套函數(shù)(Nested Function)、序列解讀(Sequence Comprehensions)等等。
Scala中常用的一些設(shè)計(jì)模式:
◆ Singleton(單體模式)
◆ Strategy(策略模式)
◆ Factory(工廠模式)
◆ Vistor(訪問(wèn)者模式)
◆ Decorator(裝飾模式)
與許多最近開始在 Java 平臺(tái)上占有一席之地的動(dòng)態(tài)語(yǔ)言不同,Scala 是靜態(tài)類型的,這就允許它提供泛型類、內(nèi)部類、甚至多態(tài)方法(Polymorphic Method),正如 Java 代碼一樣。但是,與 Java 平臺(tái)不同,Scala 大量利用了類型推斷(type inferencing),這意味著,編譯器深入分析代碼以確定特定值的類型,無(wú)需編程人員干預(yù)。類型推斷需要較少的冗余類型代碼。另外值得一提的是,Scala被特意設(shè)計(jì)成能夠與Java和.NET互操作。Scala當(dāng)前版本還不能在.NET上運(yùn)行(雖然上一版可以-_-b),但按照計(jì)劃將來(lái)可以在.NET上運(yùn)行。
大量的其他函數(shù)功能(比如模式匹配)已經(jīng)被引入到 Scala 語(yǔ)言中,但是將其全部列出超出了本文的范圍。Scala 還添加許多目前 Java 編程中沒有的功能,比如操作符重載(它完全不像大多數(shù) Java 開發(fā)人員所想象的那樣), 具有 “更高和更低類型邊界” 的泛型、視圖等。與其他功能相比,這些功能使得 Scala 在處理特定任務(wù)方面極其強(qiáng)大,比如處理或生成 XML。
Scala可以與Java互操作。它用scalac這個(gè)編譯器把源文件編譯成Java的class文件(即在JVM上運(yùn)行的字節(jié)碼)。你可以從Scala中調(diào)用所有的Java類庫(kù),也同樣可以從Java應(yīng)用程序中調(diào)用Scala的代碼。用David Rupp的話來(lái)說(shuō),它也可以訪問(wèn)現(xiàn)存的數(shù)之不盡的Java類庫(kù),這讓(潛在地)遷移到Scala更加容易。
這讓Scala得以使用為Java1.4、5.0或者6.0編寫的巨量的Java類庫(kù)和框架,Scala會(huì)經(jīng)常性地針對(duì)這幾個(gè)版本的Java進(jìn)行測(cè)試。Scala可能也可以在更早版本的Java上運(yùn)行,但沒有經(jīng)過(guò)正式的測(cè)試。Scala以BSD許可發(fā)布,并且數(shù)年前就已經(jīng)被認(rèn)為相當(dāng)穩(wěn)定了。
說(shuō)了這么多,我們還沒有回答一個(gè)問(wèn)題:“為什么我要使用Scala?”Scala的設(shè)計(jì)始終貫穿著一個(gè)理念:
創(chuàng)造一種更好地支持組件的語(yǔ)言。(《The Scala Programming Language》,Donna Malayeri)
也就是說(shuō)軟件應(yīng)該由可重用的部件構(gòu)造而成。Scala旨在提供一種編程語(yǔ)言,能夠統(tǒng)一和一般化分別來(lái)自面向?qū)ο蠛秃瘮?shù)式兩種不同風(fēng)格的關(guān)鍵概念。
藉著這個(gè)目標(biāo)與設(shè)計(jì),Scala得以提供一些出眾的特性,包括:
◆ 面向?qū)ο箫L(fēng)格
◆ 函數(shù)式風(fēng)格
◆ 更高層的并發(fā)模型
Scala把Erlang風(fēng)格的基于actor的并發(fā)帶進(jìn)了JVM。開發(fā)者現(xiàn)在可以利用Scala的actor模型在JVM上設(shè)計(jì)具伸縮性的并發(fā)應(yīng)用程序,它會(huì)自動(dòng)獲得多核心處理器帶來(lái)的優(yōu)勢(shì),而不必依照復(fù)雜的Java線程模型來(lái)編寫程序。
◆ 輕量級(jí)的函數(shù)語(yǔ)法
a. 高階
b. 嵌套
c. 局部套用(Currying)
d. 匿名
◆ 與XML集成
a. 可在Scala程序中直接書寫XML
b. 可將XML轉(zhuǎn)換成Scala類
◆ 與Java無(wú)縫地互操作
Scala的風(fēng)格和特性已經(jīng)吸引了大量的開發(fā)者,比如Debasish Ghosh就覺得:我已經(jīng)把玩了Scala好一陣子,可以說(shuō)我絕對(duì)享受這個(gè)語(yǔ)言的創(chuàng)新之處。
總而言之,Scala是一種函數(shù)式面向?qū)ο笳Z(yǔ)言,它融匯了許多前所未有的特性,而同時(shí)又運(yùn)行于JVM之上。隨著開發(fā)者對(duì)Scala的興趣日增,以及越來(lái)越多的工具支持,無(wú)疑Scala語(yǔ)言將成為你手上一件必不可少的工具。
【編輯推薦】















 
 
 





 
 
 
 