看板 Programming 關於我們 聯絡資訊
※ 引述《iLeyaSin365 (365)》之銘言: : 最近看到三個語言都跟平行程式有關 : 分別是:Erlang 、Haskell、golang : 雖然最晚,但Go语言因為是Google 出的,教學與應用似乎最多 : 而Haskell 較少,但我發現Erlang的教學好像沒多少 : 有翻書,感覺跟 其它兩個風格更複雜,瑣碎... : 是不是它算平行程式語言裡最難的? : 用途也最狹隘?我還不太清楚什麼是 : 平行程式以及函數式語言的意義。 先說明一下:我個人用 C/C++ 寫作業/討生活已經 20 多年。 這兩、三年才因為興趣開始接觸函數式語言(主要是學 Haskell)。 但沒有拿函數式語言真的寫過什麼中、大型的專案,工作上也沒有用到, 對這方面的認識可能沒有比一般人多多少。下面算是我這幾年的一些小心得吧! 你列的三種語言,Erlang 和 Haskell 都算是純粹的函數式程式語言(簡稱 FPL)。 Go 只能說受到 FPL 的影響,加入一些適合 FP-style 寫程式的語法,不算是 FPL。 ------------------------------- 「函數式程式設計」中的「函數」和「程序式程式語言(例如 C)」中的我們常說的 「函式」其實不太一樣。「函數」其實更接近數學中的定義:y = f(x)。 當你輸入了參數 x,你就會得到一個結果 y。而且, 不論在何時何地,只要輸入的 x 相同,輸出的 y 絕對是一樣的。 這點非常重要! 以 FPL 的術語來說,這就是「沒有副作用 (side-effect)」。 相對來說,C 語言的函式就有可能會因為時間、環境、全域變數、內部狀態等因素, 導致在不同的情境之下,同一個函式加上相同的參數,輸出結果卻不同。 當然你可以舉出一萬個例子,說明 C 語言的這個功能多麼強大、有用。 但就是因為太強大、太有彈性,導致測試除錯變得困難。 另外,如果要作平行處理,也容易發生問題。 (如果有一個函式在不同時間呼叫結果不同,那平行處理這種執行順序不一定的情況下, 你怎麼能保證執行的結果如你所願?) 平行處理不一定要用 FPL; 但因為 FPL 有「無副作用」的特性,所以特別適合進行平行處理。 ------------------------------- FPL 另外一個常見的特性(或說是限制),就是「變數」的值不能更改 (immutable)。 也就是說, int a = 0; a = 2; // 給予 a 新的值 這樣的行為在 FPL 一般來說是做不到的。 (我知道有些 FPL 可以;但可以做到的,通常就被稱為 non-pure FPL) 因為這樣的限制,在程序式程式語言中常見的「迴圈 (iteration)」就沒辦法用; 必須改用「遞迴 (recursion)」來做。程式設計者的思維就必須改變。 ------------------------------- 在 FPL 中,函數可以當成變數來用。(High-Order function) 你可以把它當成另一個函數的參數,或者是回傳值。 這裡只有輕描淡寫兩句,但實際上它有極大的彈性。 你可以輕易地組合數個函數,生成一個功能更強大的新函數。 熟練的人可以用得出神入化,一行程式碼搞定複雜的演算法。 但對新手來說可能就要花個五分鐘才能搞懂這行程式碼在做什麼。 XDD ------------------------------- 另外還有一些特性,可能不是每個 FPL 都有的。 例如 Erlang 有「模組熱抽換」的功能。 (你可以想像程式還在執行的時候,可以更新其中某個 DLL,不需要重啟。 這是因為 Erlang 主要用在通訊設備上,不能隨便斷線更新) 或是 Haskell 的 lazy-evaluation 特性等。 這些功能都有它們的擅長之處。 ------------------------------- 至於 FPL 好不好學.... 我個人認為:不好學,但值得研究。 以我學 Haskell 為例,首先要克服的障礙就是幾乎所有的問題都要用遞迴來解決。 當然 Haskell 提供很多很方便的函數,可以省掉很多麻煩;但要學習、活用這些函數 還是需要時間和經驗。 另外,Haskell 是可以自行組合、定義符號的。 所以你可以在程式碼中看到很多如 <*>, <+>, >->, +<><.... 等奇怪的符號。 看不懂時又很難 google.... 但隨著平行運算越來越重要,軟體業界對於 FPL(或用非 FPL 進行 FP)也越來越重視。 像是 Google 的搜尋引擎命脈 MapReduce,就是受到 FP 的啟發而開發出來的。 也有很多公司認為 FP 易開發(這個我還沒嚐到甜頭XD)、易維護, 所以也改用 FP 的方式開發軟體。 就算,退一萬步來說,我的工作還是要大量使用 C 語言, 我也會利用 FP 的思維,降低函式的副作用,減少錯誤發生的機率。 我想都是有好處的。 ------------------------------- 如果你真的想學 FPL,我的建議是不要從 Erlang 下手。 Erlang 比較專精在通訊基礎建設的領域,除非工作上會用到,否則不容易學。 而且資源真的不夠多。 建議先學其他的 FPL,等工作真的有需要再去學 Erlang。 Haskell 在 pure FPL 中資源算多的,想要學最純粹的 FPL 可以考慮。 以實用性來說的話,可以玩玩 Scala、F#、Clojure、Elixir 等。 但我沒有深入玩過,不敢保證好不好玩。 XDD -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.137.228.39 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1619754515.A.3F8.html ※ 編輯: closer76 (223.137.228.39 臺灣), 04/30/2021 12:00:53
iLeyaSin365: 謝謝提供心得,聊贈一點p幣 111.82.59.67 04/30 12:26
iLeyaSin365: 是啊 雖然我沒學多久寫程式 但也覺 111.82.59.67 04/30 12:26
iLeyaSin365: 得編程的思維很重要 所以想接觸這 111.82.59.67 04/30 12:26
iLeyaSin365: 些 111.82.59.67 04/30 12:26
其實「初學者是否應該學 FP」也是我在思考的問題。 國內的大學幾乎都是以實用導向,由程序式、物件導向式入門。 當年我唸書時,FP 會開在大三的選修課,但也不是很熱門。 國外以前在 CS101 會教 Lisp(古老的 FPL);但近年也改成教 Python...
pinefruit: 感謝分享~180.218.168.129 04/30 15:57
tylpk: 推這篇,之前也想學Erlang,但有了Go之後,223.136.120.204 04/30 16:42
tylpk: 需要的東東都有了,就提不起勁了。FPL最難223.136.120.204 04/30 16:42
tylpk: 的就是模式匹配的寫法,平常都不會想這樣寫223.136.120.204 04/30 16:42
tylpk: 。223.136.120.204 04/30 16:42
程式語言是工具,符合需求就好。我最近也少碰 Haskell 了,玩 Rust 比較多。 不過 pattern matching 是好東西啊! XDD 尤其是在沒有 NULL、改用 Option 概念的語言(例如 Haskell 和 Rust), 用了 pattern matching 程式碼會變得乾淨許多。 :) ※ 編輯: closer76 (223.137.228.39 臺灣), 04/30/2021 18:27:10
tylpk: rust我最喜歡的就是可以用_來做Hex數字的 223.136.89.3 05/03 05:25
tylpk: 分隔點,除錯設定值時非常好用。 223.136.89.3 05/03 05:25
tylpk: https://github.com/tylpk1216/hamming7264 223.136.89.3 05/03 05:27
tylpk: /blob/master/src/main.rs 223.136.89.3 05/03 05:27
dododavid006: 推 rust ,這語言的概念我覺得很適 36.233.125.241 05/03 11:22
dododavid006: 合有用過其它語言的人去了解試試 36.233.125.241 05/03 11:23
preed: 好文章 61.70.82.73 06/14 09:58
MoonCode:125.228.246.251 11/05 14:47