Elixir 程式設計

Elixir 程式設計

《Elixir 程式設計》是2016年3月電子工業出版社出版的圖書,作者是【美】Dave Thomas(大衛·托馬斯)。

基本介紹

  • 書名:Elixir程式設計
  • 作者:【美】Dave Thomas(大衛·托馬斯)
  • 譯者:杜萬 黃明信 
  • ISBN:978-7-121-28264-5
  • 頁數:340
  • 定價:75.00元 
  • 出版社電子工業出版社
  • 出版時間:2016年3月
  • 開本:16
內容簡介,編輯推薦,目錄,媒體評論,前言,

內容簡介

《Elixir 程式設計》作者就是15 年前編寫了Programming Ruby,將Ruby 帶入大眾視野的Dave Thomas。這一次他延續了一貫的寫作風格,以一個擁有面向對象的開發經歷但並未接觸過函式式編程的開發者的角度切入,循序漸進地帶領讀者進入 Elixir 的奇妙世界。通過一步步的實驗探索,引導讀者逐步跳出已有的編程思維模式,以全新的函式式編程方式來思考及尋找解決實際問題的辦法。然而本書並不像Programming Ruby 那樣面面俱到,而是給讀者講述基本的Elixir 語法和編程思想,同時提供許多有用的資源,啟發讀者繼續深入探索。這也是學習一門新語言的樂趣所在。
如果你對函式式編程有興趣,或者你正在苦苦尋求一種高效的並發編程的方法,Elixir 可以作為入門之選,值得一試。

編輯推薦

學習函式式編程的入門好書
用一種更優雅、更高效的方式開發高性能的並發軟體

目錄

第1 章 接受現實 1
編程時應該關注數據轉換 1
藉助管道來組合轉換 2
函式是數據轉換器 3
安裝 Elixir 3
運行 Elixir 4
iex—互動式 Elixir 4
編譯和運行 8
對閱讀本書的建議 9
練習 9
換一種方式思考 10
第一部分 常規編程
第2 章 模式匹配 12
賦值:並非如你所料 12
更複雜的匹配 13
輪到你了15
用_(下畫線)忽略匹配值 15
每次匹配變數僅綁定一次 15
輪到你了17
從另一個角度來看等號 17
第3 章 不可變性 18
你已經擁有了(一些)不可變數據 18
不可變的數據才是已知的 19
不可變性對性能的影響 20
複製數據20
垃圾回收20
用不可變數據編寫程式 21
第4 章 Elixir 基礎 22
內置類型 22
值類型 23
整數 23
浮點數 23
原子 24
區間 24
正則表達式 24
系統類型 25
PID 和連線埠 25
引用 25
收集類型 26
元組 26
列表 27
散列表 28
二進制型29
命名、源檔案、約定、運算符和其他 30
真值 30
運算符 31
小結 32
第5 章 匿名函式 33
函式和模式匹配 34
輪到你了35
一個函式,多個函式體 35
編寫更長的代碼 36
輪到你了37
能返回函式的函式 37
記住原始環境的函式 38
參數化函式 39
輪到你了39
將函式作為參數來傳遞 40
& 運算符 40
輪到你了42
函式是核心 42
第6 章 模組與命名函式 43
編譯模組 43
函式體是代碼塊 44
輪到你了45
函式調用與模式匹配 45
輪到你了48
哨兵子句 48
哨兵子句的限制 49
默認參數 50
輪到你了53
私有函式 53
|> ——美妙的管道運算符 54
模組 55
模組指令57
import 指令 57
alias 指令 58
require 指令 58
模組屬性 58
模組名:Elixir、Erlang 和原子類型 59
調用 Erlang 的庫函式 60
尋找函式館 60
輪到你了61
第7 章 列表與遞歸 62
頭部和尾部 62
使用頭部和尾部來處理列表 63
iex 如何顯示列表 64
使用頭部和尾部來構造列表 66
創建映射函式 67
在遞歸過程中跟蹤值 68
輪到你了69
生成求和函式 69
輪到你了70
更複雜的列表模式 71
列表的列表 71
輪到你了74
List 模組實戰 75
與列表友好相處 76
第8 章 字典:散列表、散列字典、關鍵字列表、集合與結構體 77
如何在散列表、散列字典和關鍵字列表之間做選擇 77
字典 78
模式匹配和更新散列表 79
模式匹配不能綁定鍵 81
更新散列表 82
散列表與結構體 82
訪問結構體的另一種方式 84
嵌套字典結構 85
嵌套訪問器和非結構體 86
動態(運行時)嵌套訪問器 87
集合 88
能力越大,誘惑越大 89
第9 章 番外篇—類型是什麼 90
第10 章 處理收集—Enum 與Stream 92
Enum——處理收集 92
關於排序的說明 95
輪到你了96
Stream——延遲處理的枚舉類型 96
流是可組合的枚舉器 97
無限流 99
自定義流99
流在實際中的套用 104
Collectable 協定 104
推導式 105
推導式也可以處理二進制位 106
作用域與推導式 107
推導式的返回值 107
輪到你了108
感動過往的神 109
第11 章 字元串與二進制型 110
字元串字面量 110
Heredoc 111
魔術符 112
“字元串”這個名稱 113
單引號字元串——字元編碼列表 114
輪到你了116
二進制型 117
雙引號字元串是二進制型 118
字元串與Elixir 庫 118
輪到你了124
二進制型與模式匹配 124
用二進制型來處理字元串 124
輪到你了125
熟悉卻又陌生 126
第12 章 控制流 127
if 與 unless 127
cond 128
case 131
拋出異常 133
包含異常的設計 133
四兩撥千斤 134
輪到你了134
第13 章 組織項目 136
項目:從 GitHub 獲取 issue 136
我們的代碼將如何工作 137
任務:用mix 來創建我們的新項目 137
創建項目樹 138
轉換:解析命令行 140
進階:編寫一些基本的測試 142
輪到你了144
轉換:從 GitHub 獲取數據 144
任務:使用外部庫 145
尋找庫 146
為項目添加庫 146
輪到你了148
回到轉換148
轉換:轉換回響內容 151
不在 hex 里的依賴項 152
應用程式配置 152
轉換:為數據排序 153
轉換:取前n 條 155
輪到你了156
轉換:格式化表格 156
任務:創建命令行可執行程式 159
任務:添加日誌 161
任務:測試代碼注釋 163
任務:創建項目文檔 167
使用轉換數據的方法來編寫代碼 169
輪到你了170
第14 章 運用多進程 172
簡單的進程 173
在進程間傳送訊息 174
處理多條訊息 175
遞歸、循環與棧 178
進程開銷 178
輪到你了181
進程何時結束 182
關聯兩個進程 183
監控進程185
輪到你了186
並行map——Erlang 版本的“Hello, World” 186
輪到你了187
斐波那契數伺服器 188
任務調度器 189
輪到你了192
代理——一個難題 192
以進程的方式來思考 194
第15 章 節點——分散式服務的關鍵 195
命名節點 195
輪到你了197
節點、cookie 與安全 198
給你的進程命名 199
何時給進程命名 202
輪到你了202
I/O、PID 與節點 203
輪到你了204
節點是分散式的基礎 205
第16 章 OTP:伺服器 206
一些 OTP 的定義 206
OTP 伺服器 207
狀態和單個伺服器 207
我們的第一個 OTP 伺服器 208
輪到你了210
單向調用210
跟蹤伺服器的執行情況 212
輪到你了214
GenServer 回調函式 214
給進程命名 216
整理接口 217
輪到你了218
第17 章 OTP:應用程式監視器 220
應用程式監視器與工作進程 220
輪到你了223
管理重啟前後的進程狀態 223
應用程式監視器是可靠性的核心 229
輪到你了229
第18 章 OTP:應用程式 230
這不是傳統的應用程式 230
應用程式規範檔案 231
將Sequence 程式轉變為OTP 應用程式 231
關於套用參數的更多信息 234
監視是可靠性的基礎 234
輪到你了235
熱代碼交換 235
OTP 很大——難以置信的大 241
輪到你了241
第19 章 任務與代理 242
任務 242
任務與監視 243
代理 244
更大的例子 246
使其分散式運行 248
使用代理與任務,還是GenServer 249
第三部分 更高級的Elixir
第20 章 宏與代碼求值 252
實現if 語句 252
宏注入代碼 254
裝載次序255
quote 函式 256
將內部表示作為代碼使用 256
unquote 函式 258
展開列表——unquote_splicing 259
回到我們的myif 宏 260
輪到你了261
使用綁定來注入值 261
宏是衛生的 263
執行代碼片段的其他方法 264
宏與運算符 265
深入研究 266
更進一步 266
輪到你了267
第21 章 連線多個模組:行為與use 268
行為 268
定義行為268
聲明行為269
use 與 __using__ 270
放到一起——跟蹤方法調用 270
使用use 275
輪到你了275
第22 章 協定——多態函式 277
定義協定 277
實現協定 278
可用的類型 279
輪到你了280
協定和結構體 280
內置協定:Access 281
內置協定:Enumerable 282
內置協定:String.Chars 285
內置協定:Inspect 286
協定就是多態 288
輪到你了288
第23 章 更酷的玩意兒 290
自定義魔術符 290
獲取選項292
輪到你了293
多套用的 umbrella 項目 294
創建 umbrella 項目 295
創建子項目 295
LineSigil 項目 296
Evaluator 項目 296
連線子項目 297
別急!還有更多炫酷的玩意兒! 299
附錄A 異常:raise 與try,catch 與throw 300
附錄B 類型規範與類型檢查 306
精彩節摘
推薦序
最開始杜萬說請我為他翻譯的Elixir 的新書寫一篇序,我一頭霧水,因為完全沒有聽說過“Elixir”這個詞,我甚至到現在都不知道這個單詞應該怎么讀,雖然我已經讀完了全書。是的,剛才那個句子很長,不好讀,然而它的邏輯是正確的。這跟我初步了解Elixir 的感覺差不多,不好理解,但邏輯是正確的。
雖然我現在很少寫代碼了,但是作為一個曾經寫了十幾年代碼的人,本書講述的內容,特別是Elixir 的思想很是讓我震撼。我必須承認我並沒有徹底理解這本書,很多的細節沒有時間去詳細實踐,但就我不深的理解,已經體會到了這種基於進程的編程思想,以及它帶來的變革。
在我中學開始學習編程的時候,用的是 Pascal。我知道數據結構、算法,我會做題,然而我對軟體工程一無所知,不知道如何編寫一個完整的套用。後來大學的時候學習Java,才知道 Pascal 是一種面向過程的語言,Java 是面向對象的語言。然而我花了很久才理解了什麼叫作“對象”,以及什麼叫作面向對象的編程。我清晰地記得 Java 課的第一次作業是編寫一個計算器程式。整個程式我只有一個 Java 檔案,所有的代碼都在這個檔案中,活生生用 Java 語言寫了一個 Pascal 程式。
編程思想的轉變是困難的。我在讀這本書的時候,再一次感受到了編程思想的轉變,從面向對象到面向進程。原本在 Java 中非常複雜的多執行緒、分散式處理方式在 Elixir 中變得無比簡單,這也是 Elixir 在現代 IT 系統中的價值:最大化CPU 的處理能力。
大概一年前,我有一個朋友說他最近在瘋狂地研究 Erlang(一種跟 Elixir 接近的語言),他打算說服公司的領導用 Erlang 重做一個系統。當時我覺得他瘋了,我對 Erlang不了解,只知道這是一種很奇怪、很小眾的程式語言,現在我可以理解那個朋友當時的想法了,他一定有一種腦洞大開的感覺!
不論你現在是做 APP 開發,傳統 Web 開發,還是在中國大紅大紫的微信開發,都應該讀一讀此書,它一定會讓你眼前一亮。沒有最好的程式語言,只有最合適的程式語言。隨著硬體的不斷發展,一定會有很多不同於過去常見的編程思想和語言出現,以適應最新的硬體。也許本書的內容不能在你的工作中用到,但這不重要,重要的是思想的碰撞帶來的愉悅,以及碰撞後留下的那些思考。
張海龍,Coding CEO
2016 年1 月19 日·深圳
譯者序
還記得第一次得知 Elixir 是 Coding 的冒泡1上 mingshun2 的一句牢騷:“不要咖啡,不要大象,不要蟒蛇,不要紅寶石,只要萬金油”。這句開發者的嘮叨,吸引了我的注意。顯然咖啡表示 Java,蟒蛇表示 Python,紅寶石表示 Ruby,大象呢?“最好的程式語言,PHP”,一個同事提示道。Google 搜尋了一下,果然 PHP 的 logo 是一頭大象。“那么萬金油呢?”我追問道。同事也一副“什麼鬼”的表情,湊過來一起Google 了一番,才知道萬金油是 Erlang 虛擬機上的一門語言,相當於 Scala 之於 Java 虛擬機,英文名字叫Elixir。這是一門全新的語言,有一些新奇的特性,於我小有觸動。
後來從 mingshun 那裡了解到Programming Elixir 寫得不錯,國內還沒有翻譯版本。於是我就開始張羅和 mingshun 合作翻譯。先找博文視點的編輯許艷與外方談妥了翻譯著作權,試譯兩章,然後很快簽了契約開始動工。
初稿階段比較順利,我們把每一章編寫成獨立 Markdown 檔案,還寫了一個腳本,把Markdown 格式自動轉換成 Word 格式。我們把譯稿放在 Coding 的代碼倉庫里,每譯完一章就提交一個合併請求給另一個 Peer Review。
排版以後就沒那么順暢了,新發現的問題標註在PDF 檔案上,一個人先審,另一個人候著,不容易並行執行。之前了解過原書出版社 Pragmatic Bookshelf 有一套工具可以由源檔案生成多種格式的目標檔案。有了這套工具寫書就像寫代碼,一次編寫,無須排版。
寫了封郵件向 Pragmatic Bookshelf 出版社問詢,對方稱暫時沒有對譯者開放工具。此時深感工具之重要,對於創作和翻譯而言,工具就是生產力。寫代碼也一樣,良好的工具鏈可以極大地提高生產效率,這也是 Coding 推出的一系列雲端開發工具的價值所在。
在翻譯的過程中得到了很多人的幫助,首先要感謝合譯者黃明信,是你把 Elixir 這么美妙的語言帶給了我,感謝你一次次在翻譯過程中幫我解惑,幫我字斟句酌;感謝責任編輯許艷,感謝你在整個過程的付出,感謝你細緻地審稿,從一次次反饋中感受到了你編輯工作的嚴謹;感謝同事楊臻,在一些拿捏不準的地方,幫我提了許多建議;感謝所有幫助過我的人。
杜萬
2015 年 1 月 3 日於上海
遇見 Elixir 可能是一種緣分吧!我比較喜歡管它叫“萬金油”,但並不代表它就是萬能的,畢竟世界上沒有完美的東西。Elixir 繼承了 Erlang 在構建分散式系統上的優點,並通過添加眾多現代程式語言的特性來提升語言的表達能力。如果說 Erlang 是並發編程的領路者,那么 Elixir 就是你一路跑來在沿途看到的美好風景,它會讓你的編碼旅程更精彩。
翻譯這本書是為了讓更多人能了解 Elixir。無論你是否會在項目中使用它,都值得你去“玩”一下,體驗一下新思維。現代程式語言的實用性不局限於它的運行效率,還體現在語言的表達能力及對基礎設施的抽象能力上。在我看來,寫代碼如同文學創作,不僅要把你的想法準確地傳達給機器,更重要的是讓讀代碼的人有種清風撲面而來的快感。
這本書與Programming Ruby 是同一位作者,他的寫作風格是技術作者中少有的,措辭生動,引經據典,頗富文采,奈何中西文化有別,本人又才疏學淺,未能將原作者的想法傳神地表達出來。希望各位讀者多多包涵。
非常感謝在翻譯過程幫助過我的同事們,特別是本書的另一位譯者,杜萬。由於是第一次翻譯,很多工作都不懂如何開展,加上又是個急性子,經常會為些小事情發牢騷。感謝他對我的包容,每當想放棄的時候他都在一旁鼓勵。同時還要感謝出版社的工作人員,正因為他們在整個過程中的辛勞付出,本書才得以順利出版。
黃明信
2015 年 1 月 4 日於湛江

媒體評論

Dave Thomas 再一次做到了:《Elixir 程式設計》成為了每本編程書籍都渴望與之比肩的目標。它不是簡單地教授語法和舉幾個刻板的例子,而是引導你如何以Elixir 的方式思考。
Bruce Tate
icanmakeitbetter.com公司CTO,技術作家
在《Elixir 程式設計》里,David 出色地介紹了函式式編程,他以一種有趣、實用、充滿靈感的方式教我們重新思考如何用不同的方法來設計程式。隨著閱讀的深入,你會不時會心一笑,因為你發現 Elixir 的某方面可以讓你用一種新的、更優雅的方式來解決問題,而且這種方式非常自然和直觀,我們這些編程人員必須馬上套用起來才行。
這本書詳細地介紹了 Elixir 及其工具,旨在使開發過程更加流暢和富有成效。Dave 解釋了 Erlang 運行時系統的核心部件,如分散式、並發和容錯,它們為 Elixir 提供了編寫可擴展、適應性強的應用程式的能力。
Alexei Sholik
順序編程的時代已經過去,如今高性能、可擴展和容錯的軟體都是並發的。Elixir 是這個全新世界裡的關鍵角色,它將 Erlang 和 OTP 的能力帶給更廣泛的客群。閱讀本書吧,為迎接軟體開發新時代開個好頭。
Paul Butcher
《七周七並發模型》的作者
就像鎬頭書之於 Ruby,這本書是 Elixir 的事實標準。Dave 以他無可挑剔的風格,全面介紹了Elixir 語言的各方面,包括數據結構、宏、OTP,甚至 Dialyzer。閱讀本書是一種享受,因為它帶領讀者學習 Elixir,並帶領他們參與編寫函式式程式的整個思維過程。
如果你想快速掌握 Elixir 語言,《Elixir 程式設計》是你的最佳選擇。
Jim Freeze
首屆世界Elixir 會議的組織者
這無疑將成為 Elixir 的鎬頭書。……Dave 很興奮地帶領讀者進入迷人的 Elixir 世界。對於對 Elixir 感興趣的每一位程式設計師而言,本書值得擁有。
Dan Kozlowski
《Elixir 程式設計》是Dave Thomas 的另一佳作。在此之前我嘗試的幾個函式式程式語言都讓我備受挫折。你能感覺到Dave 的熱情和在每一章節使用該語言時的喜悅。他會讓你以從未想到過的方式來思考解決問題的辦法。這本書讓我徹底改變了在思考各種語言編程的改進時的方式。
Richard Bishop
我真的很享受閱讀這本書。它不只是一股腦兒地介紹一些語法或特性;總的來說,我認為它對 Elixir 和函式式編程做了非常周到的介紹。
Cody Russe

前言

我對於計算機硬體的變化給編程方式帶來的影響一直很感興趣。
幾十年前,記憶體是非常緊缺的資源。那時,對軟體而言,接管一塊記憶體並在需要的時候修改其中的內容也是非常合乎情理的。然而,將這塊記憶體分配出去,當不再需要它的時候將其清理乾淨,則是一件很容易出錯的工作。某些記憶體永遠得不到釋放;有時記憶體被分配到另一個正在被使用的結構數據之上而導致程式出錯。當時,垃圾回收已經是眾所周知的技術,但我們需要更快的CPU 才能在日常的軟體中套用此項技術,把我們從手動管理記憶體的苦役中解放出來。好在這已經成為現實——大多數語言現在都支持垃圾回收。
時至今日,相似的情況再次發生。儘管CPU 沒有變得更快,但是我們的計算機的CPU 核心越來越多。這意味著,如果軟體要最大化其對機器的利用率,就要儘可能使用更多的CPU 核心。這種情況正好與我們現在編寫軟體的方法有所衝突。
事實上,當使用多核的時候,修改記憶體狀態確實會拖慢軟體的運行。如果有四個CPU 核心嘗試訪問和操作同一塊記憶體,它們就會相互阻塞。除非採用某種同步機制,否則這樣很可能會導致記憶體崩潰。
很快我就發現使用同步既費勁,還容易出錯,而且煩人,它還會損失性能。突然,我意識到不能將接下來幾年的職業生涯花費在這種編寫軟體的方式上,所以我開始學習新的語言和技術。
在這個探索的過程中,我迷上了 Erlang 虛擬機及其生態圈。
在 Erlang 虛擬機里,所有代碼都運行在微型的並發進程中,每個進程擁有自己的狀態。進程通過訊息進行通信。並且因為所有通信都是通過訊息傳遞來進行的,所以虛擬機能夠透明地處理同一個網路中不同機器的訊息交換,這使它成為構建分散式軟體的絕佳環境!
然而,我感覺在 Erlang 生態圈中依然存在某些空白。我在日常工作中所需要一些功能,Erlang 生態圈沒有給予很好的支持,如元編程、多態以及優秀的工具等。Elixir 就是從這一需求中誕生的。
Elixir 是注重實用的函式式程式語言。它遵從函式式編程的基礎,同時注重提高開發者的生產力。並發是 Elixir 程式的精髓。正如垃圾回收將開發者從記憶體管理的枷鎖中解放出來,Elixir 就是要將你從陳舊的並發機制中解放出來,讓你能快樂地編寫並發代碼。
函式式程式語言讓我們以函式的方式來思考問題,而函式僅轉換數據。這種數據轉換從來不會修改數據。相反,對函式的每一次使用可能都會為這個數據創建一個新版本。這樣就大大地減少了數據同步機制的使用。
Elixir 還給開發者提供強大的宏。Elixir 代碼也被看作是數據,而且可以通過宏來處理,就像Elixir 中的其他任何值一樣。
最終,我相信面向對象的程式設計師會在 Elixir 中找到很多他們認為編寫優秀軟體所需的機制,比如多態。
所有這些都由Erlang 虛擬機提供支持,它已經有20 年歷史,從零開始開發以支持健壯的並發分散式軟體。Elixir 和Erlang 虛擬機將改變你編寫軟體的方式,並為你應對未來的編程問題做好準備。
José Valim
Elixir 的作者
2014 年 10 月於荷蘭 Tenczynek

相關詞條

熱門詞條

聯絡我們