Scala將成為現(xiàn)代Web 2.0的發(fā)起語言
一個(gè) Twitter 的開發(fā)人員說過,Scala 將會(huì)成為現(xiàn)代 Web2.0 的發(fā)起語言。LinkedIn 也用這種語言。同樣許多其他大的公司如 Sony Picture, EDF, SAP 也開始使用這種語言。
51CTO編輯推薦:Scala編程語言專題
Scala 名字的含義
Scala 意為可擴(kuò)展的(scalable)語言,意味著開始時(shí)很小但是可以長久發(fā)展。對(duì)于新接觸 Scala 的人來說,它看起來也許像腳本語言。但是 Scala 并不是真正的腳本語言,這也不是 Scala 主要的特性。實(shí)際上,它能夠做到 Java 能做到的一切事情并且能提供超出 Java 能力范圍之外對(duì)于大系統(tǒng)的支持。Scala 設(shè)計(jì)的標(biāo)準(zhǔn)之一就是希望創(chuàng)造一種能夠適于任何從小程序發(fā)展到大系統(tǒng)卻不需要變更架構(gòu)的語言。
Scala 的發(fā)展
90 年代 Martin Odersky 加入到開發(fā) Java 語言和他的編譯器。他和 Philip Wadler 研究員一起開發(fā)了最終成為泛型 Java( GJ ) 的 Pizza, 后來又加入到 Java 5 的開發(fā)中。Martin Odersky 一直從事編寫 javac 編譯器。GJ 的編譯器也就是他們做的擴(kuò)展,先于 SUN 公司接納 GJ 到標(biāo)準(zhǔn)的 Java 中很長時(shí)間 —— 因?yàn)?SUN 公司先接納了編譯器。
1999 年 Martin Odersky 到瑞士從事一些更基礎(chǔ)的課題工作。他開始嘗試將面向?qū)ο蠛秃瘮?shù)很好的結(jié)合起來。他們已經(jīng)在 95/96 年在 Pizza 上做過嘗試,但是只成功了一半,因?yàn)槟菚r(shí)候他們將 Java 作為基礎(chǔ)語言將要處理很多不精細(xì)的地方。Java 的擴(kuò)展性并不理想。所以在 2000 初, Martin Odersky 和他的小組在 EPFL 開發(fā)了一門新語言能夠和 Java 互操作但是能夠有效地將面向?qū)ο蠛秃瘮?shù)編程技術(shù)結(jié)合起來。
他所嘗試的這些語言中,第一次被叫做 Funnel, 第二次的叫做 Scala. 第二次試驗(yàn)的結(jié)果非常漂亮,所以他們將其打包作為實(shí)驗(yàn)版發(fā)布,這樣 Scala 就成為一個(gè)真實(shí)的語言產(chǎn)品供人們?cè)囉?。他們將一些粗糙的邊緣進(jìn)行拋光,做了一些小的語法變化,重寫了 Scala 的工具以確保 Scala 語言和它的工具能夠維持大量的運(yùn)用。他們?cè)?2006 年發(fā)布了 Scala 第二版,然后它迅速地獲得了人氣。
結(jié)合面向?qū)ο蠛秃瘮?shù)編程的優(yōu)勢(shì)
函數(shù)編程讓你能夠通過運(yùn)用簡(jiǎn)單的部件構(gòu)建你感興趣的內(nèi)容,因?yàn)樗軌蛱峁?qiáng)有力的粘合力。函數(shù)以一種有趣的方式運(yùn)用你程序的元素并且將他們和其他的元素進(jìn)行粘合。函數(shù)編程的一個(gè)好處就是你能夠想運(yùn)用一個(gè)數(shù)據(jù)那樣運(yùn)用函數(shù)。一種幾乎在所有編程語言中都能有典型的數(shù)據(jù)類型就是 ”int”: 你可以在任何地方申明一個(gè) int 值,包括在一個(gè)函數(shù)中,你可以將它傳遞給一個(gè)函數(shù),將它從一個(gè)函數(shù)中返回或者將它存儲(chǔ)在一個(gè)字段中。這些特性提供給你一個(gè)構(gòu)建自己結(jié)構(gòu)的強(qiáng)有力的方式,定義真正高層級(jí)的庫,或者去定義新的領(lǐng)域特殊語言(DSL)。
從另一個(gè)方面來說,面向?qū)ο缶幊烫峁┝藰?gòu)建系統(tǒng)組件和變更復(fù)雜系統(tǒng)的優(yōu)秀解決方式。繼承和多態(tài)提供了靈活的方式去構(gòu)建和組織命名空間。并且已經(jīng)擁有比較好的編程工具,比如在 IDE(集成開發(fā)環(huán)境)中當(dāng)打下一個(gè)點(diǎn)時(shí)彈出的用作提示有何種方法可用的上下文提示。
Scala 開發(fā)中的困難和解決方式
將面向?qū)ο蠛秃瘮?shù)式編程結(jié)合存在的挑戰(zhàn)是,如何將這兩邊有效的組織起來讓他們看上去是一種語言而不是兩種。因此如何將這兩種編程方式中特性去除一部分成為重頭戲。
如果將兩種編程方式完整地結(jié)合,最終只可能得到的是交互很少的兩種子語言。挑戰(zhàn)在于,如何從兩種構(gòu)造中定義構(gòu)造。舉個(gè)例子來說,在函數(shù)編程語言中一個(gè)函數(shù)值對(duì)應(yīng)于面向?qū)ο笾械囊粋€(gè)對(duì)象。你可以說,這是一個(gè)擁有 “apply” 方法的對(duì)象,因此我們能將一個(gè)函數(shù)值說成是一個(gè)對(duì)象。另外一個(gè)例子,函數(shù)編程中的基本代數(shù)類型可以對(duì)應(yīng)成面向?qū)ο笾械亩嘀乩^承,Java 中靜態(tài)字段和方法也存在同樣的問題。因此,Scala用將其替換成單例對(duì)象的成員的方式消除這種沖突。像這樣的例子還有很多,Scala 的開發(fā)團(tuán)隊(duì)正在致力于消除語言中類似的沖突并且統(tǒng)一構(gòu)建成別的東西。
Scala 開發(fā)過程中遇到的最大的困難
開發(fā)編譯器的技術(shù)是最大的挑戰(zhàn)。有趣的是,這些困難更多的來自于面向?qū)ο筮@邊。因?yàn)槊嫦驅(qū)ο笾懈呒?jí)的靜態(tài)類型系統(tǒng)十分罕見,并且他們中沒有一個(gè)是主流。Scala 比 Java 或者和 Java 類似的語言在類型系統(tǒng)上擁有更強(qiáng)的表現(xiàn)力,所以需要通過開發(fā)出一些新穎的類型和為組件構(gòu)建更多抽象類來開辟新的領(lǐng)域.。這帶來了一些開發(fā) Scala工作的困難也帶來了一些研究成果。
另一個(gè)困難的部分和交互有關(guān)。為了取得非常好的交互效果必須將 Java 中的一切都映射到 Scala 中。在想要將 Java 庫完全映射到Scala 中和避免 Java 中的多重構(gòu)造之間總是存在緊張的狀況。這是一個(gè)永久的有挑戰(zhàn)里的工程問題,雖然經(jīng)過了不少的工作但是最終的結(jié)果還是令人滿意。
Scala 設(shè)計(jì)的目的
為了將編程變成一種享受,Martin Odersky 和他的同事做了不少工作。Scala 盡可能多的移除了傳統(tǒng)高級(jí)協(xié)議編程語言中類似于咒語的語法,Scala 擁有強(qiáng)大的表現(xiàn)力因此開發(fā)者可以以自己喜歡的方式來描述事情。Martin Odersky 在開發(fā) javac 的時(shí)候就領(lǐng)悟到 Java 程序員需要做的多少無用功,很多樣本是不需要的。
Scala 語言的靈活性是一件強(qiáng)有力的工具但是這也有兩面性。它賦予了程序員書寫自由的同時(shí)也賦予了避免錯(cuò)誤的責(zé)任。從哲學(xué)的意義上來說,這是 Scala 和 Java 最大的不同之處。Java 擁有非常強(qiáng)的概念規(guī)范,因此任何一個(gè) Java 程序都和周圍其他任何一個(gè) Java 程序非常相似,并且這樣能夠方便的進(jìn)行程序員交替。但是 Scala 并沒有這樣的統(tǒng)一性,因?yàn)檫@是一門很有表現(xiàn)力的語言。
你可以用很多種方式書寫 Scala 程序,如果你是一個(gè)剛剛開始 Scala 的 Java 程序員,你也可以寫成 Java 程序那樣。這讓編程小組非常容易的遷移到 Scala, 并且將項(xiàng)目風(fēng)險(xiǎn)降低。程序員可以先在非關(guān)鍵的部分試用然后在他們覺得合適的時(shí)候再迅速的擴(kuò)展到其他的部分。
同樣你也可以把 Scala 程序?qū)懗赏耆暮瘮?shù)式風(fēng)格,和 Java 程序一點(diǎn)也不像。通常這樣的話, 程序看起來會(huì)更簡(jiǎn)潔。這種方式帶來的好處就是,你可以在 Scala 中構(gòu)建類似于高層次的庫的或者領(lǐng)域特殊語言(DSL)成你自己的俗語。通常你需要混合幾種不同的語言或者配置標(biāo)注來達(dá)到相同大的目的。所以最終,Scala的單語言做法會(huì)帶來簡(jiǎn)單的解決方案。
Twitter 使用 Scala
Twitter 使用 Scala 作為后臺(tái)編寫語言最終運(yùn)行良好。Twitter 已經(jīng)持續(xù)增長,并且穩(wěn)定性日益成為其增長的瓶頸,它使用 Scala 也是 Scala 語言的一次良好測(cè)試。當(dāng)一個(gè)引人注目的網(wǎng)站比如 Twitter, 用了一個(gè)新語言,對(duì)于這個(gè)語言來說是一次酸性測(cè)試 —— 主要的問題會(huì)被迅速發(fā)現(xiàn)并且被強(qiáng)化出來。
還有一些其他的知名公司使用 Scala. Sony Picture Imagework 用 Scala 寫它的中間層軟件,歐洲最大的能源公司 EDF 在它的貿(mào)易部門用 Scala 構(gòu)建合同模式。SAP 和 西門子在他們的開源 ESME 工具上用 Scala。這僅僅只是許多例子中的三個(gè)而已。
Scala 將成為現(xiàn)代 Web2.0 發(fā)起者
Twitter 并不是惟一一家使用 Scala 的公司,LinkedIn 也用 Scala.
Scala 提供了在穩(wěn)定的高性能平臺(tái)(Java 虛擬機(jī))上生成的能力同時(shí)也是一門敏捷性語言。這一類型的語言也有其他的選擇,例如 Jython, JRuby, Groovy 和 Clojure, 但是這些都是運(yùn)行在 JVM 上的動(dòng)態(tài)類型語言。
問題是對(duì)靜態(tài)類型的設(shè)定是否習(xí)慣,這樣問是因?yàn)檫@將在早些時(shí)候帶來更多的問題,它給了你一個(gè)安全的重構(gòu)網(wǎng)絡(luò),或者它幫助提高了性能?;蛘吣阈枰粋€(gè)完全動(dòng)態(tài)的語言因?yàn)橄胗迷绦蜃鲆粋€(gè)喜歡的東西。如果你偏向使用靜態(tài)類型的語言,Scala 絕對(duì)是一個(gè)最適合的選擇。
Scala 語言的特性
Scala 語言的特性有許多,例如高階函數(shù)和對(duì)象、抽象類型綁定,actor 使得函數(shù)在 Scala 中能是一個(gè)子類成為可能,Scala 中的設(shè)計(jì)模式使得面向?qū)ο蠛秃瘮?shù)編程無縫結(jié)合。
Scala 的發(fā)展方向
Scala 的下一個(gè)版本 Scala 2.8 將致力于高性能的數(shù)組操作,重新界定集合和快速永久的數(shù)據(jù)結(jié)構(gòu)等。Scala 2.8 將在今年的下一個(gè)季度發(fā)布。
長久來看,Scala 對(duì)并發(fā)和并行有興趣,因此正在支持多核處理器和其他并行系統(tǒng)上尋找新的道路。Scala 已經(jīng)有一個(gè)受歡迎的 actor 系統(tǒng),它能夠高水平的表現(xiàn)并發(fā),這已經(jīng)在 Twitter 的消息傳遞上已經(jīng)得到證實(shí)。有趣的事情是,actor 并不是 Scala的語言特性,它完全是 Scala 的一個(gè)庫。這是 Scala 靈活性的良好的見證者:只要用對(duì)了原語和庫中的抽象,你可以在程序中編寫像語言特性的東西。
Scala 將在數(shù)據(jù)并發(fā)和流編程上提供和 actor 一樣良好的表現(xiàn)。在未來我們極有可能需要一些并發(fā)抽象來利用多核因?yàn)椴煌牟⑿泻筒l(fā)情況需要不同的工具。Scala 庫的基礎(chǔ)的做法正是與此相關(guān),因?yàn)樗屛覀儗⒒旌虾推ヅ涞母拍顚?shí)現(xiàn)成為類和對(duì)象,這樣能夠快速前進(jìn)而不是將所有的這些都放入一個(gè)語言和一個(gè)編譯器。在未來的 5 年內(nèi),Scala 都將致力于此。
【編輯推薦】