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

函數式編程是一個倒退

開發 后端
就在這美麗的新世界即將來到之際,就在我們摩拳擦掌打算大干一番之前,我想,現在應該是我們暫停一下、反省一下函數式編程在我們的日常應用開發中是否合適的好時機。

[[92711]]

除非你生活中與世隔絕的深山老林里,否則你應該知道,在眾多的所謂頂級編程高手(alpha geeks)中,函數式編程是十分盛行的。也許你已經使用了某種函數式編程語言。如果你是在使用很傳統的編程語言,例如 Java 或 C#,你應該知道了,這些語言很快就將引入一些函數式編程特征。就在這美麗的新世界即將來到之際,就在我們摩拳擦掌打算大干一番之前,我想,現在應該是我們暫停一下、反省一下函數式編程在我們的日常應用開發中是否合適的好時機。

什么是函數式編程?簡單的回答:一切都是數學函數。函數式編程語言里也可以有對象,但通常這些對象都是恒定不變的 —— 要么是函數參數,要什么是函數返回值。函數式編程語言里沒有 for/next 循環,因為這些邏輯意味著有狀態的改變。相替代的是,這種循環邏輯在函數式編程語言里是通過遞歸、把函數當成參數傳遞的方式實現的。

為什么要使用函數式編程

擁護者說函數式編程能開發出更高效的軟件,而反對者說反之亦然。我感覺雙方的觀點都有問題。我可以輕松的證明函數式編程能使你更難寫出針對編譯器優化的代碼,或者相較于傳統語言的代碼,JIT 編譯器對于函數式代碼會編譯出更慢的程序。命令式編程語言(imperative programming languages)語法跟底層的計算機硬件指令間有著很相似的對應關系,但函數式編程語言卻沒有這種特征。結果就是,編譯器處理函數式編程語言時更費力。

然而,優秀的編譯器能把函數式編程中的閉包、tail 調用、或 lambda 表達式轉換成跟傳統語言中 loop 循環或其它表達式等效的代碼。這需要多做一些工作。如果你在尋找一本厚達 1600 頁的關于這方面的好書,我推薦你《Optimizing Compilers for Modern Architectures: A Dependence-based Approach》和《Advanced Compiler Design and Implementation》。或者你也可以使用 GCC 或任何具有多階段編譯功能、能生成匯編代碼的編譯器自己去證明這一點。

對于為什么要使用函數式編程,這有一個更好的論據,現代的應用程序都會牽涉到多核計算機上的并行運算功能,程序狀態就成了一個問題。所有的命令式語言,包括面向對象語言,在涉及多線程時,都會遇到共享對象的狀態修改問題。這就是死鎖、堆棧跟蹤、低級處理器緩存命中率低等問題的根源。如果對象沒有狀態,這些問題就不存在了。

在很多地方使用函數式編程或函數式編程語言都是非常適合的,甚至是最好的選擇。對于純函數計算,函數式編程明顯的比命令式編程更合適。但對于商業軟件或其它普通應用軟件,你不能不說這正好要顛倒過來。就像 Martin Fowler 著名的闡述,“傻子都能寫出計算機可讀懂的代碼。優秀的程序員寫出的是人能讀懂的代碼。”而函數式編程寫出的代碼就是讓人一眼望去不可讀。

幾段代碼就能讓你知道我說的是什么意思。來自 Erlang 語言的代碼例子:

  1. -module (listsort).  
  2. -export ([by_length/1]).  
  3. by_length (Lists) ->  
  4. qsort (Lists, fun (A,B) -> A < B end).  
  5. qsort ([], _)-> [];  
  6. qsort ([Pivot|Rest], Smaller) ->  
  7. qsort ([X || X <- Rest, Smaller (X,Pivot)], Smaller)  
  8. ++ [Pivot] ++  
  9. qsort ([Y || Y <- Rest, not (Smaller (Y, Pivot))], Smaller). 

這個是 Haskell 語言的:

  1. -- file: ch05/Prettify.hs  
  2. pretty width x = best 0 [x]  
  3. where best col (d:ds) =  
  4. case d of  
  5. Empty -> best col ds  
  6. Char c -> c : best (col + 1) ds  
  7. Text s -> s ++ best (col + length s) ds  
  8. Line -> '\n' : best 0 ds  
  9. a `Concat` b -> best col (a:b:ds)  
  10. a `Union` b -> nicest col (best col (a:ds))  
  11. (best col (b:ds))  
  12. best _ _ = "" 
  13. nicest col a b | (width - least) `fits` a = a  
  14. | otherwise = b  
  15. where least = min width col 

人 vs 機器

一個不怎么樣的程序員一般都能從一段命令式的代碼中很快的看出其基本的功用 —— 甚至這是一種他從未見過的語言。然而雖然你也能從一段函數式代碼里分析出它的功用,但你絕對不可能簡單幾眼就能看出來。不像命令式代碼,函數式代碼并不體現出簡單的語言結構。它展現的都是數學結構。

我們的編程經歷了從紙帶打孔到匯編到宏匯編到C語言(高級宏匯編)再到抽象出了很多老實機器上復制運算的高等編程語言。每一步都使我們越來越接近《星際迷航4》里的場景:遇到麻煩的 Scott 對他的鼠標說出指令(“Hello computer“)。數十年的進步使得編程語言越來越容易被人類閱讀和理解,函數式編程的語法是在把時鐘指針往后撥。

函數式編程能解決并行運算的狀態問題,但付出的代價是失去人類可讀性。函數式編程也許完全可以用于任何環境開發,它甚至可以通過定義面向領域(domain-specific)的編程語言來拉近人類語言和計算機語言之間的距離。但它糟糕的語法使得它極不適合常規目的的編程開發。

不要這么著急的判斷潮流 —— 特別對于那些不想有太多風險的項目。

英文原文:Functional programming: A step backward

【編輯推薦】

  1. 函數式編程如何才有一席之地
  2. 函數要多小才夠好——談小函數之道
  3. 沒有完美的軟件:編程永遠不容易
  4. Rob Pike:我得到的最有價值的編程建議
  5. 最有價值的編程忠告(來自貝爾實驗室Plan 9操作系統的創始人Rob Pike)
責任編輯:張偉 來源: 外刊IT評論
相關推薦

2015-05-25 15:06:28

JavaScript函數式編程

2020-04-20 09:02:33

函數RPCCPU

2016-08-11 10:11:07

JavaScript函數編程

2021-08-02 08:21:53

Python編程語言開發

2009-06-22 13:43:01

F#函數式編程

2013-03-04 09:47:08

Python函數式編程

2013-09-09 09:41:34

2020-11-01 09:05:16

函數式編程編程數據分析

2017-09-15 16:02:15

函數代碼CPU

2012-10-22 14:17:42

函數式程序員

2021-04-14 07:33:02

Java函數式斷言

2011-08-24 09:13:40

編程

2023-12-14 15:31:43

函數式編程python編程

2022-09-22 08:19:26

WebFlux函數式編程

2016-10-31 20:46:22

函數式編程Javascript

2011-03-08 15:47:32

函數式編程

2020-09-24 10:57:12

編程函數式前端

2025-03-11 10:00:20

Golang編程函數

2017-06-08 14:25:46

Kotlin函數

2019-08-06 09:00:00

JavaScript函數式編程前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久草在线视频 | 成人午夜影院 | 久草网站| 亚洲一区二区电影在线观看 | 九九热精品在线 | 国产精品久久久久久久久久 | 99视频在线播放 | 国产精品久久 | 久久精品一二三影院 | 亚洲精品视频在线播放 | 成年人在线 | 欧美成人aaa级毛片在线视频 | 欧美一级黄色片 | 日韩av一区二区在线观看 | 日韩激情在线 | 日韩欧美国产精品一区二区三区 | 免费xxxx大片国产在线 | 亚洲人人| 亚洲精品一区av在线播放 | 亚洲视频欧美视频 | 视频一区二区在线观看 | 中文字幕一区二区三区四区五区 | 久久精品国产一区 | 成人免费视频网站在线看 | a国产视频| 伊人一区 | 视频一区二区中文字幕 | 久久91av | 久草成人| 国产精品一区二区久久精品爱微奶 | 日本久久一区二区三区 | 天天夜天天操 | 亚洲视频在线免费 | 另类专区成人 | 一二三四av | 久久成人精品视频 | 日韩精品视频网 | 可以免费观看的av片 | 欧美精品一区三区 | 欧美日韩久久久 | 国产在线视频99 |