国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Scala是什么?可伸展的語言!

開發(fā) 后端
本文介紹Scala是什么。從技術(shù)層面上來說,Scala是一種把面向?qū)ο蠛秃瘮?shù)式編程理念加入到靜態(tài)類型語言中的混血兒,它是面向?qū)ο蠛秃瘮?shù)式編程的熔合,具有絕佳的可伸展性。

Scala是什么

Scala語言的名稱來自于“可伸展的語言”。之所以這樣命名,是因?yàn)樗辉O(shè)計(jì)成隨著使用者的需求而成長(zhǎng)。你可以把Scala應(yīng)用在很大范圍的編程任務(wù)上,從寫個(gè)小腳本到建立個(gè)大系統(tǒng)。

51CTO編輯推薦:Scala編程語言專題

Scala是很容易進(jìn)入的語言。它跑在標(biāo)準(zhǔn)的Java平臺(tái)上,可以與所有的Java庫實(shí)現(xiàn)無縫交互。它也是用來編寫腳本把Java控件鏈在一起的很好的語言。但是用它來建立大系統(tǒng)和可重用控件的架構(gòu)將更能夠發(fā)揮它的力量。

從技術(shù)層面上來說,Scala是一種把面向?qū)ο蠛秃瘮?shù)式編程理念加入到靜態(tài)類型語言中的混血兒。Scala的許多不同的方面都展現(xiàn)了面向?qū)ο蠛秃瘮?shù)式編程的熔合;或許它比其他那些廣泛使用的語言更有滲透性。在可伸展性方面,這兩種編程風(fēng)格具有互補(bǔ)的力量。Scala的函數(shù)式編程使得它便于快速地從簡(jiǎn)單的碎片開始建立一些有趣的東西。它的面向?qū)ο筇匦杂质顾阌跇?gòu)造大型系統(tǒng)并使它們適應(yīng)于新的需求。Scala中這兩種風(fēng)格的組合使得它有可能表達(dá)新的編程模式和控件抽象。并產(chǎn)生了易讀、簡(jiǎn)潔的編程風(fēng)格。由于它良好的延展性,用Scala編程將會(huì)有很多的樂趣。

不同尺寸的程序傾向于需要不同的編程結(jié)構(gòu)。舉例來說,考慮以下的Scala程序:

  1. var capital = Map("US"->"Washington""France" -> "Paris")  
  2. capital += ("Japan" -> "Tokyo")  
  3. println(capital("France")) 

這段程序建立了一個(gè)國(guó)家和它們的首都之間的映射表,增加了一個(gè)新的綁定("Japan"->"Tokyo"),然后打印了與法國(guó)相關(guān)的首都。 本例中的聲明都是高層次的,也就是說,沒有被外加的分號(hào)或者類型注釋弄得亂糟糟的。實(shí)際上,這種感覺就好像那種現(xiàn)代的“腳本化”語言,比如,Perl,Python或者Ruby。這些語言的一個(gè)普遍特征,與上例有關(guān)的,就是它們都在語法層面上支持“關(guān)聯(lián)映射”。

關(guān)聯(lián)映射非常有用,因?yàn)樗茏尦绦蛞鬃x和清晰。然而,有些時(shí)候你或許不贊成它們的這種“均碼”哲學(xué),因?yàn)槟阈枰靡环N更加細(xì)粒度地去控制在你程序中用到的映射的屬性。Scala可以在你需要的時(shí)候提供這種細(xì)粒度的控制,因?yàn)橛成湓赟cala里并不是語法特性。它們是庫抽象,你可以擴(kuò)展或者改造。

在上面的程序里,你將獲得一個(gè)缺省的Map實(shí)現(xiàn),不過你也可以很輕松地改變它。比方說,你可以定義個(gè)特別的實(shí)現(xiàn),如HashMap或TreeMap,或者你可以特定這個(gè)映射必須是線程安全的,混入:mix-in個(gè)SynchronizedMap特色:trait。你還可以給映射特定一個(gè)缺省值,或你可以重載你創(chuàng)建的映射的任意方法。每個(gè)例子里,你都可以如上例所示那樣使用同樣簡(jiǎn)單的映射訪問語法。

這個(gè)例子顯示了Scala帶給你的方便性和靈活性,可以讓你更好的了解Scala是什么。Scala有一整套的方便構(gòu)件來幫助你快速啟動(dòng)及讓你用一種愉悅清晰的狀態(tài)編程。與此同時(shí),你有信心你不會(huì)讓語言過度發(fā)育。你總可以把程序按你的需要裁剪,因?yàn)樗械臇|西都是基于庫模塊的,可以依照需要選擇和修改。

Scala是什么:培育新的類型

Eric Raymond把大教堂和雜貨鋪?zhàn)鳛檐浖_發(fā)的兩個(gè)隱喻。 大教堂是幾近于完美的建筑物,要花很長(zhǎng)的時(shí)間建設(shè)。一旦建成了,就長(zhǎng)時(shí)間保持不變。相對(duì)來說,雜貨鋪則天天在被工作其中的人調(diào)整和擴(kuò)展。Raymond的文章中,雜貨鋪是對(duì)于開源軟件開發(fā)的隱喻。Guy Steele在他的講話“發(fā)展一門語言”中提到同樣的差別也可以應(yīng)用在語言定義中。 Scala更像一個(gè)雜貨鋪而不是大教堂,因?yàn)樗辉O(shè)計(jì)為讓用它編程的人擴(kuò)展和修改的。Scala并沒有提供所有你在一種“完美齊全”語言中可能需要的東西,而是把制作這些東西的工具放在了你的手中。

這兒有個(gè)例子。許多程序需要一個(gè)能夠變得任意大都不會(huì)溢出或者由于數(shù)學(xué)操作而“繞回”的整數(shù)類型。Scala在庫類Scala.BigInt中定義了這樣一個(gè)類型。這里有一個(gè)使用了那個(gè)類型的方法定義,用以計(jì)算傳入整數(shù)的階乘值:

  1. def factorial(x: BigInt): BigInt =  
  2.     if (x == 01 else x * factorial(x - 1

 現(xiàn)在,如果你調(diào)用了factorial(30),你將得到:

265252859812191058636308480000000

BigInt看上去就像一個(gè)內(nèi)建的類型,因?yàn)槟憧梢允褂谜麛?shù)值和這種類型值的操作符如*和-。然而它只是湊巧定義在Scala標(biāo)準(zhǔn)庫中的類。 如果這個(gè)類缺失了,可以直接由任意的Scala程序員寫一個(gè)實(shí)現(xiàn)出來,舉例來說,通過包裝Java的類java.math.BigInteger(實(shí)際上,Scala的BigInt就是這么實(shí)現(xiàn)的)。

當(dāng)然,你也可以直接使用Java的類庫。但結(jié)果卻不盡樂觀,因?yàn)楸M管Java允許創(chuàng)建新的類,但這些類總感覺不像原生的語言支持。

  1. import java.math.BigInteger  
  2. def factorial(x:BigInteger): BigInteger =  
  3.     if (x == BigInteger.ZERO)  
  4.         BigInteger.ONE  
  5.     else 
  6.         x.multiply(factorial(x.subtract(BigInteger.ONE))) 

BigInt代表了許多其他類似于數(shù)字的類型——大十進(jìn)制數(shù),復(fù)數(shù),分?jǐn)?shù),置信區(qū)間,多項(xiàng)式——諸如此類。一些編程語言原生實(shí)現(xiàn)了其中的一些類型。舉例來說,Lisp,Haskell和Python實(shí)現(xiàn)了大整數(shù);Fortran和Python實(shí)現(xiàn)了復(fù)數(shù)。但是任何語言想要嘗試同時(shí)實(shí)現(xiàn)所有的這些抽象類型將很容易變得太大而難以管理。更進(jìn)一步,即使如果有這樣的語言,總有些應(yīng)用會(huì)使用其他的沒支持的數(shù)字類型。所以嘗試在一種語言里提供所有東西的解決之道不可能很好地伸展。取而代之,Scala允許用戶在他們需要的方向上通過定義易用庫來發(fā)展和改造語言,使得這些特性感覺上好像原生語言支持一樣。

培育新的控制結(jié)構(gòu)

前面的例子演示了Scala讓你增加新的類型,使得它們用起來方便得像內(nèi)建類型一樣。同樣的擴(kuò)展理念也應(yīng)用在控制結(jié)構(gòu)上。這種類型的擴(kuò)展是由Scala的“基于行動(dòng)類”的并發(fā)編程API闡明的。

隨著近年多核處理器的激增,為了獲取可接受的性能,你將必須在應(yīng)用中運(yùn)用更多的并行機(jī)制。常常這就意味著重寫你的代碼來讓計(jì)算分布到若干并發(fā)線程上。不幸的是,創(chuàng)建依賴性的多線程程序在實(shí)踐中被證明是非常具有挑戰(zhàn)性的。Java的線程模型是圍繞著共享內(nèi)存和鎖建立的,尤其是當(dāng)系統(tǒng)在大小和復(fù)雜度都得到提升的時(shí)候,這種模型常常是不可理喻的。很難說程序里面沒有資源競(jìng)爭(zhēng)或潛藏的死鎖——有些東西不是能在測(cè)試?yán)锩鏅z驗(yàn)得出,而或許只在投入生產(chǎn)后才表現(xiàn)出來。而大致可以認(rèn)為比較安全的可選方案是消息傳遞架構(gòu),例如在Erlang編程語言中應(yīng)用的“行動(dòng)類”方案。

Java伴隨著一個(gè)豐富的,基于線程的并發(fā)庫。Scala可以像其他JavaAPI那樣使用它編程。然而,Scala也提供了一個(gè)實(shí)質(zhì)上實(shí)現(xiàn)了Erlang的行動(dòng)類模型的附加庫。

行動(dòng)類是能夠?qū)崿F(xiàn)于線程之上的并發(fā)抽象。它們通過在彼此間發(fā)送消息實(shí)現(xiàn)通信。每個(gè)行動(dòng)類都能實(shí)現(xiàn)兩個(gè)基本操作,消息的發(fā)送和接受。發(fā)送操作,用一個(gè)驚嘆號(hào)表示,發(fā)送消息給一個(gè)行動(dòng)類。這里用一個(gè)命名為recipient的行動(dòng)類舉例如下:

  1. recipient ! msg 

發(fā)送是異步的;就是說,發(fā)送的行動(dòng)類可以在一瞬間完成,而不需要等待消息被接受和處理。每一個(gè)行動(dòng)類都有一個(gè)信箱:mailbox把進(jìn)入的消息排成隊(duì)列。行動(dòng)類通過receive代碼塊處理信箱中受到的消息:

  1. receive {  
  2.  case Msg1 => ... // handle Msg1  
  3.  case Msg2 => ... // handle Msg2  
  4.  // ...  
  5. }  

接收代碼塊由許多case語句組成,每一個(gè)都用一個(gè)消息模板查詢信箱。信箱中第一個(gè)符合任何case的消息被選中,并且執(zhí)行相應(yīng)的動(dòng)作。如果信箱中不含有任何符合任何case的消息,行動(dòng)類將休眠等待新進(jìn)的消息。

這里舉一個(gè)簡(jiǎn)單的Scala行動(dòng)類實(shí)現(xiàn)檢查值(cheksum)計(jì)算器服務(wù)的例子:

  1. actor {  
  2.  var sum = 0 
  3.  loop {  
  4.   receive {  
  5.    case Data(bytes)  => sum += hash(bytes)  
  6.    case GetSum(requester) => requester ! sum  
  7.   }  
  8.  }  
  9. }  

這個(gè)行動(dòng)類首先定義了一個(gè)名為sum的本地變量,并賦了初值為零。然后就用receive段落重復(fù)等待在消息循環(huán)中。如果收到了Data消息,就把發(fā)送的bytes取哈希值加到sum變量中。如果收到了GetSum消息,就用消息發(fā)送requester!sum把當(dāng)前sum值發(fā)回給requester。requester字段嵌入在GetSum消息里;它通常指出創(chuàng)建請(qǐng)求的行動(dòng)類。

目前我們并不指望你能完全明白行動(dòng)類例子。實(shí)際上,對(duì)于可伸展性這個(gè)話題來說這個(gè)例子里面最重要的是,不論是actor還是loop還是receive還是發(fā)送消息的符號(hào)“!”,這些都不是Scala內(nèi)建的操作符。盡管actor,loop和receive看上去或者表現(xiàn)上都如此接近于控制結(jié)構(gòu)如while或者for循環(huán),實(shí)際上它們是定義在Scala的行動(dòng)類庫里面的方法。同樣,盡管“!”看上去像是個(gè)內(nèi)建的操作符,它也不過是定義在行動(dòng)類庫里面的方法。所有這四個(gè)構(gòu)件都是完全獨(dú)立于Scala語言的。

receive代碼塊和發(fā)送“!”語法讓Scala看上去更像Erlang里的樣子,但是在Erlang里面,這些構(gòu)件是內(nèi)建在語言中的,Scala還實(shí)現(xiàn)了Erlang其他并發(fā)編程構(gòu)件的大多數(shù),諸如監(jiān)控失敗行動(dòng)類和超時(shí)類。總體來說,行動(dòng)類已變成表達(dá)并發(fā)和分布式計(jì)算的非常好的辦法。盡管它們是定義在庫里的,給人的感覺就像行動(dòng)類是Scala語言整體的部分。

本例演示了你可以向新的方向“培養(yǎng)”Scala語言乃至像并發(fā)編程這樣的特性。前提是,你需要一個(gè)好的架構(gòu)和程序員來做這樣的事。但重要的事情是這的確可行——你可以在Scala里面設(shè)計(jì)和實(shí)現(xiàn)抽象結(jié)構(gòu),從而快速投入新的應(yīng)用領(lǐng)域,卻仍然感覺像是原生的語言支持。

本文節(jié)選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第一章。

【相關(guān)閱讀】

  1. 學(xué)習(xí)Scala中的Case類
  2. Groovy創(chuàng)始人:Java面臨終結(jié) Scala將取而代之
  3. Scala的類型系統(tǒng):取代復(fù)雜的通配符
  4. Scala的類型系統(tǒng) 比Java更靈活
  5. Java程序員,你為什么要關(guān)注Scala
責(zé)任編輯:楊鵬飛 來源: Artima
相關(guān)推薦

2009-07-08 12:43:59

Scala ServlScala語言

2020-10-31 17:33:18

Scala語言函數(shù)

2021-11-09 23:15:20

編程語言本質(zhì)

2020-08-02 19:55:46

Python編程語言技術(shù)

2022-08-17 17:57:37

GoGo語言

2009-12-11 10:44:00

Scala講座函數(shù) scala

2010-08-18 08:53:53

Scala

2012-05-16 13:11:28

編程語言開發(fā)語言Java

2009-07-08 16:42:57

Scala語言設(shè)計(jì)

2009-07-17 17:05:29

JRuby是什么JRuby

2022-01-25 09:23:58

Linux操作系

2010-09-14 13:22:17

Scala編程指南Scala

2012-09-07 10:02:53

2010-06-18 14:27:52

ACPI是什么

2021-03-15 14:00:56

PythonC語言編程語言

2009-09-16 16:35:08

OSGi是什么OSGi容器

2009-02-06 09:08:04

Scala函數(shù)語言輕量級(jí)

2010-10-15 10:35:18

2022-08-26 09:51:49

索引簽名編程語言

2021-09-01 23:29:37

Golang語言gRPC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

99精品女人在线观看免费视频 | 五月综合久久| 亚洲国产欧美自拍| 国产视频二区在线观看| 亚洲成人免费电影| 免费看成人a| 欧美日韩中国免费专区在线看| 欧美1819sex性处18免费| 亚洲同性同志一二三专区| 亚洲第一精品区| 久久99久久99小草精品免视看| 色99中文字幕| 成人久久视频在线观看| 国产va亚洲va在线va| 国产精品一区在线观看你懂的| 8x8x华人在线| 久久久久久久久蜜桃| 97影视在线观看| 91成人看片片| 欧美二三四区| 欧美在线国产精品| 最新精品国产| 一区二区三区四区精品在线视频| 大胆欧美熟妇xx| av一区二区三区| 成人网址大全| 欧美日韩一级大片网址| av在线1区2区| 一区二区三区免费网站| 97精品国产91久久久久久| jizz性欧美| 777a∨成人精品桃花网| 欧亚av在线| 2019亚洲男人天堂| 久久亚洲色图| 色婷婷亚洲十月十月色天| 天天影视网天天综合色在线播放| 欧美a在线看| 日韩在线中文字幕| 牛夜精品久久久久久久99黑人| 黄色一级片黄色| 91精品国产欧美一区二区成人| 综合激情五月婷婷| 欧美日韩在线精品| 亚洲综合色区另类av| 韩国中文字幕av| 欧美zozo另类异族| 激情91久久| 中文在线有码| 成人黄色网免费| 亚洲国产日日夜夜| 一本久久青青| 18av.com视频| 国产欧美va欧美va香蕉在| 国产欧美精品区一区二区三区 | 7777精品伊人久久久大香线蕉 | 高清av电影在线观看| 深夜福利国产精品| 蜜芽一区二区三区| 91九色美女在线视频| 国产精品吴梦梦| 久久久不卡网国产精品一区| 超碰一区二区| 亚洲一区三区| 国产婷婷色综合av蜜臀av| 久久精品国产精品亚洲红杏| 九色porny视频在线观看| 中日韩在线视频| 亚洲欧美精品中文字幕在线| 国产一区二区视频在线| 亚洲网站情趣视频| 欧美精品中文字幕一区| av免费看在线| 97碰碰视频| 欧美精品黑人性xxxx| 亚洲另类自拍| 国产白浆在线免费观看| 欧美国产二区| 欧美成人激情图片网| 久久99久久久欧美国产| 精品亚洲一区二区| 国产精品视频播放| 欧美禁忌电影网| 国产精品视频yy9099| 成人拍拍拍免费视频网站| 亚洲白虎美女被爆操| 男女超爽视频免费播放| 国产亚洲精品aa午夜观看| 自拍偷拍21p| 图片区小说区国产精品视频| 高h视频在线| 亚洲视频在线播放| 日韩美女精品| 久久久久久久久久久一区| 国产精品一二二区| 免费在线观看羞羞视频| 欧美久久久影院| 欧美97人人模人人爽人人喊视频| 清纯唯美亚洲激情| 亚洲啪啪91| 久久久久久久午夜| 欧美日韩国产麻豆| 69堂精品视频在线播放| 国产精品免费一区| 国产精品一区二区91| 毛片.com| 亚洲人成网站999久久久综合| 欧美亚洲在线日韩| 日本福利视频网站| 欧美丝袜第一区| 国产高清亚洲| 欧美不卡在线一区二区三区| 中文字幕乱码日本亚洲一区二区| 国产在线1区| 国产精品第七十二页| 国产精品18久久久久久久网站| 黄色直播在线| 精品激情国产视频| 亚洲美女色禁图| **孕交吃奶水一级毛片| 亚洲视频综合网| 亚洲激情欧美| 午夜激情在线观看视频| 欧美一二三在线| 久久草在线视频| 超碰成人免费在线| 欧美肥胖老妇做爰| av男人一区| 黄色成人在线免费观看| 欧美日韩国产综合一区二区| 精品一区二区三区中文字幕在线 | 日本精品黄色| 久久人人爽人人爽人人av| 亚洲精品高清视频在线观看| 全球最大av网站久久| 国产精品青青在线观看爽香蕉 | 波多野结衣在线观看一区二区三区 | 丝袜美腿成人在线| 2020中文字幕在线| 日韩中文在线中文网三级| 综合一区在线| 濑亚美莉一二区在线视频| 国产一级揄自揄精品视频| 三级影片在线观看欧美日韩一区二区| 天堂在线亚洲| 国内精品久久久久久| 国产999精品久久久久久| av今日在线| 91理论片午午论夜理片久久| 一区二区欧美国产| 国产精品一区免费在线| 免费人成在线观看视频播放| 欧美区一区二区三区| 欧美激情1区2区| av三级影院| 日本久久91av| 久久精品视频在线看| 国产免费av国片精品草莓男男| 亚洲图片小说在线| 精品视频久久久| 久久成人一区| caopen在线视频| 国产91亚洲精品一区二区三区| 一本大道av一区二区在线播放| 菠萝蜜视频在线观看www入口| av一本久道久久波多野结衣| 欧美日韩免费一区| а√最新版天堂中文在线| a级黄色小视频| 草草草在线视频| 在线不卡视频一区二区| 日本不卡在线视频| 成年人视频在线网站| 久久久久亚洲精品国产| 久久99国产精品麻豆| gay欧美网站| 91精品国产综合久久香蕉的用户体验| 麻豆91蜜桃| 国产999精品久久久| 欧美一级大片在线免费观看| 日韩精品视频免费| 91精品啪在线观看国产60岁| 欧美性三三影院| 亚洲久久久久久久久久| 欧美吻胸吃奶大尺度电影| 亚洲国模精品私拍| 91香蕉视频在线| 蜜桃视频一区二区三区在线观看| k8久久久一区二区三区| 国产精品久久久一区二区| 国产·精品毛片| 亚洲深夜影院| 日本女优在线视频一区二区| 国产成人午夜99999| 欧美高清在线视频| 亚洲黄色免费三级| 日韩一区二区三区xxxx| 亚洲一区二区三区乱码aⅴ蜜桃女| 免费成人进口网站| 伊人春色在线|