Re: [問題] 請問Erlang很難嗎?
※ 引述《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
推
04/30 12:26,
3年前
, 1F
04/30 12:26, 1F
→
04/30 12:26,
3年前
, 2F
04/30 12:26, 2F
→
04/30 12:26,
3年前
, 3F
04/30 12:26, 3F
→
04/30 12:26,
3年前
, 4F
04/30 12:26, 4F
其實「初學者是否應該學 FP」也是我在思考的問題。
國內的大學幾乎都是以實用導向,由程序式、物件導向式入門。
當年我唸書時,FP 會開在大三的選修課,但也不是很熱門。
國外以前在 CS101 會教 Lisp(古老的 FPL);但近年也改成教 Python...
推
04/30 15:57,
3年前
, 5F
04/30 15:57, 5F
推
04/30 16:42,
3年前
, 6F
04/30 16:42, 6F
→
04/30 16:42,
3年前
, 7F
04/30 16:42, 7F
→
04/30 16:42,
3年前
, 8F
04/30 16:42, 8F
→
04/30 16:42,
3年前
, 9F
04/30 16:42, 9F
程式語言是工具,符合需求就好。我最近也少碰 Haskell 了,玩 Rust 比較多。
不過 pattern matching 是好東西啊! XDD
尤其是在沒有 NULL、改用 Option 概念的語言(例如 Haskell 和 Rust),
用了 pattern matching 程式碼會變得乾淨許多。 :)
※ 編輯: closer76 (223.137.228.39 臺灣), 04/30/2021 18:27:10
推
05/03 05:25,
3年前
, 10F
05/03 05:25, 10F
→
05/03 05:25,
3年前
, 11F
05/03 05:25, 11F
→
05/03 05:27,
3年前
, 12F
05/03 05:27, 12F
→
05/03 05:27,
3年前
, 13F
05/03 05:27, 13F
推
05/03 11:22,
3年前
, 14F
05/03 11:22, 14F
→
05/03 11:23,
3年前
, 15F
05/03 11:23, 15F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章