有趣的Erlang
有人说,在学习一门编程语言的过程中是否觉得有趣,很大程度上取决于对这门语言的介绍方式。
那么……
有趣的旅程就此开始了……
Erlang是什么
Erlang是一门函数式编程语言。如果你曾经用过命令式语言,那么像i++这样的语句对你来说再普通不过了,但是在函数式编程中,却不能这样使用。事实上,改变任何变量的值都是绝对不允许的。乍一听这似乎很奇怪,但是想想上过的数学课,你学到的内容是这样的:
y = 2x = y + 3x = 2 + 3x = 5
如果我把以下内容加进去,你一定会觉得困惑。
x = 5 + 1x = x ∴ 5 = 6
函数式编程认识到了这一点。如果我说x是5,从逻辑上,我就不能说它也等于6!这属于欺诈。这也是为什么每次用同样的参数去调用函数时,它都应该返回相同的值:
x = add_two_to(3) = 5∴ x = 5
对于同样的参数,函数永远要返回同样的值,这个概念称为引用透明性(referential transparency)。正是因为这一点,才能够把add_two_to(3)替换成 5, 因为3+2的结果就是5。这意味着,为了解决更为复杂的问题,我们可以将很多函数粘合在一起,还能保证不破坏任何逻辑。既合乎逻辑,又整洁,不是吗?不过还有一个问题:
x = today() = 2013/10/22 -- 等待一天后 -- x = today() = 2013/10/23x = x ∴ 2013/10/22 = 2013/10/23
哦不!我美丽的等式!它们突然间全部出错了!为什么我的函数每天返回的值都不同呢?
显然,在某些情况下,不遵循引用透明性是有用的。Erlang在函数式编程方面采用了一种非常注重实效的策略:遵守最纯粹的函数式编程原则(引用透明性、避免可变数据等),但是在遇到现实问题时,就打破这些原则。
Erlang是一门函数式编程语言,它同时也非常重视并发和高可靠性。为了让几十个任务能同时执行,Erlang采用了actor模型,每个actor都是虚拟机中的一个独立进程。简而言之,如果你是Erlang世界中的一个actor,你将会是一个孤独的人,独自坐在一个没有窗户的黑屋子里,在你的邮箱旁等待着消息。当你收到一条消息时,会用特定的方式来响应这条消息:收到账单就要进行支付;收到生日卡,就回一封感谢信;对于不理解的消息,就完全忽略。
可以把Erlang的actor模型想象成这样一个世界,其中每个人都独自坐在屋子里,可以执行一些不同的任务。人和人之间只能通过写信进行交流,就是这样。这样的生活虽然听起来很乏味(但却是邮政服务的新时代),但这意味着,你可以要求很多人为你分担不同的任务,他们做错了事或者犯了错误绝对不会对其他人的工作造成任何影响。除了你之外,他们甚至不知道还有其他人的存在(这真是太棒了)。
事实上,在Erlang中,只能创建出相互之间完全没有共享、只能通过消息通信的actor(进程)。每次消息交互都是显式的、可追踪的和安全的。
Erlang不仅仅是一门语言,同时也是一个完整的开发环境。代码被编译成字节码,字节码运行在虚拟机中。所以,Erlang很像Java,也像患有多动症的孩子,在任何地方都能运行。下面是Erlang标准发布中的一些组件:
开发工具(编译器,调试器,性能分析器以及测试框架和可选的类型分析器);
开放电信平台(OTP)框架;
Web服务器;
高级跟踪工具;
Mnesia数据库(一个键/值存储系统,能够在多台服务器上复制数据,支持嵌套事务,并且可以存储任何类型的Erlang数据)。
Erlang虚拟机和库还能让用户在不中断任何程序的情况下升级运行系统的代码,能轻易地将代码分布在多台计算机上,还能用一种简单但强大的方式去管理错误和故障。
谈到安全性,你应该知道Erlang中与之相关的一个总方针——任其崩溃(let it crash),这说的可不是一架崩溃后会导致大量乘客死亡的飞机,它指的更像是在下方铺有安全网络的钢丝上的行走者。尽管应该避免犯错,但是也不用时刻去检查每一种可能的错误情况。
Erlang提供了从错误中恢复的能力,用actor来组织代码的能力,以及用分布式和并发进行伸缩的能力,这些听起来都棒极了,那我们就赶快继续吧……
保持冷静
Erlang目前之所以大受欢迎都源自于一些狂热的论点,这会导致人们对它过度信任。如果你也是一名狂热的Erlang学习者,那么下面的一些提醒有助于你保持清醒。
第一个提醒是,人们把Erlang强大的伸缩能力归结于它轻量的进程。没错,Erlang的进程的确非常轻量,你可以同时拥有数十万个进程。但是,这并不等于说,因为能这样用Erlang,所以一定要这样用。例如,在一个射击游戏中,让每颗***成为一个actor,就很不明智。要是按照这种方式设计一个射击游戏,能射中的就只能是自己的脚丫了。在actor之间发送消息还是存在少量开销的,如果把任务划分得太细,效率会降低不少!
在我们学到后面,真正需要关心这个问题时,我会深入进行讲解。现在只需记住,随意地对问题进行并行化是不足以提升其效率的。(别灰心,有时候,使用上百个进程既是可行的,也是管用的!)
也有观点说,Erlang的伸缩能力和计算机的核数成正比,但这通常不是真的。在某些情况下是可能的,但在绝大多数情况中,遇到的都是些无法让所有东西都同时运行的问题。
还有一件事情需要牢记,尽管Erlang在某些方面做得确实不错,但是,从技术上来说,用其他语言也是可能取得同样效果的。反之亦然。你应该仔细评估需要解决的问题,为其选择最佳工具和解决方案。Erlang不是银弹,尤其不适合开发图像和信号处理、操作系统设备驱动之类的功能。Erlang的强项在于:服务器端的大型软件(如队列中间件、Web服务器、实时竞价系统和分布式数据库),协助其他语言完成一些困难的工作,高层协议实现等。至于中间地带的部分,你自行决定。
Erlang也不是一定只能用来进行服务器端软件的开发。已经有人将Erlang用在很多意想不到的地方。一个例子就是IANO,它是Unict团队(Catania大学的Eurobot团队)制造的一个机器人,其中的人工智能部分就是用Erlang开发的。在2009年度Eurobot大赛中,IANO获得了银奖。还有一个例子是Wings 3D,这是一个开源、跨平台的3D建模工具(不是3D渲染器),也是用Erlang实现的。
学习Erlang,只要一个文本编辑器和Erlang环境就足够了。可以从Erlang官网上获取源码和Windows平台的二进制可执行文件。
对于Windows操作系统来说,下载并运行二进制文件即可。别忘了把你的Erlang目录添加到PATH系统变量中去,这样就能从命令行直接访问它了。
对于基于Debian发布的Linux操作系统来说,要用下面的命令来安装Erlang包:
$ sudo apt-get install erlang
如果使用的是Fedora系统(假设已经安装了yum),可以输入下面的命令来安装Erlang:
# yum install erlang
不过,这些库中存放的通常都是些陈旧的Erlang安装包。使用旧的版本运行本书中的样例代码可能会得到和书中不一样的结果,对有些特定的应用,还可能会出现性能下降。因此,我建议从源代码中编译出安装包。参考包中的README文件,并且使用Google查找需要的所有安装细节。
在FreeBSD中,有很多可用的选项。如果用的是portmaster,可以用下面的命令:
$ portmaster lang/erlang
如果是标准的ports系统,可以输入下面的命令:
$ cd /usr/ports/lang/erlang; make install clean
最后,如果想使用这个包,输入以下命令:
$ run pkg_add -rv erlang
如果用的是Mac OS X系统,可以用Homebrew来安装Erlang:
$ brew install erlang
如果喜欢的话,也可以用MacPorts:
$ port install erlang
从哪里寻求帮助
如果用的是Linux,就可以从man中找到很好的技术文档。例如,Erlang中有个lists模块。要找到lists模块的文档,只需要输入以下命令:
$ erl -man lists
在Windows系统中,安装得到的文件中包括HTML文档。也可以随时从Erlang官网或其他的备选网站上下载这些文档。
如果希望把代码写得整洁些,可以从http://www.erlang.se/doc/programming_rules.shtml中学些到一些优秀的编码实践。
有时,我们会发现仅仅了解一些技术细节并不足以解决手边的问题。此时,我主要从两个地方寻求帮助:Erlang的官方邮件列表(跟着它,就能学到不少东西)和irc.freenode.net网站上的#erlang频道。
本文节选自《Erlang趣学指南》
内容简介
这是一本讲解Erlang编程语言的入门指南,内容通俗易懂,插图生动幽默,示例短小清晰,结构安排合理。书中从Erlang的基础知识讲起,融汇所有的基本概念和语法。内容涉及模块、函数、类型、递归、错误和异常、常用数据结构、并行编程、多处理、OTP、事件处理,以及所有Erlang的重要特性和强大功能。
本书适合对Erlang编程语言感兴趣的开发人员阅读。
本文转载自异步社区
原文链接:https://www.epubit.com/articleDetails?id=NC7E3EF9197600001971CD40012CE8170
软件开发 编程语言
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。