日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Scala具体解释---------Scala是什么?可伸展的语言!

發(fā)布時(shí)間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Scala具体解释---------Scala是什么?可伸展的语言! 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Scala是什么

Scala語(yǔ)言的名稱來(lái)自于“可伸展的語(yǔ)言”。

之所以這樣命名,是由于他被設(shè)計(jì)成隨著使用者的需求而成長(zhǎng)。你能夠把Scala應(yīng)用在非常大范圍的編程任務(wù)上。從寫(xiě)個(gè)小腳本到建立個(gè)大系統(tǒng)。

51CTO編輯推薦:Scala編程語(yǔ)言專題

Scala是非常easy進(jìn)入的語(yǔ)言。

它跑在標(biāo)準(zhǔn)的Java平臺(tái)上。可以與全部的Java庫(kù)實(shí)現(xiàn)無(wú)縫交互。

它也是用來(lái)編寫(xiě)腳本把Java控件鏈在一起的非常好的語(yǔ)言。可是用它來(lái)建立大系統(tǒng)和可重用控件的架構(gòu)將更可以發(fā)揮它的力量。

從技術(shù)層面上來(lái)說(shuō),Scala是一種把面向?qū)ο蠛秃瘮?shù)式編程理念增加到靜態(tài)類型語(yǔ)言中的混血兒。Scala的很多不同的方面都展現(xiàn)了面向?qū)ο蠛秃瘮?shù)式編程的熔合;也許它比其它那些廣泛使用的語(yǔ)言更有滲透性。在可伸展性方面。這兩種編程風(fēng)格具有互補(bǔ)的力量。

Scala的函數(shù)式編程使得它便于高速地從簡(jiǎn)單的碎片開(kāi)始建立一些有趣的東西。

它的面向?qū)ο筇匦杂质顾阌跇?gòu)造大型系統(tǒng)并使它們適應(yīng)于新的需求。

Scala中這兩種風(fēng)格的組合使得它有可能表達(dá)新的編程模式和控件抽象。并產(chǎn)生了易讀、簡(jiǎn)潔的編程風(fēng)格。因?yàn)樗己玫难诱剐?#xff0c;用Scala編程將會(huì)有非常多的樂(lè)趣。

不同尺寸的程序傾向于須要不同的編程結(jié)構(gòu)。

舉例來(lái)說(shuō)。考慮下面的Scala程序:

  • var?capital?=?Map("US"->"Washington",?"France"?->?"Paris") ?
  • capital?+=?("Japan"?->?"Tokyo") ?
  • println(capital("France"))?
  • 這段程序建立了一個(gè)國(guó)家和它們的首都之間的映射表,添加了一個(gè)新的綁定("Japan"->"Tokyo")。然后打印了與法國(guó)相關(guān)的首都。

    本例中的聲明都是高層次的。也就是說(shuō)。沒(méi)有被外加的分號(hào)或者類型凝視弄得亂糟糟的。實(shí)際上,這樣的感覺(jué)就好像那種現(xiàn)代的“腳本化”語(yǔ)言,比方。Perl,Python或者Ruby。這些語(yǔ)言的一個(gè)普遍特征,與上例有關(guān)的,就是它們都在語(yǔ)法層面上支持“關(guān)聯(lián)映射”。

    關(guān)聯(lián)映射很實(shí)用,由于它能讓程序易讀和清晰。然而。有些時(shí)候你也許不贊成它們的這樣的“均碼”哲學(xué),由于你須要用一種更加細(xì)粒度地去控制在你程序中用到的映射的屬性。Scala能夠在你須要的時(shí)候提供這樣的細(xì)粒度的控制。由于映射在Scala里并非語(yǔ)法特性。

    它們是庫(kù)抽象,你能夠擴(kuò)展或者改造。

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

    這個(gè)樣例顯示了Scala帶給你的方便性和靈活性,能夠讓你更好的了解Scala是什么。Scala有一整套的方便構(gòu)件來(lái)幫助你高速啟動(dòng)及讓你用一種愉悅清晰的狀態(tài)編程。

    與此同一時(shí)候。你有信心你不會(huì)讓語(yǔ)言過(guò)度發(fā)育。

    你總能夠把程序按你的須要裁剪。由于全部的東西都是基于庫(kù)模塊的。能夠按照須要選擇和改動(dòng)。

    Scala是什么:培育新的類型

    Eric Raymond把大教堂和雜貨鋪?zhàn)鳛檐浖_(kāi)發(fā)的兩個(gè)隱喻。 大教堂是幾近于完美的建筑物,要花非常長(zhǎng)的時(shí)間建設(shè)。一旦建成了,就長(zhǎng)時(shí)間保持不變。

    相對(duì)來(lái)說(shuō),雜貨鋪則天天在被工作當(dāng)中的人調(diào)整和擴(kuò)展。

    Raymond的文章中,雜貨鋪是對(duì)于開(kāi)源軟件開(kāi)發(fā)的隱喻。

    Guy Steele在他的講話“發(fā)展一門(mén)語(yǔ)言”中提到相同的區(qū)別也能夠應(yīng)用在語(yǔ)言定義中。 Scala更像一個(gè)雜貨鋪而不是大教堂,由于它被設(shè)計(jì)為讓用它編程的人擴(kuò)展和改動(dòng)的。

    Scala并沒(méi)有提供全部你在一種“完美齊全”語(yǔ)言中可能須要的東西,而是把制作這些東西的工具放在了你的手中。

    這兒有個(gè)樣例。

    很多程序須要一個(gè)可以變得隨意大都不會(huì)溢出或者因?yàn)閿?shù)學(xué)操作而“繞回”的整數(shù)類型。

    Scala在庫(kù)類Scala.BigInt中定義了這樣一個(gè)類型。

    這里有一個(gè)使用了那個(gè)類型的方法定義。用以計(jì)算傳入整數(shù)的階乘值:

  • def?factorial(x:?BigInt):?BigInt?= ?
  • ????if?(x?==?0)?1?else?x?*?factorial(x?-?1)?
  • 如今,假設(shè)你調(diào)用了factorial(30),你將得到:

    265252859812191058636308480000000

    BigInt看上去就像一個(gè)內(nèi)建的類型,由于你能夠使用整數(shù)值和這樣的類型值的操作符如*和-。

    然而它僅僅是湊巧定義在Scala標(biāo)準(zhǔn)庫(kù)中的類。

    假設(shè)這個(gè)類缺失了,能夠直接由隨意的Scala程序猿寫(xiě)一個(gè)實(shí)現(xiàn)出來(lái),舉例來(lái)說(shuō),通過(guò)包裝Java的類java.math.BigInteger(實(shí)際上,Scala的BigInt就是這么實(shí)現(xiàn)的)。

    當(dāng)然。你也能夠直接使用Java的類庫(kù)。

    但結(jié)果卻不盡樂(lè)觀,由于雖然Java同意創(chuàng)建新的類,但這些類總感覺(jué)不像原生的語(yǔ)言支持。

  • import?java.math.BigInteger ?
  • def?factorial(x:BigInteger):?BigInteger?= ?
  • ????if?(x?==?BigInteger.ZERO) ?
  • ????????BigInteger.ONE ?
  • ????else?
  • ????????x.multiply(factorial(x.subtract(BigInteger.ONE)))?
  • BigInt代表了更多類似于數(shù)字的類型——大十進(jìn)制數(shù),復(fù)數(shù),分?jǐn)?shù)。置信區(qū)間,多項(xiàng)式——諸如此類。一些編程語(yǔ)言原生實(shí)現(xiàn)了當(dāng)中的一些類型。舉例來(lái)說(shuō)。Lisp,Haskell和Python實(shí)現(xiàn)了大整數(shù)。Fortran和Python實(shí)現(xiàn)了復(fù)數(shù)。可是不論什么語(yǔ)言想要嘗試同一時(shí)候?qū)崿F(xiàn)全部的這些抽象類型將非常easy變得太大而難以管理。

    更進(jìn)一步,即使假設(shè)有這種語(yǔ)言,總有些應(yīng)用會(huì)使用其它的沒(méi)支持的數(shù)字類型。所以嘗試在一種語(yǔ)言里提供全部東西的解決之道不可能非常好地伸展。

    取而代之。Scala同意用戶在他們須要的方向上通過(guò)定義易用庫(kù)來(lái)發(fā)展和改造語(yǔ)言,使得這些特性感覺(jué)上好像原生語(yǔ)言支持一樣。

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

    前面的樣例演示了Scala讓你添加新的類型。使得它們用起來(lái)方便得像內(nèi)建類型一樣。相同的擴(kuò)展理念也應(yīng)用在控制結(jié)構(gòu)上。

    這樣的類型的擴(kuò)展是由Scala的“基于行動(dòng)類”的并發(fā)編程API闡明的。

    隨著近年多核處理器的激增。為了獲取可接受的性能,你將必須在應(yīng)用中運(yùn)用很多其它的并行機(jī)制。經(jīng)常這就意味著重寫(xiě)你的代碼來(lái)讓計(jì)算分布到若干并發(fā)線程上。不幸的是,創(chuàng)建依賴性的多線程程序在實(shí)踐中被證明是非常具有挑戰(zhàn)性的。Java的線程模型是環(huán)繞著共享內(nèi)存和鎖建立的。尤其是當(dāng)系統(tǒng)在大小和復(fù)雜度都得到提升的時(shí)候。這樣的模型經(jīng)常是不可理喻的。

    非常難說(shuō)程序里面沒(méi)有資源競(jìng)爭(zhēng)或潛藏的死鎖——有些東西不是能在測(cè)試?yán)锩鏅z驗(yàn)得出,而也許僅僅在投入生產(chǎn)后才表現(xiàn)出來(lái)。而大致能夠覺(jué)得比較安全的可選方案是消息傳遞架構(gòu)。比如在Erlang編程語(yǔ)言中應(yīng)用的“行動(dòng)類”方案。

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

    行動(dòng)類是可以實(shí)現(xiàn)于線程之上的并發(fā)抽象。

    它們通過(guò)在彼此間發(fā)送消息實(shí)現(xiàn)通信。每一個(gè)行動(dòng)類都能實(shí)現(xiàn)兩個(gè)基本操作,消息的發(fā)送和接受。發(fā)送操作,用一個(gè)驚嘆號(hào)表示,發(fā)送消息給一個(gè)行動(dòng)類。這里用一個(gè)命名為recipient的行動(dòng)類舉比例如以下:

  • recipient?!?msg?
  • 發(fā)送是異步的;就是說(shuō)。發(fā)送的行動(dòng)類能夠在一瞬間完畢,而不須要等待消息被接受和處理。

    每個(gè)行動(dòng)類都有一個(gè)信箱:mailbox把進(jìn)入的消息排成隊(duì)列。

    行動(dòng)類通過(guò)receive代碼塊處理信箱中受到的消息:

  • receive?{ ?
  • ?case?Msg1?=>?...?//?handle?Msg1 ?
  • ?case?Msg2?=>?...?//?handle?Msg2 ?
  • ?//?... ?
  • } ?
  • 接收代碼塊由很多case語(yǔ)句組成,每個(gè)都用一個(gè)消息模板查詢信箱。信箱中第一個(gè)符合不論什么case的消息被選中,而且運(yùn)行對(duì)應(yīng)的動(dòng)作。

    假設(shè)信箱中不含有不論什么符合不論什么case的消息,行動(dòng)類將休眠等待新進(jìn)的消息。

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

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

    眼下我們并不指望你能全然明確行動(dòng)類樣例。

    實(shí)際上,對(duì)于可伸展性這個(gè)話題來(lái)說(shuō)這個(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)類庫(kù)里面的方法。相同,雖然“!”看上去像是個(gè)內(nèi)建的操作符。它也只是是定義在行動(dòng)類庫(kù)里面的方法。全部這四個(gè)構(gòu)件都是全然獨(dú)立于Scala語(yǔ)言的。

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

    雖然它們是定義在庫(kù)里的,給人的感覺(jué)就像行動(dòng)類是Scala語(yǔ)言總體的部分。

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

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

    本文借鑒于http://developer.51cto.com/art/200907/134865.htm

    總結(jié)

    以上是生活随笔為你收集整理的Scala具体解释---------Scala是什么?可伸展的语言!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。