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

專(zhuān)訪鄧草原:從對(duì)象和函數(shù)式到現(xiàn)實(shí)世界的項(xiàng)目

原創(chuàng)
開(kāi)發(fā) 后端
函數(shù)式編程是計(jì)算機(jī)世界最古老的編程范式之一。從最初的Lisp,Scheme和Haskell到今天的Erlang,F(xiàn)#和Scala,函數(shù)式語(yǔ)言從商業(yè)領(lǐng)域慢慢縮小到學(xué)術(shù)領(lǐng)域,而近幾年又開(kāi)始回到大家的視野當(dāng)中。51CTO開(kāi)發(fā)頻道近日在QCon 2010會(huì)場(chǎng)上采訪到NetBeans的Erlang和Scala插件的作者鄧草原先生,探討了函數(shù)式語(yǔ)言的應(yīng)用前景。

【51CTO獨(dú)家特稿】在09年7月,51CTO開(kāi)發(fā)頻道的一篇譯文中,一位名叫Neil的美國(guó)開(kāi)發(fā)者向我們廢了半天的口舌說(shuō)明一個(gè)好的入門(mén)編程語(yǔ)言應(yīng)該要盡可能的鼓勵(lì)學(xué)生發(fā)展天生的好奇心,最好是像Python一樣簡(jiǎn)單,而千萬(wàn)不要用Scheme這種可能是“最好”的學(xué)習(xí)編程的方式去扼殺了大多數(shù)年輕人的熱情。當(dāng)然無(wú)論Neil持怎樣的觀點(diǎn),事實(shí)上Scheme在美國(guó)的很多著名大學(xué)中都被列入第一年的計(jì)算機(jī)課程,而Neil也并不否認(rèn)Scheme能夠?yàn)榻窈蟮木幊虒W(xué)習(xí)打下簡(jiǎn)單而堅(jiān)實(shí)的基礎(chǔ),并認(rèn)為教授Scheme的學(xué)校很可能都是一流的。那么,這個(gè)Scheme是個(gè)什么樣的語(yǔ)言呢?

“Scheme是Lisp語(yǔ)言的一個(gè)分支,它是現(xiàn)今仍然在使用的最古老的編程語(yǔ)言之一。它提供了最少的語(yǔ)法和極少幾個(gè)操作符。同樣重要的是,Scheme支持函數(shù)式編程范式,這意味著它可以用數(shù)學(xué)函數(shù)表達(dá)式來(lái)編程。”

今天這篇文章的主角不是Scheme——這個(gè)古老的語(yǔ)言在國(guó)內(nèi)幾乎可以說(shuō)是鮮為人知。不過(guò),這個(gè)語(yǔ)言跟我們今天要討論的話(huà)題有很深的關(guān)系:為什么我們要開(kāi)始關(guān)注和學(xué)習(xí)函數(shù)式語(yǔ)言。在剛剛結(jié)束不久的QCon 2010大會(huì)上,51CTO開(kāi)發(fā)頻道有幸面對(duì)面的采訪到了NetBeans上的Erlang和Scala插件的作者鄧草原先生,對(duì)函數(shù)式語(yǔ)言在最近幾年的普及進(jìn)行了探討。(值得一提的是,草原最初接觸的函數(shù)式語(yǔ)言正是Scheme和Lisp。)

[[10531]]

鄧草原,宏爵財(cái)經(jīng)資訊技術(shù)主管。除了NetBeans Erlang和Scala插件項(xiàng)目之外,他也是開(kāi)源軟件AIOTrade項(xiàng)目的主創(chuàng)者,以及NetBeans夢(mèng)之隊(duì)成員。在2009年11月,51CTO開(kāi)發(fā)頻道曾經(jīng)就Scala IDE的開(kāi)發(fā)情況對(duì)草原做過(guò)一次郵件訪談,感興趣的讀者們可以參考這篇文章。

本次采訪的內(nèi)容主要從兩個(gè)角度探討了函數(shù)式語(yǔ)言的普及:開(kāi)發(fā)者的角度,以及項(xiàng)目的角度。從市場(chǎng)而言,這是一個(gè)供需的關(guān)系:因?yàn)轫?xiàng)目需要這種特點(diǎn)的編程語(yǔ)言,所以需要招聘掌握此種語(yǔ)言的開(kāi)發(fā)者,所以開(kāi)發(fā)者需要開(kāi)始學(xué)習(xí)。軟件領(lǐng)域是一個(gè)日新月異的產(chǎn)業(yè),雖然說(shuō)函數(shù)式語(yǔ)言是一個(gè)計(jì)算機(jī)界的老古董,但這個(gè)埋了許久的金子在近幾年來(lái)開(kāi)始發(fā)光了起來(lái)。也許是時(shí)候開(kāi)始仔細(xì)考慮這樣一個(gè)選擇,迎著風(fēng)險(xiǎn)前進(jìn)了。

以下是訪談實(shí)錄。

項(xiàng)目的角度:為什么要考慮函數(shù)式語(yǔ)言?

函數(shù)式語(yǔ)言近年來(lái)開(kāi)始流行,原因何在?

草原:一個(gè)是我們現(xiàn)在的程序員適應(yīng)變化,開(kāi)發(fā)的周期比以前要加快了。以前一個(gè)程序?qū)懗鰜?lái),可能一年去開(kāi)發(fā),然后兩三年間只需要小的修修補(bǔ)補(bǔ)就可以了。但是現(xiàn)在一個(gè)很明顯的特點(diǎn)就是,很多程序都是要求你去非??斓?,根據(jù)需求的變動(dòng),根據(jù)系統(tǒng)的壓力,不斷地做一些滾動(dòng)的開(kāi)發(fā)。這個(gè)時(shí)候,對(duì)于一個(gè)語(yǔ)言的抽象能力就會(huì)有些新的要求。比如在Java里頭,我們可能會(huì)用到很多事件處理,內(nèi)部類(lèi),匿名類(lèi)這些東西,但是Java在語(yǔ)言的簡(jiǎn)潔性方面,可以說(shuō)一直到Java 6以來(lái)都沒(méi)有考慮的太遠(yuǎn)。從這個(gè)角度來(lái)講,函數(shù)式編程它首先在語(yǔ)言的簡(jiǎn)潔性方面帶來(lái)很多新的機(jī)制;或者說(shuō),函數(shù)式語(yǔ)言它提供了另外一種抽象的能力,可以讓你的代碼更加簡(jiǎn)潔。

另外,有些問(wèn)題本來(lái)就是適合用函數(shù)式來(lái)處理的。原來(lái)我們沒(méi)有這種手段的時(shí)候,這些問(wèn)題可能要寫(xiě)一堆命令式的代碼;那么現(xiàn)在有這種手段之后,我們就可以很快的跟實(shí)際問(wèn)題通過(guò)函數(shù)的方式把它對(duì)上,代碼本身的質(zhì)量也會(huì)得到很大的提高。

當(dāng)然還有一個(gè)原因就是現(xiàn)在多核時(shí)代,并發(fā)和并行計(jì)算的要求。并發(fā)和并行,尤其是并行,相對(duì)而言是希望能夠把一個(gè)任務(wù)分配到多個(gè)CPU上去運(yùn)行。因?yàn)橄鄬?duì)來(lái)說(shuō),函數(shù)式語(yǔ)言強(qiáng)調(diào)的是引用透明,就是說(shuō),一個(gè)函數(shù)只要你給我一個(gè)相同的輸入,那么按理來(lái)說(shuō)我會(huì)給出一個(gè)相同的輸出。像這種應(yīng)用就是一個(gè)很好的并行計(jì)算的基本顆粒,這些顆粒可以簡(jiǎn)單的把它分配到不同的CPU上面或者不同的節(jié)點(diǎn)上面去運(yùn)行。這個(gè)是函數(shù)式語(yǔ)言現(xiàn)在受到更多關(guān)注的一個(gè)重要原因。

在項(xiàng)目中應(yīng)用函數(shù)式語(yǔ)言,主要面對(duì)哪些障礙?

草原:我一直有這樣一個(gè)觀點(diǎn):我們的語(yǔ)言是為了解決現(xiàn)實(shí)世界中的問(wèn)題,而現(xiàn)實(shí)世界應(yīng)該從對(duì)象和函數(shù)兩個(gè)角度去看?;蛘邞?yīng)該這樣說(shuō),現(xiàn)實(shí)世界既是函數(shù),又是對(duì)象。所以從這個(gè)角度來(lái)看,如果我們用一個(gè)純函數(shù)式的語(yǔ)言去解決我們現(xiàn)實(shí)問(wèn)題的時(shí)候,而不是為了解決一個(gè)學(xué)術(shù)問(wèn)題或是做一些計(jì)算,那么做這些工作的時(shí)候就會(huì)發(fā)現(xiàn),純函數(shù)語(yǔ)言只發(fā)揮了語(yǔ)言抽象能力的一面而已。所以我認(rèn)為,如果讓函數(shù)式語(yǔ)言能夠得到更好的發(fā)展,最好的途徑是像Scala這樣:它是一個(gè)融合了OO和FP(函數(shù)式風(fēng)格)的,而且融合的相當(dāng)好的語(yǔ)言。我覺(jué)得更多的人以后會(huì)發(fā)現(xiàn),從函數(shù)的角度去抽象,Scala會(huì)幫助他們漸進(jìn)的了解這一點(diǎn)。

使用函數(shù)式語(yǔ)言與其他語(yǔ)言進(jìn)行多語(yǔ)言混合編程的效果如何?

草原:從多語(yǔ)言混合編程的角度來(lái)看,它們之間交互的關(guān)鍵我覺(jué)得還不是在它們是函數(shù)式或者是OO。因?yàn)楝F(xiàn)在,比如說(shuō)Ruby,Erlang,還有Scala,Java,它們之間的互操作一般都是會(huì)通過(guò)一些特定的協(xié)議。只要這個(gè)協(xié)議得到保證,那么不管你之前在某個(gè)部件上面,或者是應(yīng)用的某一塊上使用了Ruby或者Erlang,實(shí)際上都沒(méi)有關(guān)系。所以從這個(gè)角度而言,當(dāng)你在一個(gè)項(xiàng)目中使用不同語(yǔ)言的時(shí)候,你重點(diǎn)考慮的可能是,我現(xiàn)在所要解決的這一塊是不是這個(gè)語(yǔ)言所適合的。

比如說(shuō)我們以前有一個(gè)例子,是我們做過(guò)的一個(gè)銀行的項(xiàng)目,就是一個(gè)非常典型的混合語(yǔ)言的項(xiàng)目。這是個(gè)兩三年前的項(xiàng)目,那時(shí)候,銀行的業(yè)務(wù)系統(tǒng)是用Java編寫(xiě)的,中間有一個(gè)Erlang的程式來(lái)把手機(jī)發(fā)過(guò)來(lái)的信息轉(zhuǎn)換成后臺(tái)的業(yè)務(wù)系統(tǒng)需要的協(xié)議,并且從后臺(tái)業(yè)務(wù)系統(tǒng)返回來(lái)的數(shù)據(jù)再轉(zhuǎn)換成手機(jī)上需要的協(xié)議。這個(gè)轉(zhuǎn)換過(guò)程是用Erlang來(lái)做的。但是在轉(zhuǎn)換過(guò)程中,我們用到了大量的XML文件的解析,這個(gè)解析本身,說(shuō)實(shí)話(huà),Erlang它并不擅長(zhǎng)做這種字符串或是文本的處理,所以這一塊我們是用Scala寫(xiě)的。Scala它包裝了一個(gè)XML的庫(kù),這個(gè)時(shí)候,Scala就可以發(fā)揮它在JVM上運(yùn)算的效率優(yōu)勢(shì)。Erlang和Scala之間的通訊使用的是Erlang的那套IPC通訊機(jī)制。然后在我們的前端還有個(gè)Web應(yīng)用,這個(gè)Web應(yīng)用在那時(shí)是用Ruby寫(xiě)的。所以這是一個(gè)非常典型的混合語(yǔ)言的應(yīng)用,試圖發(fā)揮不同的語(yǔ)言在做不同事情時(shí)的優(yōu)點(diǎn)。

但說(shuō)實(shí)話(huà),我本人是希望能找到一種更一般化的語(yǔ)言,能夠同時(shí)具有不同的抽象能力,它能同時(shí)在不同的領(lǐng)域用不同的方式去解決不同的問(wèn)題。如果現(xiàn)在我再設(shè)計(jì)這套系統(tǒng)的話(huà),可能里面就只剩Scala了。

#p#

開(kāi)發(fā)者的角度:如何學(xué)習(xí)函數(shù)式語(yǔ)言?

51CTO:您是如何開(kāi)始了解函數(shù)式語(yǔ)言的?

草原:我本身對(duì)函數(shù)式語(yǔ)言了解的話(huà),可能是源于大學(xué)里頭了。大學(xué)里頭對(duì)于Lisp或是Scheme有過(guò)一些了解,只是那時(shí)候的了解還不夠深入,大概有個(gè)概念。真正把它應(yīng)用到自己的實(shí)際項(xiàng)目當(dāng)中應(yīng)該是從Erlang開(kāi)始的。這個(gè)大概是在三、四年前。那時(shí)候開(kāi)始認(rèn)真的去考慮,一個(gè)純函數(shù)式的語(yǔ)言,能夠在應(yīng)用中能帶來(lái)哪些新的,或者說(shuō),抽象的手段,還有處理問(wèn)題的手段。

51CTO:您覺(jué)得學(xué)習(xí)函數(shù)式語(yǔ)言的難點(diǎn)都有哪些?

草原:掌握函數(shù)式語(yǔ)言,我覺(jué)得相對(duì)來(lái)說(shuō),數(shù)學(xué)的基礎(chǔ)要扎實(shí)一些。如果實(shí)在是覺(jué)得自己在這方面有所欠缺的話(huà),沒(méi)有關(guān)系,你可以把過(guò)去的很多算法啊,數(shù)學(xué)方面的這些東西都拿回來(lái)看一看。然后你再回頭去看函數(shù)式編程,那個(gè)時(shí)侯你可能會(huì)理解的更深一點(diǎn)。

另外呢,還要多做練習(xí)。因?yàn)槿绻汩L(zhǎng)久以來(lái)都是在做OO的開(kāi)發(fā),忽然轉(zhuǎn)到函數(shù)式風(fēng)格的編程,可能是需要一個(gè)適應(yīng)的過(guò)程。這個(gè)時(shí)候,一些教程和練習(xí)就能起很大的作用。

51CTO:函數(shù)式編程的技術(shù)門(mén)檻會(huì)比較高嗎?

草原:以Scala為例,如果我從Java轉(zhuǎn)過(guò)去使用Scala的話(huà),這個(gè)過(guò)渡實(shí)際上是比較循序漸進(jìn)的。我可以按照傳統(tǒng)的風(fēng)格寫(xiě)很多命令式的代碼,但是在寫(xiě)的過(guò)程中你會(huì)發(fā)現(xiàn),Scala提供了非常多的能夠以函數(shù)式風(fēng)格處理的API,你可能慢慢的就會(huì)熟悉這種API。熟悉了API之后,可能就會(huì)慢慢有了函數(shù)式編程的習(xí)慣。我覺(jué)得這是最切實(shí)可行的轉(zhuǎn)變的一種手段,這也是為什么我比較看好Scala的原因。

【相關(guān)閱讀】

Scala如何改變了我的編程風(fēng)格:從命令式到函數(shù)式

這篇可以算是是Artima總編Bill Venners的一個(gè)函數(shù)式語(yǔ)言初步體驗(yàn)感言。在學(xué)習(xí)Scala的過(guò)程中,Bill總結(jié)道:“函數(shù)化的編程風(fēng)格強(qiáng)調(diào)不可變對(duì)象、變量可被初始化但不能重新賦值(Java中的最終變量)、數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換,以及方法和控制的構(gòu)造,最終產(chǎn)生一個(gè)沒(méi)有副作用的結(jié)果。這個(gè)領(lǐng)域的另一端是命令式的風(fēng)格,以可變對(duì)象、變量可被重新賦值(Java里的正常變量)、在數(shù)據(jù)結(jié)構(gòu)中索引、以及帶副作用的方法和控制構(gòu)造為特征。”

因并發(fā)而生 因云計(jì)算而熱:Erlang專(zhuān)家訪談實(shí)錄

51CTO在08年對(duì)國(guó)內(nèi)Erlang陣營(yíng)的兩位先驅(qū)者,趙東煒和成立濤兩人的訪談。云計(jì)算的背景和多核的需求使函數(shù)式語(yǔ)言開(kāi)始復(fù)蘇,但Erlang的學(xué)習(xí)的確有很大難度:“它主要是把一個(gè)程序拆成各個(gè)不同的任務(wù),在并行上面跑,這其實(shí)不是很徹底的、完全新的東西,比如說(shuō)我們從Google的地圖里面可以看到這個(gè)思想,但這就是并發(fā)的思想。它對(duì)我們大家目前所熟悉的語(yǔ)言會(huì)造成沖擊,這個(gè)思維模式會(huì)是一個(gè)難點(diǎn),除此之外語(yǔ)言的語(yǔ)法是一個(gè)難點(diǎn)。”

F#簡(jiǎn)明教程一:F#與函數(shù)式編程概述

這是一個(gè)系列文章,適合剛剛開(kāi)始起步學(xué)習(xí)F#的開(kāi)發(fā)者。F#是微軟.NET開(kāi)發(fā)平臺(tái)的一門(mén)編程語(yǔ)言,其最大的特點(diǎn)是對(duì)函數(shù)式編程(FP,F(xiàn)unctional Programming)的引入;F#對(duì)面向?qū)ο螅∣OP)編程的支持也很出色,使用F#語(yǔ)言,開(kāi)發(fā)人員可以自由選擇函數(shù)式編程或面向?qū)ο缶幊虂?lái)實(shí)現(xiàn)他們的項(xiàng)目。此外,F(xiàn)#還可以與.NET平臺(tái)上C#、VB等其他編程語(yǔ)言緊密結(jié)合。

兩個(gè)相關(guān)技術(shù)專(zhuān)題:Scala編程語(yǔ)言 | F#函數(shù)式編程語(yǔ)言

51CTO專(zhuān)訪鄧草原視頻請(qǐng)見(jiàn)下一頁(yè)

#p#

視頻采訪實(shí)錄

 

責(zé)任編輯:yangsai 來(lái)源: 51CTO.com
相關(guān)推薦

2023-08-28 09:00:00

強(qiáng)化學(xué)習(xí)深度學(xué)習(xí)人工智能

2022-10-27 15:34:00

物聯(lián)網(wǎng)智慧城市工業(yè)4.0

2009-07-09 00:25:00

Scala函數(shù)式

2019-01-17 11:00:28

ARAR手機(jī)AR眼鏡

2011-10-25 10:22:57

Siri

2018-01-05 13:45:34

數(shù)據(jù)化互聯(lián)網(wǎng)人工智能

2023-09-06 15:27:00

混合現(xiàn)實(shí)架構(gòu)

2009-07-08 16:10:24

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

2009-09-27 15:29:00

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

2015-04-03 15:48:44

UNITE

2010-03-26 11:21:41

Oracle流程管理工作流

2023-07-27 14:44:03

物聯(lián)網(wǎng)IOT

2021-12-10 22:13:08

VR虛擬空間

2020-11-25 13:33:07

區(qū)塊鏈比特幣加密貨幣

2024-02-23 09:36:50

2021-01-29 11:30:47

數(shù)字定義車(chē)聯(lián)網(wǎng)數(shù)字化

2023-12-26 17:27:10

2018-03-07 13:30:09

數(shù)據(jù)庫(kù)Redis

2024-02-28 07:59:25

2021-01-21 15:40:45

VRARVR眼鏡
點(diǎn)贊
收藏

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