Programming 板


LINE

※ 引述《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://webptt.com/m.aspx?n=bbs/Programming/M.1619754515.A.3F8.html ※ 編輯: closer76 (223.137.228.39 臺灣), 04/30/2021 12:00:53
1F:推 iLeyaSin365: 謝謝提供心得,聊贈一點p幣 111.82.59.67 04/30 12:26
2F:→ iLeyaSin365: 是啊 雖然我沒學多久寫程式 但也覺 111.82.59.67 04/30 12:26
3F:→ iLeyaSin365: 得編程的思維很重要 所以想接觸這 111.82.59.67 04/30 12:26
4F:→ iLeyaSin365: 些 111.82.59.67 04/30 12:26
其實「初學者是否應該學 FP」也是我在思考的問題。 國內的大學幾乎都是以實用導向,由程序式、物件導向式入門。 當年我唸書時,FP 會開在大三的選修課,但也不是很熱門。 國外以前在 CS101 會教 Lisp(古老的 FPL);但近年也改成教 Python...
5F:推 pinefruit: 感謝分享~180.218.168.129 04/30 15:57
6F:推 tylpk: 推這篇,之前也想學Erlang,但有了Go之後,223.136.120.204 04/30 16:42
7F:→ tylpk: 需要的東東都有了,就提不起勁了。FPL最難223.136.120.204 04/30 16:42
8F:→ tylpk: 的就是模式匹配的寫法,平常都不會想這樣寫223.136.120.204 04/30 16:42
9F:→ 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
10F:推 tylpk: rust我最喜歡的就是可以用_來做Hex數字的 223.136.89.3 05/03 05:25
11F:→ tylpk: 分隔點,除錯設定值時非常好用。 223.136.89.3 05/03 05:25
12F:→ tylpk: https://github.com/tylpk1216/hamming7264 223.136.89.3 05/03 05:27
13F:→ tylpk: /blob/master/src/main.rs 223.136.89.3 05/03 05:27
14F:推 dododavid006: 推 rust ,這語言的概念我覺得很適 36.233.125.241 05/03 11:22
15F:→ dododavid006: 合有用過其它語言的人去了解試試 36.233.125.241 05/03 11:23
16F:推 preed: 好文章 61.70.82.73 06/14 09:58
17F:推 MoonCode:125.228.246.251 11/05 14:47







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Tech_Job站內搜尋

TOP