iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 1
3
Software Development

函數式編程: 從 Elixir & Phoenix 入門。系列 第 1

Elixir, Phoenix: what and why.

什麼是 Elixir

Elixir 是個函數式,動態型別的程式語言。繼承 Erlang 可分散,高容錯的特性,作者 Josè Valim 希望能在保持 Erlang 原先的編程哲學及思考模式的情況下,將更一致的集合操作介面,Ruby 友善易讀的語法,及簡單而強大的元編程(meta-programming)能力帶進 Erlang 生態圈裡。自 2013 釋出 0.1 版以來,獲得許多 Ruby 社群名人的關注,例如 Dave Thomas、Koichi Sasada 等。連 Erlang 作者 Joe Armstrong 都相當欣賞這個語言。

什麼是 Phoenix

唸作 /ˈfiːnɪks/,一個根基於 Elixir 語言的 web 框架,作者是 Chris McCord 。初衷是想解決 Rails 上 WebSocket 的併行及分散式運算的問題,又能保有 Rails 的高生產力。利用了函數式編程的 function composition 方式設計,因此被譽為 “Rails with less magic”。

一個很棒的起點

之所以想介紹 Elixir 及 Phoenix,是因為 Dave Thomas 說過,想成為一個更好的 programmer,每年都要學一門能改變你思考方式的語言。而 Elixir 是踏入 functional programming 一個很棒的起點。Phoenix 則用相當不同的想法,帶來不亞於 Rails 的開發生產力,以及更棒的效能。

Elixir 與 BEAM (Erlang VM)

Elixir 的副檔名可以是 .ex,也可以是 .exs。若是 .ex 時,會先編譯成 .beam 再執行,若是 .exs 則不產生 .beam 檔,編譯後直接在記憶體裡執行。由於在正式環境中是執行編譯完成的 .beam 檔,所以大多數的情況下,Elixir 及 Erlang 的執行速度是同一個數量級的。

https://ithelp.ithome.com.tw/upload/images/20171220/20103390TgBLyioioo.png

總是要提一下 Erlang

Erlang 是愛立信自 1987 年起開發的程式語言。在 Erlang 裡,有一整包函式庫、中介軟體及工具的集合, 叫做 OTP。在 Erlang/OTP 中有許多電信產業已經解決,也非常適合網路應用程式的神奇特性,例如:lightweight process、supervisor tree 及 hot code update 。許多 Erlang 的特性與解法,在 Elixir 上都可以直接套用。Elixir 也儘可能遵從 Erlang 的模式及基本哲學,例如 Actor model、”Let it crash” 等等。

由於 Erlang 在電信產業大規模長時間的運作,已經有十分健全穩固的實戰經驗及生態圈。而 Elixir 可以直接或間接利用這些模式、套件及工具,因此有人稱它為「有 30 年實戰經驗的新語言」。

值得一提的是 Erlang 本身並不是以效能著稱。在單執行緒處理大塊資料時,效能其實不是很好。它的優點在平行運算及高容錯。Erlang 曾在 AXD301 ATM 機器上達到二十年 99.9999999% (nine-nines, 九個九)的可用時間。更能在不關機的情況下,直接修正有錯誤的程式碼,而且不影響到正常使用的使用者。可以看看 “Erlang: the move” 這部非常老派的 Erlang 宣傳影片裡的實例示範:

Yes
(5:21 起)

平行式模型:Actor model

Erlang/Elixir 中有個概念叫 light weight process。它並非作業系統中的 system process,而是 VM 中不互相分享記憶體,獨立運作的輕量級行程。在 Erlang/Elixir 系統中使用 process,就如同在 OO language 裡使用 object instance 一樣。process 間用訊息 (message) 相互溝通。這種分散式系統的運作方式,符合了學術上 Actor model 的定義,雖然 Erlang 圈裡大多不會用這個詞指稱自己。

用 2013 年實測 system process 與 light weight process 的差異讓大家有個概念。同一台硬體裡,用 C# 啟動一個 system process 約 300μs,兩個 process 傳遞每個訊息要 50μs。而 spawn 一個 light weight process ,在總數兩千五百個 process 時,每個約 1μs。當總數到達三萬個 process,則每個新的啟動花費 3μs。各個 process 間的每個訊息傳遞約是 0.8μs。這並非效能比較,而是顯示它們是完全不同層級的東西。而正因 Erlang/Elixir 這個極為輕量的分散式模型,使用多核運算的能力,對這個生態系來說,就如同寫在基因裡一般的。

Chris McCord 在 2016 Erlang Factory 演講,說一台 phoenix web server 可以撐住兩百萬 user session。Erlang 作者 Joe Armstrong 這樣回應:

在 Erlang/Elixir 系統裡,
沒有一台 web-server 可以撐住兩百萬個 session 這種事,
我們有的是兩百萬個 web-server,每個各處理一條 session。

效能

再來看看影片吧。XD

Yes
(5:18 起)

結語

自從 2014 因緣際會開始學 Elixir/Phoenix 以來,它帶給我非常多的樂趣,並讓我學會從全新的角度,看待寫程式這件事。而跟 Mickey Chen 一起辦了近二十場的 Elixir.tw meetup,也在明年的 Ruby X Elixir Conf 同時邀到 Ruby 的作者 Matz 及 Elixir 的作者 Josè。我想用 30 天的文章介紹這個語言及框架,希望它也能帶給你一些很棒的什麼。

Happy hacking!明天見。


下一篇
環境安裝
系列文
函數式編程: 從 Elixir & Phoenix 入門。31

1 則留言

0
Bater
iT邦新手 5 級 ‧ 2017-12-21 17:38:44

期待這個系列

taiansu iT邦新手 5 級 ‧ 2017-12-21 23:21:05 檢舉

萬分感謝支持!

我要留言

立即登入留言