複製鏈接
請複製以下鏈接發送給好友

函數式語言

鎖定
函數式語言(functional language)一類程序設計語言,是一種非馮·諾伊曼式的程序設計語言。函數式語言主要成分是原始函數、定義函數和函數型。這種語言具有較強的組織數據結構的能力,可以把某一數據結構(如數組)作為單一值處理;可以把函數作為參數,其結果也可為函數,這種定義的函數稱為高階函數,程序就是函數,程序作用在結構型數據上,產生結構型結果,從根本上改變了馮·諾伊曼式語言的“逐詞”工作方式。
中文名
函數式語言
外文名
functional language
學    科
計算機科學
定    義
非馮·諾伊曼式的程序設計語言
特    點
並行、單元測試等
優    點
代碼管理更加方便

函數式語言介紹

由於計算機技術的不斷髮展,函數式編程語言逐漸得到人們的重視。我們現在使用的大多數編程語言大都是以馮諾伊曼式的計算機為設計背景,所以我們稱這些計算機編程語言為諾伊曼式語言。1977年,John Backus提出了函數式編程語言,這種語言以非馮諾伊曼式的計算機為設計而背景,所以我們又稱這樣的函數式編程語言稱為非馮諾伊曼式語言。函數式編程,又稱泛函編程,是一種編程範型,它將電腦運算視為數學上的函數計算,並且避免狀態以及可變數據。函數編程語言最重要的基礎是λ演算。而且λ演算的函數可以接受函數當作輸入(引數)和輸出(傳出值)。和命令式編程相比,函數式編程強調函數的計算比指令的運行重要。和程序編程相比,函數式編程裹,函數的計算可隨時調用。
Haskell是一種於1980年代末期所發佈的函數式編程語言,Haskell函數式編程語言是在Miranda的基礎上得到了,它對Miranda進行了標準化,所以這種語言集合了其他相關函數式編程開發的原理,它無需花費太多的贅述就能完成一些數據結構,比如鏈表和矩陣,是當前最廣泛地被用於研究的一種函數式編程語言。它的語言衍生物有很多,有擴充Haskell、並行Haskell和麪向對象的變體如Mondrian等。與此同時,它還被用作為在新語言設計時的標準模板。
另一種函數式編程語言是Clean,它和Haskell有很多一樣的地方。目前這門語言是用C寫成的,由尼茲梅根大學負責維護。
還有一種函數式編程語言是Meta Language, MetaLanguage是由愛丁堡大學與上個世紀七十年代末所開發的,它被歸類為非純函數式編程語言,它之所以有這樣的歸類是因為它允許了副作用和指令式編程的使用。 目前,函數式編程語言還有F#,這是一款針對.NET平台的開放研究的語言。 [1] 

函數式語言語言的特點

函數式編程經常使用遞歸。純函數式的程序沒有變量和副作用(Side effect)。因為純函數式程序設計語言沒有變量,函數沒有副作用,編寫出的程序可以利用記憶化、公共子表達式消除和併發計算在運行時和編譯時得到大量優化。我們常見的編程語言有數十種之多。編程語言種類有很多,如果按照程序設計的方法,可分為以下幾種程序語言:
(1)結構化編程語言,比如C語言等。
(2)函數式編程語言,比如OCaml, Lisp等。
(3)邏輯式編程語言,比如Prolog等。
(4)面向對象程序語言,比如Java等。
通過比較可以發現,函數式編程語言有以下幾個特點:
1、並行。在函數式編程中,程序員無需對程序修改,程序就可以併發運行。程序運行期間,不會產生死鎖現象。原因是通過函數式編程所得到的程序,在程序中不會出現某一數據被同時修改兩次及以上的情況,同樣的,兩個不同的線程就更不用説了。由於函數式編程有這樣的優點,導致了程序員完全不用花費精力去考慮增加某個線程帶來的併發問題。
在函數編程語言中,編譯器會分析代碼,辨認出潛在耗時的創建字符串s1和s2的函數,然後將他們並行的運行。這樣的做法,是程序員在使用普通的命令式程序語言時不可能做到的。而使用函數式程序語言可以自動的找出那些可以併發執行的函數。
2、單元測試。在函數式編程中,由於程序中的每一個符號都是final後的,所以這樣的函數不會產生副作用。這就導致了在某個地方產生修改,同時不會有函數修改過在自身範圍之外的變量或者狀態被另外的函數所使用。這就導致了函數的返回結果只是返回值。只有函數自身的參數才會影響函數的返回值,所以在編程的時候,對程序中的每個函數而言,程序員只需在控制它們的參數,而不用在意函數自己點順序以及函數外部變量和狀態就能正確的編程。與函數式編程相比,命令式編程就沒有這樣的優勢了,在檢查函數的返回值的同時程序員還必須檢查函數是否影響到了函數的外部狀態和變量。
3、沒有額外作用。副作用是指的是函數內部與外部互動。比如,函數在自身內部可以對函數以外的其他變量進行修改,這樣就會產生其他結果。在函數式編程中,想要達到這樣的目的就必須讓函數自身要保持獨立。在函數式程序語言中,所有的功能的結果就是一個返回值,不存在其他的行為,包括對外部變量的修改。
4、不修改狀態。在函數式編程中,程序語言在使用中是會不修改變量的,它的一個特性可以使得函數式編程語言區別於其他的程序語言。在其他類型的語言中,變量是用來保存狀態的。由於函數式編程不修改變量,導致了這些狀態不能存在於變量中。那麼,函數式編程語言保存狀態的方法是使用參數來保存,遞歸方法是最好的例子。由於採用了遞歸方法,函數式編程語言在運行速度上相對於其他語言較慢,所以,速度不夠快是函數式編程語言長期不能廣泛使用的主要原因。
5、引用透明。在函數式編程中,引用透明指的是運行函數的時候,函數的沒一個步驟都不會不牽連到函數的外部變量或狀態,而是隻依賴於函數輸入的參數,相同的參數輸入總會得到相同的函數返回值。而在其他類型的語言中,函數的返回值不僅僅與函數的參數傳入有關,也與當前的系統狀態有關。在不同的系統狀態的情況下,函數的返回值不同。
6、代碼部署熱。在以前,假如想在Windows上安裝更新,安裝之後重啓計算機是必須進行的步驟,可能還不只一次的重啓。即使是僅僅安裝了一個小的軟件也不能免於重啓的步驟。一些特殊的系統,比如電信系統,這樣的系統必須保證任何時間都在運行。因為如果在系統更新時緊急撥號失效,就可能造成很大的損失。最理想的情況是在完全不停止系統任何組件的情況下,達到更新相關的代碼的目的。這樣的想法在命令式編程中是不可能的。對函數式的程序,所有的狀態即傳遞給函數的參數都被保存在了堆棧上,這使的熱部署輕而易舉。實際上,所有我們需要做的就是對工作中的代碼和新版本的代碼做一個差異比較,然後部署新代碼。其他的工作將由一個語言工具自動完成。

函數式語言使用意義

函數式編程語言相對於其他編程語言具有以下意義:首先,函數式編程語言的代碼十分簡單,加快了開發的速度。並且由於在使用函數式編程語言時,程序員會大量使用到函數,從而減少了重複的代碼,因而程序比較短。其次,函數式編程語言更加接近我們使用的自然語言,程序員在學習和使用它的時候更加快捷容易。函數式編程語言的自由度很高,十分接近自然語言寫出的代碼。另外,函數式編程語言的代碼管理更加方便。函數式編程不會對外部產生依賴,也不會修改外界的狀態。程序員只需把指定的參數給函數,相同的參數其返回的結果必定是相同的。另外,函數式編程語言還支持併發編程,這就使得程序員在進行函數式編程時完全不用考慮死鎖的問題,因為它根本就不修改變量,所以就不存在鎖線程的問題。最後,函數式編程語言的代碼支持代碼熱升級。 [2] 
參考資料
  • 1.    王學瑞. 函數式編程語言發展及應用[J]. 計算機光盤軟件與應用,2012,15(23):181-182.
  • 2.    (捷克)佩特里切克著. C#與F#編程實踐. 北京:清華大學出版社, 2011.10.