Elixir 程序设计
  • 推荐0
  • 收藏0
  • 浏览321

Elixir 程序设计

(美)Dave Thomas(大卫·托马斯) (作者)  杜万 (译者)

  • 书  号:978-7-121-28264-5
  • 出版日期:2016-04-05
  • 页  数:340
  • 开  本:16(185*230)
  • 出版状态:上市销售
  • 原书名: Programming Elixir
  • 原书号:9781937785581
  • 维护人:许艳
本书作者就是 15 年前编写了 Programming Ruby,将 Ruby 带入大众视野的 Dave Thomas。这一次他延续了一贯的写作风格,以一个拥有面向对象的开发经历但并未接触过函数式编程的开发者的角度切入,循序渐进地带领读者进入 Elixir 的奇妙世界。通过一步步的实验探索,引导读者逐步跳出已有的编程思维模式,以全新的函数式编程方式来思考及寻找解决实际问题的办法。然而本书并不像 Programming Ruby 那样面面俱到,而是给读者讲述基本的 Elixir 语法和编程思想,同时提供许多有用的资源,启发读者继续深入探索。这也是学习一门新语言的乐趣所在。
如果你对函数式编程有兴趣,或者你正在苦苦寻求一种高效的并发编程的方法,Elixir可以作为入门之选,值得一试。
业界赞誉
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
??Cody Russe

我真的很享受阅读这本书。它不只是一股脑儿地介绍一些语法或特性;总的来说,我认为它对 Elixir 和函数式编程做了非常周到的介绍。

推荐序
最开始杜万说请我为他翻译的 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 这么
1 https://coding.net/pp 2另一个译者黄明信的网络 ID
美妙的语言带给了我,感谢你一次次在翻译过程中帮我解惑,帮我字斟句酌;感谢责任编辑许艳,感谢你在整个过程的付出,感谢你细致地审稿,从一次次反馈中感受到了你编辑工作的严谨;感谢同事杨臻,在一些拿捏不准的地方,帮我提了许多建议;感谢所有帮助过我的人。
杜万2015 年 1月3 日于上海
遇见 Elixir 可能是一种缘分吧!我比较喜欢管它叫“万金油”,但并不代表它就是万能的,毕竟世界上没有完美的东西。Elixir 继承了 Erlang 在构建分布式系统上的优点,并通过添加众多现代编程语言的特性来提升语言的表达能力。如果说 Erlang 是并发编程的领路者,那么 Elixir就是你一路跑来在沿途看到的美好风景,它会让你的编码旅程更精彩。
翻译这本书是为了让更多人能了解 Elixir。无论你是否会在项目中使用它,都值得你去“玩”一下,体验一下新思维。现代编程语言的实用性不局限于它的运行效率,还体现在语言的表达能力及对基础设施的抽象能力上。在我看来,写代码如同文学创作,不仅要把你的想法准确地传达给机器,更重要的是让读代码的人有种清风扑面而来的快感。
这本书与 Programming Ruby是同一位作者,他的写作风格是技术作者中少有的,措辞生动,引经据典,颇富文采,奈何中西文化有别,本人又才疏学浅,未能将原作者的想法传神地表达出来。希望各位读者多多包涵。
非常感谢在翻译过程帮助过我的同事们,特别是本书的另一位译者,杜万。由于是第一次翻译,很多工作都不懂如何开展,加上又是个急性子,经常会为些小事情发牢骚。感谢他对我的包容,每当想放弃的时候他都在一旁鼓励。同时还要感谢出版社的工作人员,正因为他们在整个过程中的辛劳付出,本书才得以顺利出版。
黄明信2015 年 1月4 日于湛江

前言
我对于计算机硬件的变化给编程方式带来的影响一直很感兴趣。
几十年前,内存是非常紧缺的资源。那时,对软件而言,接管一块内存并在需要的时候修改其中的内容也是非常合乎情理的。然而,将这块内存分配出去,当不再需要它的时候将其清理干净,则是一件很容易出错的工作。某些内存永远得不到释放;有时内存被分配到另一个正在被使用的结构数据之上而导致程序出错。当时,垃圾回收已经是众所周知的技术,但我们需要更快的 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

徒劳无益的辩解
我是一个语言迷。我喜欢尝试各种编程语言,喜欢思考它们的设计和实现。(我知道,这很折磨人。)
1998年,我遇到了 Ruby,因为我是 comp.lang.misc(问问你的前辈们,它是什么)的热心读者。我下载它,编译,并喜欢上了它。就像坠入爱河一样,很难解释为什么。 Ruby以我喜欢的方式运行,并且它有足够的深度,让我一直都很感兴趣。
很快地,15年过去了。这段时间,我一直在寻找能带给我同样感觉的新玩意儿。
前阵子我遇上了 Elixir,但是由于某些原因并没有深入。在开始写这本书之前的几个月,我和 Corey Haines聊了聊。我向他诉苦找不到一种方式可以向人们展示函数式编程的概念,同时还要避开那些书本上引入的学术气息。他让我再去看看 Elixir。我照做了,然后我感受到了和第一次看到 Ruby时同样的感觉。
所以现在我很急切。我想其他人也看到 Elixir有多好。我想传道。所以,我的第一步是写一本书。
但是我不想再写一本 900页的镐头书3。我希望这本书既简短又有趣。所以我不会深入讲解所有的细节,罗列所有的语法、所有的函数库、所有的 OTP选项,或者……
相反,我想向你展示这种编程模型的能力和优点。我想鼓励你动手,然后让你自己去寻找在线资源,这些资源会填补本书中未提及的内容。
总之,我希望你从其中获得乐趣。
Programming Ruby的封面是一把镐。 ——译者注
感谢
我所深爱的语言都是由聪明且非常和善的人创造的,这似乎是一条共同的主线。而 José Valim,Elixir的创造者,则让我见识了非同一般的智慧和友善。我向他表示由衷的感谢,因为过去的 18个月 Elixir给我带来如此多的乐趣。整个 Elixir的核心团队在他的带领下完成了令人赞叹的工作,创建了比它更加成熟的整个生态。谢谢你们。
与 Corey Haines的对话重新点燃了我对 Elixir的兴趣 ——谢谢你,Corey,为那些在班加罗尔的美妙夜晚和灵感。
Bruce Tate一直是一个有趣的宣传者,他对稿件所提出的意见使本书完善了不少。众多积极而有见地的试读者给我支持,而且提出了数以百计的改进建议。谢谢你们。
向 Jessica Kerr、Anthony Eden以及 Chad Fowler致敬,感谢他们允许我借鉴他们的推文。
Candace Cunningham是本书的文字编辑。除了揪出书中数百个语法错误,她还发现了一些代码错误。祝福她。
Potomac的工作人员为本书做了很棒的索引。
Susannah Davidson Pfalzer是整个项目中最理智的人(正如她在我们许多的 Bookshelf项目里的角色一样),而 Janet Furlow让我们畅所欲言。
最后,这是我首次和一个负责散文的编辑写一本书。这是一次奇妙的体验。这本书因为 Lynn Beighley的建议而变得更好。谢谢!
Dave Thomas
dave@pragprog.com
得克萨斯州达拉斯 2014年 10月

目录

目录 阅读
第1章 接受现实
第1部分 常规编程
第2章 模式匹配
第3章 不可变性
第4章 Elixir 基础
第5章 匿名函数
第6章 模块与命名函数
第7章 列表与递归
第8章 字典:散列表、散列字典、关键字列表、集合与结构体
第9章 番外篇-类型是什么
第10章 处理收集—Enum 与Stream
第11章 字符串与二进制型
第12章 控制流
第13章 组织项目
第2部分 并发编程
第14章 运用多进程
第15章 节点——分布式服务的关键
第16章 OTP:服务器
第17章 OTP:应用程序监视器
第8章 OTP:应用程序
第19章 任务与代理
第3部分 更高级的Elixir
第20章 宏与代码求值
第21章 连接多个模块:行为与use
第22章 协议——多态函数
第23章 更酷的玩意儿

读者评论

相关图书

Python机器学习手册:从数据预处理到深度学习

Chris Albon (作者) 韩慧昌 (译者)

这是一本关于Python的图书,采用基于任务的方式来介绍如何在机器学习中使用Python。书中有近200个独立的解决方案(并提供了相关代码,读者可以复制并粘贴这...

¥89.00

Python接口自动化测试

王浩然 (作者)

本书主要介绍如何用Python实现接口自动化测试。全书主要内容包括接口基础、接口手工测试、编程前的准备、用Python处理MySQL数据库、用Python发送H...

¥59.00

Python编程之美:最佳实践指南

Reitz,Schlusser (作者) 夏永锋 (译者)

本书是Python用户的一本百科式学习指南,由Python社区数百名成员协作奉献。<br>全书内容分为三大部分。第一部分是关于如何配置使用Python编辑工具的...

¥89.00

Lua程序设计(第4版)

Roberto Ierusalimschy (作者) 梅隆魁 (译者)

本书由 Lua 语言作者亲自撰写,针对 Lua 语言本身由浅入深地从各个方面进行了完整和细致的讲解。作为第 4 版,本书主要针对的是 Lua 5.3,这是本书撰...

¥89.00

Python网络安全教科书

胡松涛 (作者)

本书是一本黑客技术的入门实战书籍,从最初的工具选择,一直到最后的攻击演示,由浅入深地引导读者全面系统地掌握网络安全防范技术,借助Python打造更安全的网络。<...

¥69.00

Python数据分析入门——从数据获取到可视化

沈祥壮 (作者)

本书作为数据分析的入门图书,以Python语言为基础,介绍了数据分析的整个流程。本书内容涵盖数据的获取(即网络爬虫程序的设计)、前期数据的清洗和处理、运用机器学...

¥39.00