自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

對(duì)象函數(shù)式編程 Scala簡(jiǎn)史

開(kāi)發(fā) 后端
本文概述了Scala語(yǔ)言誕生過(guò)程中的各種軟件開(kāi)發(fā)運(yùn)動(dòng)歷史的事件,當(dāng)人們研究Scala時(shí),發(fā)現(xiàn)這是一種給人印象深刻的語(yǔ)言,但是由于這種語(yǔ)言的功能特征不斷的急速進(jìn)化,導(dǎo)致除了一些自己研究的項(xiàng)目外,沒(méi)有其他人再使用這種語(yǔ)言開(kāi)發(fā)了。

從前,有一種編程語(yǔ)言叫Scala,人們研究這種語(yǔ)言,發(fā)現(xiàn)這是一種給人印象深刻的語(yǔ)言,有人說(shuō)與Scala接觸的最大感受就是Java如影相隨。這種語(yǔ)言看起來(lái)很美,但沒(méi)有人愿意冒險(xiǎn)把自己的職業(yè)生涯依賴(lài)于這種語(yǔ)言上,這個(gè)語(yǔ)言太年輕了,誰(shuí)能保證它不會(huì)夭折?

之后,發(fā)生了一些事情; Scala 長(zhǎng)大了。 Twitter 宣布他們用Scala語(yǔ)言替換了以前一些用Ruby開(kāi)發(fā)的后端程序,而SAP也在使用這種語(yǔ)言,還有EDF等。 這消息迅速傳播開(kāi)來(lái),有許多新的程序開(kāi)發(fā)者慕名而來(lái),他們也都感覺(jué)到這是一種令人印象深刻的語(yǔ)言,同時(shí),早期的這個(gè)語(yǔ)言的信徒也開(kāi)始發(fā)現(xiàn)此語(yǔ)言已經(jīng)鳳凰涅磐,讓他們眼睛一亮。

他們現(xiàn)在看到的這種語(yǔ)言已經(jīng)是一個(gè)成熟的、急不可待的等人們使用它去大展宏圖的語(yǔ)言了。 隨著2.8版本的發(fā)布,Scala 終于從少年進(jìn)入了青年,可以當(dāng)之無(wú)愧的接受令人印象深刻的贊譽(yù)了。

編程就是人生

程序語(yǔ)言在進(jìn)化、在繁衍,產(chǎn)生不同的種族。非常類(lèi)似于生命在早期地球的上的構(gòu)成,編程語(yǔ)言最初是誕生于由CPU指令和數(shù)學(xué)概念混成的沸騰的高湯里。 跟生命的發(fā)展不同的是,它們不需要泥土,但是它們也經(jīng)歷著殘酷血腥的優(yōu)勝劣汰、物競(jìng)天擇過(guò)程,當(dāng)然,你可以把它們之間的戰(zhàn)爭(zhēng)想像成關(guān)于Tab鍵和Space鍵,關(guān)于括弧在程序中的地位問(wèn)題上的戰(zhàn)爭(zhēng) 。

人們就像一個(gè)優(yōu)秀的飼養(yǎng)員只喜歡挑選一個(gè)純種血統(tǒng)的良馬一樣選擇自己喜愛(ài)的編程語(yǔ)言。 就像生物學(xué)上,人工育種必然存在不足,近親連續(xù)不斷地繁殖、以此來(lái)保存某一血統(tǒng)的令人滿(mǎn)意的特性的做法必然潛藏基因缺陷的危險(xiǎn)。

父母的結(jié)合產(chǎn)生的后代匯聚了其父母雙方各自不同的特征,所以后代比前代更強(qiáng)大,同時(shí)父母各自的弱點(diǎn)也會(huì)被后代查明從而摒棄。 同樣的思想也被應(yīng)用到了編程語(yǔ)言的世界里,各種面向?qū)ο蠛兔嫦蚝瘮?shù)風(fēng)格的概念相互融合給予了程序員們前所未有的能力和表達(dá)方式,Scala編程語(yǔ)言就是這樣的語(yǔ)言中的一員。

我估計(jì)閱讀我這篇文章的大部分是Java程序員,所以在我詳細(xì)的解釋函數(shù)和對(duì)象如何交互之前我打算先介紹一些關(guān)于針對(duì)函數(shù)編程的概念。其實(shí)在網(wǎng)上已經(jīng)有了很多完全超出我的寫(xiě)作水平的好教材,所以我愿意盡量簡(jiǎn)單的介紹一下。

什么是函數(shù)?

數(shù)學(xué)里,函數(shù)就是接受一個(gè)值(輸入值)而后使用它產(chǎn)生另外一個(gè)值(輸出)的運(yùn)算。 在很長(zhǎng)的時(shí)間里這個(gè)定義幾乎適用有所有任何的情況,即使是現(xiàn)在,數(shù)學(xué)家們也只是在擴(kuò)充這個(gè)定義里的值的概念:復(fù)雜數(shù)值,矩陣,向量,坐標(biāo)(對(duì)稱(chēng)坐標(biāo)和笛卡爾坐標(biāo)),四元數(shù)。.. 很多東西都可以被當(dāng)作值,只要你用正確的方式去看待它。

這種情況持續(xù)了很久,之后程序員出現(xiàn)了,之后計(jì)算機(jī)被發(fā)明了。
一旦人們對(duì)計(jì)算機(jī)技術(shù)的重要性達(dá)成共識(shí),并且使計(jì)算機(jī)技術(shù)逐步完善起來(lái),程序員就開(kāi)始用一種新的思想考慮他們了,比如:看著這計(jì)算機(jī)打印輸出的長(zhǎng)河般一排排的三個(gè)字母組成的匯編程序碼,你不頭痛也不行。

如果他們能把那些序列碼按相同的功能分成一組一組,給它們起個(gè)名稱(chēng),那么他們將會(huì)有一種簡(jiǎn)潔的方式去重復(fù)利用這些代碼,那么以前花大量時(shí)間拼寫(xiě)這些代碼的時(shí)間節(jié)省下來(lái),終于有了去酒館的時(shí)間。 因?yàn)楹芏嗟某绦騿T也都是數(shù)學(xué)家,因?yàn)楹芏嗨麄兊某绦蚨际怯脕?lái)解決數(shù)學(xué)問(wèn)題的,這就決定了函數(shù)的概念非常簡(jiǎn)潔的迎合了這種給編程單元打包處理的行為,從此第二代編程語(yǔ)言誕生了。

完美中的不足

這種革新,完美中有些不足。 針對(duì)函數(shù),人們發(fā)現(xiàn)一個(gè)問(wèn)題,就是經(jīng)常需要它們一次處理多個(gè)輸入值,或,更令人沮喪的,多個(gè)輸出值。 幸運(yùn)的是一些數(shù)學(xué)家解決了如果讓函數(shù)處理多個(gè)輸入值的問(wèn)題,這種思想很早就被人采納了,人們按照這種思路想出來(lái)如何去返回多個(gè)輸出值(通常是把輸入值給抹去,替換我想要輸出的值)。 但是其他的一些數(shù)學(xué)家(例如Haskell)并不喜歡多個(gè)輸入值的方式,他產(chǎn)生了一個(gè)新的觀點(diǎn),用高階函數(shù)替代多個(gè)輸入值,函數(shù)可以返回其它函數(shù),或可以用函數(shù)體當(dāng)作函數(shù)參數(shù),但這種做法很難實(shí)現(xiàn),所以程序員起初都沒(méi)在意這種觀點(diǎn)。

函數(shù)編程還有一個(gè)問(wèn)題,就是它有副作用。 一個(gè)函數(shù)使用一個(gè)相同輸入值(例如讀一個(gè)文件)卻可以每次都做出不同的事情,或者它可以去做一些不專(zhuān)一的事情(例如處理返回一個(gè)值外還會(huì)向控制臺(tái)打印一行字)。 更糟糕的是,它會(huì)把自己的輸入值在使用之后改變其值! 對(duì)于那些想利用這些副作用的人來(lái)說(shuō),這是再好不過(guò)了,可是對(duì)于另外的一些數(shù)學(xué)家就不一樣了,他們不喜歡喝啤酒,可是還必須要把啤酒杯拿在手上。

所以程序里的函數(shù)跟數(shù)學(xué)里的函數(shù)是不同的。 人們給出了一個(gè)新的定義(不是很精確的):一個(gè)程序,或者一批指令,具有一個(gè)名稱(chēng),可以選擇性的擁有一個(gè)或多個(gè)輸入值和輸出值,甚至同時(shí)具備多個(gè)輸入值和多個(gè)輸出值,同時(shí)還能做點(diǎn)額外的事情。 #p#

A reprive ahead of its time

自然,很多數(shù)學(xué)家并不高興函數(shù)被定義成這樣,于是一個(gè)新的語(yǔ)言品種被創(chuàng)造了出來(lái),用來(lái)彌補(bǔ)其先天的不足,再一次的將它用一個(gè)穩(wěn)固的理論架構(gòu)確定下來(lái)。函數(shù)體成為第一類(lèi)實(shí)體,而非以前的僅是一批代碼的別名。 這樣Haskell的高階函數(shù)的概念就可以應(yīng)用于設(shè)計(jì)開(kāi)發(fā)軟件了。 編程語(yǔ)言的進(jìn)化發(fā)展中人們?cè)絹?lái)越多的鼓勵(lì)使用常量值,這樣函數(shù)就不能把輸入值給能臟了。 人們實(shí)現(xiàn)了局部套用(Currying),開(kāi)始使用數(shù)組結(jié)構(gòu),這樣函數(shù)終于又回到了只能接受一個(gè)輸入值和一個(gè)輸出值的紳士面貌。 一些有趣的方法被人們采用來(lái)限制那些討厭的副作用:如果這些副作用不能完全避免的話(huà),那就把它們規(guī)整起來(lái)專(zhuān)門(mén)找個(gè)地方放置它們。 這樣的語(yǔ)系被人們稱(chēng)作為函數(shù)式編程語(yǔ)言,因?yàn)樗鼈儼押瘮?shù)的概念回歸到了其數(shù)學(xué)上的根源。 這個(gè)語(yǔ)系里的語(yǔ)言包括有Lisp, Scheme, Caml, Erlang, F#, Clojure等。

作為工程學(xué)上一個(gè)優(yōu)秀的典范,函數(shù)式語(yǔ)言具有設(shè)計(jì)優(yōu)良,易理解,高效,結(jié)構(gòu)穩(wěn)定等優(yōu)點(diǎn)。 與此同時(shí),如同其他Good Ideas?經(jīng)常遇到的情況一樣,很長(zhǎng)的一段時(shí)間里它們被主流團(tuán)體所遺忘。 程序員們都很清楚為什么人們喜歡把函數(shù)放在首要位置; 人們需要把系統(tǒng)按單元功能劃分,相互不依賴(lài),可以在不同的地方重復(fù)使用它們。 這些愿望就像癢癢需要撓的感覺(jué)折磨著人們,于是面向?qū)ο蟮乃季S從此誕生了并崛起了。

目前,函數(shù)式編程只是被人們當(dāng)成一種業(yè)余愛(ài)好,也被人們用在相關(guān)的演講和論文里去靈巧的闡述一些新事物。 人們通常認(rèn)為函數(shù)式語(yǔ)言會(huì)比命令式語(yǔ)言運(yùn)行的慢,但這種結(jié)論也許只有上帝知道,因?yàn)閺膩?lái)沒(méi)有人用自己的方式證明過(guò)。 人們還認(rèn)為,盡管函數(shù)式語(yǔ)言看起來(lái)非常簡(jiǎn)潔,適合小的程序和做演示用,但它們不太適合大規(guī)模的程序,像那些成百上千行的程序,如果用函數(shù)式語(yǔ)言來(lái)開(kāi)發(fā),幾乎是不可維護(hù)的。

重生

實(shí)際上,函數(shù)式語(yǔ)言并不只是一種玩物。 跟隨著時(shí)代革新的大潮,它在地下醞釀了這么多年,終于等到了這個(gè)世界可是接受它的這一天。 主流程序員們?cè)絹?lái)越多的認(rèn)識(shí)到,函數(shù)式語(yǔ)言是如此的容易使用,而這一點(diǎn)在其它(面向?qū)ο螅┐a是難以達(dá)到的。 就比如這個(gè)簡(jiǎn)單的問(wèn)題處理這個(gè)字符串隊(duì)列,將它們?nèi)哭D(zhuǎn)化成大寫(xiě)后返回,用Java編寫(xiě)卻有可能出錯(cuò)。 因?yàn)榕紶柸藗儠?huì)忽略掉這個(gè)隊(duì)列里的第一個(gè)字串,因?yàn)樗麄儚?開(kāi)始計(jì)數(shù),而不是0。有時(shí)候人們會(huì)發(fā)現(xiàn)這個(gè)隊(duì)列里的字串不是按他們要求的部分轉(zhuǎn)化成大寫(xiě),而是全部大寫(xiě)了,還有些時(shí)候程序會(huì)報(bào)出空指針異常。

逐漸的,人們開(kāi)始討論起closures和continuations,為的是讓他們的程序更加的強(qiáng)壯和可維護(hù)。 當(dāng)時(shí)這些東西并不是對(duì)象們所能具有的,于是加強(qiáng)型for循環(huán)被發(fā)明了,還有匿名類(lèi),visitor模式,command 模式。 當(dāng)然這些沒(méi)有一個(gè)能按照程序員們想象的那樣的完美,但這些東西還是有用的,讓很多有問(wèn)題的地方變得可維護(hù)了(即使這樣需要編排一些丑陋的模板式的代碼)。 時(shí)機(jī)已經(jīng)到了人們改變思維方式的時(shí)候了,函數(shù)式語(yǔ)言已經(jīng)迫不及待的看到自己的宏大入場(chǎng)了。

讓人嫉妒的特性

通過(guò)Erlang語(yǔ)言,愛(ài)立信演示了函數(shù)式語(yǔ)言如何能應(yīng)用于大規(guī)模系統(tǒng)的。 而其開(kāi)發(fā)效率高,可維護(hù)性,可測(cè)試性都很好,特別是不易犯錯(cuò)。 這才是真正的函數(shù)式語(yǔ)言的面貌,感覺(jué)比面向?qū)ο笳Z(yǔ)言要成功的多。 愛(ài)立信的程序員們前所未有的有了充分的喝啤酒的空閑時(shí)間了。 生活變得輕松起來(lái)!

而在另外的陣營(yíng)里的程序員看待函數(shù)式語(yǔ)言有點(diǎn)想法,也有的嫉妒。 Java變得如此臃腫,而且,每一個(gè)新出現(xiàn)的特征都看起來(lái)是圍繞著它的模板代碼風(fēng)格創(chuàng)造出來(lái)的。 即使是很小的程序,現(xiàn)在也要使用annotations,模板參數(shù),和duplicate type declarations,大程序問(wèn)題就更大了。 不幸中的不幸,關(guān)于如何往Java里添加closures(閉包)功能的討論并不像早期預(yù)期的那樣順利,還有,Java bean里的數(shù)不完的get/set方法實(shí)在是不能在忍受了。
有些事情必須要變了。

除了這些,Java還有一大堆的問(wèn)題。 The Virtual Machine(虛擬機(jī))是一個(gè)非常成熟的工具,經(jīng)過(guò)了很好的優(yōu)化,市場(chǎng)上隨處可見(jiàn),從洗衣機(jī),移動(dòng)電話(huà),到數(shù)不清的web服務(wù)器和桌面電腦里都有它的身影。 Java系統(tǒng)在開(kāi)源庫(kù)和框架方面已經(jīng)發(fā)展的令人瞠目結(jié)舌繁華,在一些付費(fèi)系統(tǒng)里也火的不得了。 靠著Java這棵大樹(shù),市面上已經(jīng)到處都是由各種企業(yè)投資推動(dòng)的數(shù)不清的團(tuán)隊(duì)開(kāi)發(fā)工作創(chuàng)造出的成功和成熟的java項(xiàng)目,如果因?yàn)橐恍┬〉恼Z(yǔ)言特征而放棄Java這一切基本是不可能的。

我們一起做蛋糕 也一起吃

我們所有做的事既要繼承Java所有目前的優(yōu)質(zhì)資產(chǎn),同時(shí)也要使用函數(shù)式語(yǔ)言重新描繪新的編程語(yǔ)言版圖,Scala正好迎合了這種需要,盡管它有很多的競(jìng)爭(zhēng)對(duì)手。 Pizza語(yǔ)言第一個(gè)出現(xiàn)的,但它跟今天的Scala比較起來(lái)更Scala當(dāng)初的形式。

我們所知的能在JVM上跑的語(yǔ)言大概有JavaFX, JRuby, Jython, Groovy 等。 大部分都有closures 和其他的一些函數(shù)式語(yǔ)言具有的特征,但在Java王國(guó)里,這些新生事物并不是那么的血統(tǒng)純正,它們的特征更像是外來(lái)移民,護(hù)照很新亮,但有異域口音。

動(dòng)態(tài)語(yǔ)言的流行是無(wú)濟(jì)于事的; 類(lèi)型可以通過(guò)各種方法隱藏起來(lái),讓人感到它的不存在,但是這樣很難編譯出原生的Java代碼了。 這是個(gè)很大的問(wèn)題,特別是你寫(xiě)出的對(duì)象需要拿到第三方類(lèi)庫(kù)里去處理時(shí)。 有時(shí)候各種語(yǔ)言之間很難交互,通常需要一個(gè)解釋器,就像JSR233 Scripting API 或 the Bean Scripting Framework 那樣。Scala卻有與生俱來(lái)的優(yōu)勢(shì),它和Java的結(jié)合是如此的緊密,它能像自己本身的類(lèi)型那樣處理Java類(lèi)型,它并不像一個(gè)外來(lái)移民,而是一個(gè)僑胞,而且是有護(hù)照的公民。

你從外面看,Java和Scala編譯出來(lái)的代碼是一模一樣的,沒(méi)有區(qū)別,這有點(diǎn)讓人難以置信,但可以明確的告訴大家,Scala最初就是這樣設(shè)計(jì)出來(lái)的。 當(dāng)你把Scala當(dāng)作一種函數(shù)式語(yǔ)言時(shí),你會(huì)更驚奇的發(fā)現(xiàn),它把面向?qū)ο蠛秃瘮?shù)式的兩種風(fēng)格以其優(yōu)雅的方式完全融合統(tǒng)一起來(lái)。

正因?yàn)樗蚃ava是如此緊密的聯(lián)系,你可以把Scala當(dāng)作Java臨時(shí)的替代品,它絕對(duì)不會(huì)強(qiáng)制你用任何的函數(shù)式風(fēng)格的代碼書(shū)寫(xiě)。 它的類(lèi)型引用,簡(jiǎn)潔的屬性存取,以及帶有成員變量參數(shù)的構(gòu)造函數(shù),你幾乎可以把它當(dāng)作一種風(fēng)格簡(jiǎn)潔的Java。 除了上述的優(yōu)點(diǎn)外,我們可以稱(chēng)贊Scala為某些方便比Java面向?qū)ο蟾晒Φ恼Z(yǔ)言:

一切皆為對(duì)象,包括數(shù)值和函數(shù)

在Java中,方法不是對(duì)象,更別提基本數(shù)據(jù)類(lèi)型了。 2.toString在Scala里是一個(gè)合法的語(yǔ)句。它拋棄了靜態(tài)類(lèi)成員,Java的這個(gè)問(wèn)題可以追溯到它所效仿的C++上,是個(gè)歷史錯(cuò)誤。 C++本身就是個(gè)混合型的語(yǔ)言,它的設(shè)計(jì)目標(biāo)就是要兼容過(guò)程式的C語(yǔ)言,同時(shí)也要支持對(duì)象結(jié)構(gòu)。 靜態(tài)成員不是完全的可面向?qū)ο?,因?yàn)樗麄儾荒軐?shí)現(xiàn)接口,以及向普通成員那樣的多形性和覆蓋、過(guò)載。 當(dāng)你把一個(gè)對(duì)象當(dāng)作參數(shù)傳入一個(gè)函數(shù)時(shí),靜態(tài)成員是不可用的。

相反,Scala提供了singleton objects, 這樣這種問(wèn)題就不存在了。 Scala里新的companion概念可以讓你使用singleton去訪(fǎng)問(wèn)具有相同類(lèi)名的實(shí)例上的一個(gè)有約束限定的成員,這樣你就可以把靜態(tài)成員的權(quán)限復(fù)制出來(lái)。

類(lèi)上所有的屬性都實(shí)現(xiàn)了behind-the-scenes,就像是個(gè)隱藏域,而且有針對(duì)它的一對(duì)Get和Set隱藏方法。 那些任何人都可以直接修改的內(nèi)部屬性將不再被允許公共訪(fǎng)問(wèn),在將來(lái),虛擬類(lèi)的概念將會(huì)在Scala里出現(xiàn),那樣后Scala對(duì)對(duì)象的支持將會(huì)有更驚人的表現(xiàn)。函數(shù)式編程對(duì)下面的特征進(jìn)行了支持:

◆對(duì)遞歸函數(shù)的尾調(diào)用(tail-call)優(yōu)化

◆模式匹配

◆第一類(lèi)函數(shù)和高級(jí)函數(shù)

◆局部函數(shù)(可以接受任何輸入值)

◆局部套用(Currying)和函數(shù)局部應(yīng)用

◆閉包

◆簡(jiǎn)潔的聲明常量值的語(yǔ)法定義,很好的支持常量集合的類(lèi)庫(kù)

◆continuations (scala 2.8 新增)

所有的這些都意味著什么?

函數(shù)式編程已經(jīng)證實(shí)了它的實(shí)力,快速增長(zhǎng)的開(kāi)發(fā)者人數(shù)是最好的證明,Scala向大家演示了如何在不犧牲面向?qū)ο笏季S模式下接受函數(shù)式設(shè)計(jì)模式的概念。 它同時(shí)也向大家顯示了如果將這兩種風(fēng)格的語(yǔ)言如何融合到一起變成一個(gè)強(qiáng)壯豐滿(mǎn)的新語(yǔ)言,不帶任何的形式的勉強(qiáng)。

一旦你了解了基本語(yǔ)法并對(duì)閉包、第一類(lèi)屬性、高階函數(shù)、traits,、immutable refs等概念有了認(rèn)識(shí),它的各種特點(diǎn)的相互結(jié)合會(huì)向你展示它更深層次的潛質(zhì)。 語(yǔ)言生命里的一些設(shè)計(jì)思想的選擇和確定最終導(dǎo)致了一個(gè)增效作用,我們認(rèn)定這種新一代的對(duì)象-函數(shù)式的設(shè)計(jì)正是使Scala今天如此成功的關(guān)鍵。

【編輯推薦】

  1. 與Scala的第一次親密接觸 Java如影相隨
  2. Scala的啟發(fā):代碼本質(zhì)與過(guò)度包裝的平衡
  3. Scala代碼編寫(xiě)中常見(jiàn)的十大陷阱
  4. Adobe架構(gòu)師談Scala:功能強(qiáng)大但令人困惑
  5. 萬(wàn)物皆對(duì)象:介紹Scala對(duì)象
責(zé)任編輯:王曉東 來(lái)源: CSDN
相關(guān)推薦

2009-07-08 16:10:24

Scala簡(jiǎn)介面向?qū)ο?/a>函數(shù)式

2009-06-16 17:09:17

Scala面向?qū)ο?/a>函數(shù)編程

2010-11-17 11:31:22

Scala基礎(chǔ)面向?qū)ο?/a>Scala

2009-09-27 15:23:00

Scala講座函數(shù)式編程Scala

2010-01-28 14:51:24

Scala后函數(shù)式

2009-09-27 15:29:00

Scala講座面向?qū)ο?/a>Scala

2011-06-28 11:06:16

Scala

2009-06-09 13:18:56

Scala函數(shù)式命令式

2010-07-09 14:12:00

ScalaF#C#

2010-07-07 13:11:20

ScalaF#C#

2020-10-26 12:27:18

對(duì)象編程函數(shù)式

2013-11-26 10:14:15

面向?qū)ο?/a>函數(shù)式

2009-12-11 10:44:00

Scala講座函數(shù) scala

2013-09-09 09:41:34

2009-07-08 16:52:29

ScalaScala教程

2009-07-21 17:16:34

Scala函數(shù)式指令式

2022-09-22 08:19:26

WebFlux函數(shù)式編程

2011-08-24 09:13:40

編程

2023-12-14 15:31:43

函數(shù)式編程python編程

2021-10-11 07:46:50

ScalaJVM語(yǔ)言
點(diǎn)贊
收藏

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