成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你的編程語言做不到的事情

開發(fā) 前端
本文是從 Can Your Programming Language Do This? 這篇文章翻譯而來。

一日,你查看你的程序代碼,你有兩大塊代碼看起來幾乎完全的一樣。事實(shí)上它們就是完全一樣,除了一個(gè)代碼里說的是“Spaghetti(意大利面條)”,另一個(gè)代碼里說的是“Chocolate Moose(巧克力慕絲)”。

  1. //一個(gè)小例子:  
  2. alert("I'd like some Spaghetti!");  
  3. alert("I'd like some Chocolate Moose!");  

這個(gè)例子恰好是用Javascript寫的,但即使是你不懂Javascript,你也應(yīng)該能看懂我說的。

當(dāng)然,重復(fù)的代碼看起來不太好。所以你決定寫一個(gè)函數(shù):

  1. function SwedishChef( food ) { alert("I'd like some "+ food +"!"); } SwedishChef("Spaghetti");   
  2. SwedishChef("Chocolate Moose"); 

 

[[31008]]

 

沒錯(cuò),這個(gè)例子很簡(jiǎn)單,但你可以想出一些更有實(shí)際價(jià)值的例子。這樣做是更好一些,有很多理由,這些理由估計(jì)你都聽說過一萬遍了。可維護(hù)性,可讀性,抽象 = 好!

現(xiàn)在,你又發(fā)現(xiàn)兩塊代碼幾乎完全一樣,除了一塊是不停的調(diào)用一個(gè)叫BoomBoom的函數(shù),而一塊是不停的調(diào)用一個(gè)叫PutInPot的函數(shù)。除此之外,這兩塊代碼完全一樣。

  1. alert("get the lobster");   
  2. PutInPot("lobster");   
  3. PutInPot("water");  
  4. alert("get the chicken");   
  5. BoomBoom("chicken");   
  6. BoomBoom("coconut");  

現(xiàn)在,你需要一個(gè)途徑,把一個(gè)參數(shù)傳遞到一個(gè)函數(shù)里,而這個(gè)參數(shù)本身是個(gè)函數(shù)。這是一個(gè)很重要的功能,它是一個(gè)好的方法,能讓你發(fā)現(xiàn)函數(shù)中存在的重復(fù)的代碼,減少這樣的重復(fù)。

  1. function Cook( i1, i2, f ) { alert("get the "+ i1); f(i1); f(i2); } Cook("lobster","water", PutInPot );   
  2. Cook("chicken","coconut", BoomBoom );  

看見了沒!我們把一個(gè)函數(shù)當(dāng)做了參數(shù)。

你的語言能這樣做嗎?

且慢…如果你還沒有寫出PutInPot 或 BoomBoom 函數(shù)呢。如果你能把他們寫成內(nèi)聯(lián)函數(shù),而不是要在其它地方先聲明,這樣是不是更好?

  1. Cook("lobster", "water", function(x){ alert("pot "+x); } );   
  2. Cook("chicken", "coconut", function(x){ alert("boom "+x); });  

老天,這太方便了。注意到了沒有,我即時(shí)創(chuàng)建了一個(gè)方法,甚至都不用麻煩給它起名,只需掂著它的耳朵把它丟進(jìn)函數(shù)里。

當(dāng)你開始思考把匿名函數(shù)當(dāng)作參數(shù)時(shí),你也許會(huì)注意到有一種代碼到處都是,就是,遍歷數(shù)組里的所有元素進(jìn)行操作。

  1. var a = [1,2,3];   
  2. for (i=0; i<a.length; i++) { a[i] = a[i] * 2; }   
  3. for (i=0; i<a.length; i++) { alert(a[i]); } 

對(duì)數(shù)組里的每個(gè)元素進(jìn)行操作是一種很常見的動(dòng)作,你可以寫出一個(gè)函數(shù),讓它為你做這些:

  1. function map(fn, a) {   
  2. for (i = 0; i < a.length; i++) {   
  3. a[i] = fn(a[i]); }   
  4. }  

現(xiàn)在,你可以把上面的代碼重寫成這樣:

  1. map( function(x){return x*2;}, a );   
  2. map( alert, a );  

另一個(gè)常見的跟數(shù)組相關(guān)的操作是,通過某種方式把數(shù)組里的所有值組合到一起。

  1. function sum(a) { var s = 0; for (i = 0; i < a.length; i++) s += a[i]; return s; }
  2.  function join(a) { var s = ""; for (i = 0; i < a.length; i++) s += a[i]; return s; }
  3.  alert(sum([1,2,3]));   
  4. alert(join(["a","b","c"]));  

sum 和 join 看起來非常的相似,你也許會(huì)想把它們的通用之處提取出來做成一個(gè)能把數(shù)組里的元素合并成一個(gè)值的通用函數(shù):

  1. function reduce(fn, a, init) {   
  2. var s = init;   
  3. for (i = 0; i < a.length; i++) s = fn( s, a[i] );   
  4. return s;   
  5. }   
  6. function sum(a) { return reduce( function(a, b){ return a + b; }, a, 0 ); } 
  7. function join(a) { return reduce( function(a, b){ return a + b; }, a,""); }  

很多老式的語言根本沒有方法做出這種事情。另外一些語言允許你做這些,但不容易(例如,C語言里有函數(shù)指針,但你必須進(jìn)行聲明,并要在什么地方定義它)。面向?qū)ο蟮恼Z言并沒有被證實(shí)可以允許你對(duì)函數(shù)做所有的操作。

如果你想在Java里把函數(shù)作為一個(gè)一等(First Class)對(duì)象,你需要建一個(gè)只包含一個(gè)用來調(diào)用功能點(diǎn)的方法的整個(gè)對(duì)象。把這種現(xiàn)象跟實(shí)際情況聯(lián)系起來,很多的面向?qū)ο笳Z言都會(huì)要求你為每個(gè)class創(chuàng)建一個(gè)完整的文件,非常的沒效率。如果你的編程語言里要求你去這樣的調(diào)用功能點(diǎn),那你根本沒有享受到現(xiàn)代語言環(huán)境給你帶來的所有好處。看看能否退貨吧,挽回一點(diǎn)損失。

寫這樣的小函數(shù),只是做一些遍歷數(shù)組,處理其中的每個(gè)元素的操作,這樣做究竟能得到多少好處?

那好,我們來回頭看一看map這個(gè)函數(shù)。當(dāng)你需要對(duì)數(shù)組里的每個(gè)元素依次做一些操作時(shí),實(shí)際情況是,你并不在乎處理這些元素的順序。你可以向前或向后遍歷整個(gè)數(shù)組,得到的結(jié)果是一樣的,不是嗎?事實(shí)上,如果你的機(jī)器是2cpu的,你可以寫出一些程序讓每個(gè)cpu個(gè)處理一半的元素,你的map一下子就變快了2倍。

或者,只是個(gè)假設(shè),在你遍布全球的數(shù)個(gè)數(shù)據(jù)中心里,你有成千上萬的服務(wù)器,你有一個(gè)非常非常大的數(shù)組,我說過,只是假設(shè),它們裝載著整個(gè)互聯(lián)網(wǎng)的內(nèi)容信息。那現(xiàn)在,你就可以在你的成千上萬的計(jì)算機(jī)上運(yùn)行map函數(shù),每個(gè)機(jī)器都能分?jǐn)偟粲?jì)算中的一小部分任務(wù)。

所以,如今,舉個(gè)例子,要想寫出一個(gè)十分高效的能搜索整個(gè)互聯(lián)網(wǎng)內(nèi)容信息的代碼,你只需要簡(jiǎn)單的用基本搜索字符串當(dāng)作參數(shù)來調(diào)用map函數(shù)就行了。

這里,我想請(qǐng)你們要真正注意的有趣的事情是,你會(huì)發(fā)現(xiàn)像map和reduce這樣的函數(shù)每個(gè)人都可以使用,當(dāng)人們使用它時(shí),你只需要找到一個(gè)編程能手寫出最困難的調(diào)用map和reduce函數(shù)的代碼,讓它們能夠運(yùn)行在全球大量的并行執(zhí)行的計(jì)算機(jī)上,而以前舊的運(yùn)行的很好的代碼只需要調(diào)用這個(gè)循環(huán)操作,唯一不同的是,它們獲得了比以前千萬倍快的速度,這意味著你能做瞬間處理完巨大的計(jì)算工作。

讓我再?gòu)?fù)述一遍。通過把通用的循環(huán)操作提取出來,你可以實(shí)現(xiàn)你想要的任何循環(huán)操作,包括實(shí)現(xiàn)出一種能隨硬件設(shè)備的增加而性能升級(jí)的效果。

我想現(xiàn)在你就該明白為什么我在前段時(shí)間寫的一篇文章里抱怨學(xué)校只教授計(jì)算機(jī)科學(xué)專業(yè)的學(xué)生Java知識(shí)而忽略其它:

缺乏對(duì)函數(shù)式編程的理解,你不可能發(fā)明出MapReduce——這個(gè)能夠讓Google實(shí)現(xiàn)大規(guī)模按需擴(kuò)展和升級(jí)的算法。Map和Reduce這兩個(gè)詞來自于Lisp語言和函數(shù)式編程。回首看來,MapReduce對(duì)于任何還存有記憶的人來說都意味著一種純函數(shù)式的編程,沒有副作用,易于并行計(jì)算。事實(shí)恰巧是Google發(fā)明了MapReduce,而微軟沒有,這就說明了為什么微軟仍然努力做那些基本的搜索功能研究的原因了,而Google已經(jīng)開始了它的下一個(gè)目標(biāo):開發(fā)它的Skynet^H^H^H^H^H^H——這世界上最大規(guī)模的并行超級(jí)計(jì)算機(jī)。我并不覺得微軟已經(jīng)認(rèn)識(shí)到在如今的潮流中它已經(jīng)落后的多遠(yuǎn)。

那么,我希望現(xiàn)在你已經(jīng)能理解了以函數(shù)為一等(First class)特征編程語言能使你更容易的對(duì)代碼進(jìn)行提煉抽象,這意味著你的代碼更短小,緊湊,可復(fù)用性強(qiáng),更容易擴(kuò)展升級(jí)。大量的Google應(yīng)用程序都使用了MapReduce,在他們優(yōu)化程序或修改Bug時(shí),都能從中得到益處。

現(xiàn)在我要說一點(diǎn)怨言牢騷,最高效的語言開發(fā)環(huán)境應(yīng)該是一種能讓你在不同層次上進(jìn)行抽象歸納的語言環(huán)境。笨拙陳舊的FORTRAN語言甚至不允許你寫函數(shù)。C語言里有函數(shù)指針,但實(shí)現(xiàn)的很丑陋,不能匿名,使用之前必須先進(jìn)行聲明實(shí)現(xiàn)。Java允許你使用功能點(diǎn)調(diào)用(functor),但更加丑陋。就像Steve Yegge指出的,Java就是一個(gè)名詞的王國(guó)。

【編輯推薦】

  1. 關(guān)于編程 鮮為人知的真相
  2. 在企業(yè)中越來越流行的8種編程語言
  3. 13種最為荒謬但很獨(dú)特的編程語言
  4. 51CTO編程語言排行榜
  5. 開發(fā)者應(yīng)該具備的15個(gè)編程好習(xí)慣
責(zé)任編輯:陳貽新 來源: 外刊IT評(píng)論
相關(guān)推薦

2015-05-05 11:00:13

大數(shù)據(jù)時(shí)代創(chuàng)意

2021-08-10 15:47:17

AI 數(shù)據(jù)機(jī)器學(xué)習(xí)

2011-06-20 08:48:17

編程語言

2012-04-17 09:13:04

2014-04-21 09:56:50

2017-03-16 14:59:47

2020-04-28 18:20:04

Ubuntu 20.0UbuntuLinux

2012-03-27 09:36:59

編程語言

2015-11-02 09:50:48

電腦1秒鐘事情

2015-10-30 08:47:15

2019-03-11 15:01:34

ARiPhone蘋果

2020-08-05 08:55:08

編程語言JavaPython

2024-06-04 16:51:11

2018-11-28 10:00:42

React組件前端

2015-08-17 09:27:06

編程語言需要學(xué)習(xí)

2017-04-07 16:49:00

語言程序編程

2017-04-07 10:45:43

編程語言

2009-08-27 17:12:04

Clojure編程語言Java

2013-09-17 09:35:15

云存儲(chǔ)

2018-05-07 15:32:54

編程語言Python程序員
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 亚洲一区二区三区视频 | 91精品国产91久久久久久三级 | av黄色在线 | 午夜tv免费观看 | 精品不卡| 91视频免费观看 | 国产日韩欧美在线 | 精品欧美一区二区三区久久久小说 | 国产精品视频网 | 亚洲欧美一区二区三区国产精品 | 久久久激情 | 国产精品99久久久久久动医院 | 嫩草伊人 | 伊人超碰 | 亚洲精品在线播放 | 成人在线免费视频 | 国产区视频在线观看 | 欧美亚洲视频 | 日韩精品免费 | 黄色一级片在线播放 | 精品欧美乱码久久久久久 | 噜久寡妇噜噜久久寡妇 | 99精品在线| www中文字幕 | 天天综合网永久 | 观看毛片| 日本一区二区在线视频 | 久久久久中文字幕 | 久久久久国产精品一区二区 | 水蜜桃久久夜色精品一区 | 人人干视频在线 | 国产色视频网站 | 国产免费让你躁在线视频 | 一区二区三区av夏目彩春 | www.av在线 | 日日骚av | 欧美淫 | 成人在线激情 | 欧美成视频 | 国产亚洲网站 | 精品日本久久久久久久久久 |