您当前的位置:首页 > 文章摘抄 > 正文

Erlang是什么(erlang适合做什么_olang与erlang的比较)

Erlang是什么(erlang适合做什么_olang与erlang的比较)

什么是二郎?Erlang编程语言最初是为大型电信交换设备的软件开发而设计的,是一种适用于大规模并行处理环境的高可靠性编程语言。随着多核处理器技术的普及和互联网、云计算等技术的发展,这种语言的应用范围逐渐扩大。

每种编程语言都有一个目标。目标大多是提高性能,提高开发者的表现力,提高开发者的生产力,比如Haskell,Python,Go等。

推出Erlang是为了构建一个具有高并发性和可伸缩性的实时系统。比如可以用在电信、银行、商业、即时通讯等场合。Erlang的运行时系统内置了并发、分布和容错处理。可见,与其他以速度、简洁、表现力著称的语言相比,Erlang无疑是一只不知名的丑小鸭。

Erlang的容错能力是其与生俱来的能力,因为这是电信领域的重要要求。但这并不意味着Erlang是复杂的,没有表情的。

语法

Erlang的语法非常简单,总共只有550行代码。所以erlang语法虽然不同于主流语言,但是很容易掌握。连贯性是它的亮点,请看下面的代码:

我们在erlang shell中执行它。

让我们来看看稍微复杂一点的代码:

在这个例子中,使用了模式匹配函数,这将在后面详细讨论。现在尝试调用fac函数:

最近怎么样?它的语法并不复杂,我觉得只有Lisps能比得上它的简单。

表示

说到Erlang表现力,首先想到的可能是消息传递、流程创建和管理。但是,这里强调的是模式匹配,尤其是在接收到消息之后,这可以使其处理非常简单。请将其与以下模式匹配示例进行比较:

首先,我们想访问Body和Headers变量。Shell明确表示变量是不受约束的。然后尝试做一些更有趣的事情。

复制了前面的代码后,我们接下来将使用http库:

然后执行shell

回到前面的代码中,

这里,send_req函数是从ibrowse调用的。第一个参数是URL。第二个字段编号是标题列表,这是我们想要发送的请求。我们没有在这里发送任何标题。最后,第三个参数是我们指定的请求动作。

让我们来看看它的实现结果:

它的输出是一个包含四个元素的数组,{$ TERM 1,…,TermN}。Erlang数组与Python数组非常相似。第一个元素是“ok”消息,表示程序正在正常执行。第二个元素是302,HTTP状态代码302表示用户已经被重定向。第三个元素是google返回的headers结果。

接下来,尝试保存结果:

它的工作原理是,我们向google发送一个请求,然后google响应它并返回结果。Ok是原子,302是字符串。它们都没有赋值,因为它们不是变量。但是这里为什么要用“=”呢?原因是Erlang中的“=”符号是一个函数,而不是一个赋值。由于Erlang支持模式匹配机制,这里将使用“=”作为匹配器。它会尝试找到“=”号左右部分的共同点,然后将值绑定到无约束变量,所以它最终会将值赋给正确的变量。

所以来自ibrowse的结果是:send_req,Erlang会认为我们有一个以元素ok和302开始的四元数组。然后,因为Headers和Body是不受约束的,所以Google返回的相应内容被赋值。

换句话说,模式匹配类似于其他语言中的switch或if/else/elif。

流程和消息

函数在函数式编程中起着重要的作用。它们可以赋给变量,作为参数传递给其他函数,或者作为其他函数的返回值返回。把函数想象成其他类型。

在Erlang中创建流程非常简单,内置的spawn函数用于创建流程。

Spawn用于创建一个新进程并返回PID进程ID。

如果您希望处理消息,而不仅仅是在shell中查看结果,您可以执行以下操作:

这里创建了一个Echofun函数来接收消息并显示它们。

二郎适合做什么?问题应该是二郎不适合做什么,而不是二郎能做什么。都是图灵完全语言。理论上你可以做任何事情,但是大多数人不会用Erlang去开发一个操作系统,因为它不适合这个。

那么,二郎不适合做什么呢?

第一,数值计算。

Erlang是解释性的。虽然现在的解释器可以编译代码,但是还是太慢了。有些用Fortran写的定量软件耗时很长,换成Erlang会让人想等。

再一个,业务逻辑非常复杂。

说实话,Erlang真的不适合这个。Erlang最大的优势在于并发性和并发系统的稳定性。这就是为什么Erlang被用在许多电信系统的后端。业务逻辑复杂后,在系统设计中很难分离并发模块,甚至有时候为了并发而并发,毫无意义。

Erlang特别适合io绑定的高并发服务器。Erlang最大的优势是它有一个轻量级线程和一个非常小的上下文切换开销。例如,下面的代码每秒打开100,000个线程。

[spawn(fun()-0 end)| | _-lists:seq(1,100000)].

鉴于这个特性,Erlang非常适合做服务器。有一些很好的框架,比如牛仔,性能非常好。

Eric Moritz-V2 web socket演示结果

现在越来越多的公司开始尝试使用Erlang,它还有其他优势。

很好的支持RPC,提供简单高效的OTP框架,帮助开发者快速实现功能。

不间断部署,运行时支持代码交换。在Shell中说出make: all ([load])来更新代码,而无需重新启动服务。

在EC2和其他集群中的简单部署

垃圾回收

很酷的语法——用一行愤怒解析tcp包

=X。

Erlang和其他语言一样,当然可以做任何事情。不过更适合做一个逻辑更简单的服务器。

对比Erlang和Golang,我们都知道Python、Ruby甚至Java都是在解决业务层面的问题,Java是面向应用的语言,主要是解决业务逻辑。但是还有一个领域,就是系统领域,部分网络层,底层运营。我一直在寻找这方面的优雅解决方案,C被我先淘汰了。C的开发效率太低,但Java更适合,就是太臃肿,缺乏系统编程的基因。

在网络层表现优异的Erlang具有良好的容错性和健壮性。它的虚拟机是唯一能和JVM抗衡的,OTP是超级重量级武器,几乎可以秒杀网络层应用。但根据我的总结,它有硬伤,也有软肋,后面会开发。可以说,Erlang是目前我所知道的最好的解决方案。

Golang其实挺早的。大约在2008年,我知道谷歌正在开发一种奇怪的语言。之后的几年,以老莫为代表的很多人都在窃窃私语Golang。其实我一直没怎么关注过。我从ROR学到的经验是,成熟度对业务非常重要。后来越来越多基于Golang开发的产品让我不得不去研究它。才知道这是我梦寐以求的Python,效率和性能都是最好的。

1、Erlang的弱点在于代码的可读性和表现力。我举个小例子。例如,如果你为你的系统软件构建一个RESTFUL接口,我们可以对代码风格有一个大致的了解。二郎:https://github.com/extend/cowboy/tree/master/examples用围棋:http://code.google.com/p/goweb/wiki/getstarted.不管二郎,不管你是来自c/c /python/ruby/java,你对围棋有没有一种久违的感觉?为什么说是重伤?因为对于一门语言来说,语法不太可能有大的变化,也不会有大的变化。不知道有没有人看过松本幸弘的《编程世界》,里面讲解的道理非常清楚。真正好的编程方法是人主宰计算机而不是计算机。感觉二郎在我的编程思维上有点占优势(我的视力本身就不好,还在杀眼睛!),编程首先是逻辑,其次是工程,最后是数学,这让我想起了上个世纪人工智能一直在绕路的吴军的《数学之美》,期待机器高度图灵,而忽略了人类现有的文明和统计归纳的应用。

2、二郎的软肋在于缺乏高质量的库。虽然有很多杀手级的应用,但是Go在这方面也是一个软肋。这对于一门不到五年的语言来说可以理解,但是对于一门二十多年的语言来说就有点说不过去了。比如用json解析库,很多人都是从mochiweb这个基本不更新的库里提取的。而且我觉得json之类的东西可以集成到语言标准库中,因为未来商业软件的api趋势越来越明显。说白了,一个倚老卖老,一个与时俱进。反正我一点都不担心Golang的图书馆。目前在易经方面成绩斐然,远胜Ruby/Python前五年。3、Erlang不合群,主要体现在和其他语言的交互上。当然还有深层次的原因。Erlang本身有自己的哲学,比如错误恢复机制。如果你用另一种语言整合一些东西,这个账就不好算了,就像你坚持让一个喝咖啡的人和一个吃大蒜的人坐在一起一样。简而言之,你写一个Erlang端口远比Go复杂。甚至比Python/Java还要复杂,导致Erlang的底层编程效果不太好,也无法利用linux的很多优秀成果。我一直认为Erlang不需要任何mysql/pg/oracle驱动。Erlang必须是一个自容器应用,只要用别的东西,按照木桶理论,就不能叫九个九。用系统的观点看问题。我觉得一个系统的健壮性不可能依赖于某个组件,这也是爱立信本身的Erlang应用没有被广泛使用的原因。

4、我们来谈谈数据类型。我听到不止一个人说Erlang处理字符串不好。它把字符串当成了列表,其实也是应该的。但是,还是那句话,违背了以人为本的理念,应该做一些DSL。比如在Golang中,=是糖衣,相当于var xx yyy=zzzz。程序员输入更少的字符非常方便。在Golang中,字符转换基本类似于python。切片贴图功能非常强大,支持lambda条件。虽然Erlang的基本类型很少,但是结构很多。所谓的结构相当于Golang中的复杂结构。这也很奇怪。就是觉得二郎结构伤眼睛好吗?可能是括号的比较吧,我觉得没必要。很明显,Erlang缺乏DSL的基因,这和Erlang诞生的时间有关。不夸张的说,自从用了二郎,我的视力下降了100度左右。我不喜欢lisp说符号也是一种语法。可能和函数式编程有关:形式演绎远大于逻辑演绎。

5、其实我不太注重性能,因为有了摩尔定律,一个单位计算单元的性价比会无限高。但既然Golang提出其性能接近C,我还是提一下吧。当然,Erlang也可以,虽然比Java慢,但和Python在一个水平上。

6、再来说说报错机制,因为Erlang的报错信息太混乱了。一开始以为不会看错误信息,后来用了Sasl,还是不够直观。有时候我甚至需要用工具分析崩溃文件来定位问题,这和Erlang的理念有关。在Erlang中一切都是并行的,所以它根本不在乎物理的哪一条线是错的。和演员绑定就行了,然后告诉你演员的ID和错误码。可以自己凭经验分析。这样做的好处是可以很容易定位并行发生的问题,但一切都是相对的,有点矫枉过正。根据我的经验,很多时候我只是想先指出哪一行对我来说是错的,好吗?甚至用完整的英语句子打印出顺序回溯,好吗?至于并行错误,在命令式多线程语言中并不常见。虽然也不是没有,但是遇到错误我还是会尽力调试。但并不是所有的逻辑都用并行思维来定位问题。我甚至认为,一个系统并不是完全平行或串联的,就像我们不能简单地用唯物主义或唯心主义来衡量世界一样。Golang做了很好的妥协。在不需要并行的时候,可以老老实实写串行代码。

7、再来说说招人的事。以前招了几个c出来的人,说实话水平很好,一周就能完成一个小组件。libevent对此非常熟悉。后来我逼着人家用Erlang,结果把人家赶走了。我还是很后悔。把我的一厢情愿强加给别人确实不合适,但是我招的是从二郎走出来的人。可以说比招objc人还难。没有人,空谈技术的优雅一开始是靠不住的。看邮件列表,Golang的活跃度明显比Erlang高很多,基本接近Ruby。更重要的是,我一点也不担心Golang的天赋,因为只要熟悉Python/C/Ruby/或者C,基本上半天就能上手,然后就可以一边工作一边搜索资料,虽然我有足够的深度。Erlang其实和第一点有关系。大部分人都是疑惑一周。每个人的抽象思维和世界观不都一样吗?所以,虽然函数式编程并不比命令式语言起步晚,但总是很少有人学。这是历史。对于大多数人来说,解决问题,创造价值,比用数学推导更令人向往。

8、最后,我建议如果你玩c/c,现在开始学习Golang是最好的时机,用一门靠谱的语言成长。这种感觉太棒了。你用Erlang折腾了一个应用,恐怕你用Go完成了10个开源项目。当然也要结合自己的口味。Golang是崇高的文本,Erlang是Emacs。相信自己的判断。

标签:Erlang语言Golang


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 路易二十二(路易二十)

下一篇: vivo x510t 怎么刷原生系统?vivo X510t怎么截图



推荐阅读