天天看點

《函數式程式設計入門:使用 Elixir》譯者序

自上一本譯作 《Elixir 程式設計》

出版已經過去了三年。Elixir 也從 1.2 版本更新到了 1.10。官方一直保持着每半年更新一個大版本的節奏。這些更新版本中,關于文法的變化和增強越來越少,針對庫、工具鍊、使用體驗和性能相關的更新越來越多,特别是 1.9 版本, José Valim 聲稱 Release 是最後一個計劃中的特性。為 Elixir 語言日臻完善而感到高興。

很多人把 Elixir 比作 Erlang 平台的 Ruby。誠然 Elixir 的作者和貢獻者們從 Ruby 借用了許多語言設計。而 Ruby 就程式設計體驗說是令人驚豔的,其動态、簡潔、元程式設計都是 Java/Golang/Python 這些同時代流行語言所不具備的。當然 Ruby 也有硬傷,比如性能和并發。Elixir 選擇将其基座造在 BEAM(Erlang VM)之上,BEAM 以 9 個 9 的可用性(31 毫秒/年的當機時間)而著稱。從并發上看,Actor 模型曾經是 Erlang 的優勢之一,但今天 Rust 的 Actix 和 Java 的 Vert.x 性能測評甚至比 Erlang 要好,而 Erlang 真正的優勢在于搶占式排程帶來的低延時和軟實時性。Elixir 的設計目标是讓其有更高的可擴充性,更高的生産力,同時保持跟 Erlang 生态圈的相容性。

Elixir 官方将其定義為 “一種用于建構可伸縮、可維護應用的動态、函數式程式設計語言”。下面我們就上述四個關鍵字來談談 Elixir 的與衆不同。

相比于大家熟悉的面向對象(OOP),函數式程式設計範式(FP)強調程式執行的結果而不是過程,倡導利用若幹簡單的執行單元讓計算結果不斷漸進,逐層推導複雜的運算,而不是設計一個複雜的執行過程。每一個函數的結果隻依賴于函數的參數,除了參數之外的任何資料都不會影響執行結果。嚴格的函數式語言要求函數必須無副作用。

而 Elixir 更有特色的函數式相關特性是資料結構不可變、模式比對和管道。資料結構不可變要求每次都通過建立新的資料結構來修改已有的資料機構。而真因為這一點才能保證被傳入的結構複雜的參數是完全不可變的。模式比對讓我們用新的視角去看待指派和判斷。這個特性不僅能夠對資料結構進行解構,還能夠根據函數的入參對方法邏輯進行拆分,使得代碼更加清晰。管道隻是一種類似鍊式調用的文法糖,借助于管道可以更專注于資料變化和流動,有别于 OOP 程式設計中的任務委派。Elixir 的這些文法特性是非常直覺的,可以非常輕松地入門并寫出清晰而易于維護的代碼。

關于動态最直覺的了解是動态類型。Elixir 是一種強動态類型語言,Elixir 中的類型都是在運作時才被推斷出來的,也可以使用類型規格(typespec)在編譯期間聲明函數的簽名和自定義的類型,使用類型規格聲明函數之後,Erlang 的工具就會對源代碼進行靜态的類型檢查,提前暴露出代碼中類型不一緻的問題。這樣做的好處是,你可以獲得靜态類型的大部分優勢,又不會失去動态類型所帶來的靈活性。

大多數基于解釋執行的動态語言都支援 eval 函數,eval 提供另一種動态,執行一段運作時才能确定的代碼片段。通常來說程式操作資料,而這種能通過程式修改程式的方式我們稱之為元程式設計。Elixir 通過宏開放了對 AST 的操作能力,而非類似于 C 語言宏那種編譯期代碼文本的直接替換。元程式設計也是 Ruby 和 Rust 的重要語言特性,其提供的強大表達能力,是讓這類語言受追捧的原因之一。他讓程式,特别是架構代碼更加簡潔。

最近兩年一直在從事 FaaS 相關的研發工作,如今容器技術如火如荼,無服務計算(Serverless)方興未艾,“以應用為中心”成為一種新的架構理念。從雲原生生态的視角看,Docker/K8S/Serverless 等一些列基礎設施都在以語言無關的方式回答可伸縮和可維護的問題。反觀 Elixir,開箱即用依賴安裝、建構和釋出工具鍊、面向高并發的 Actor 模型以及建構大型可伸縮、熱更新的 OTP 架構,顯得小而美。在本地開發和部署到雲上的版本是無差異的,而且是從語言層面,原生工具的層面就開始考慮這些問題,在業務邏輯和健壯應用之間沒有割裂,不需要學額外的架構,更不需要熟悉紛繁的第三方平台。

掌握 Elixir 語言也許目前不能給您的履歷添彩,讓你在職場獲得更多的溢價。但學習 Elixir 可以讓你以不同的視角去看待函數式、可變、并發和高可用。軟體工程最大的挑戰是:持續滿足業務複雜度的同時,保持工程的可維護性。而 Elixir 給出了從語言層面出發的系統性解法。雖然這門語言尚未流行起來,但是一點也不妨礙她優秀。

感謝編輯徐定翔給予的信任和耐心,我才得以順利完成本書翻譯。也感謝 Elixir 上海社群的同學們,特别是組織者 Tony,正因為有你們,我們可以在漫漫長路上結伴同行。由于水準和時間有限,書中有疏漏或者不盡人意之處,敬請廣大讀者批評指正。

杜萬,2020 年 2 月 22 日于上海

《函數式程式設計入門:使用 Elixir》