我在线上看到很多关于Erlang如何在几乎所有可能的类别中踢出node.js屁股的废话。所以我想学习Erlang并试一试,但这就是问题所在。我发现拿起Erlang比拿起node.js困难得多。使用node.js,我可以选择一个相对复杂的项目,并且一天之内就能完成工作。使用Erlang,我遇到了障碍,并且发展得不那么快。
因此,对于那些有更多经验的人来说,Erlang学习起来是否很复杂,或者我只是想念一些东西?Node.js可能不是完美的,但是我似乎能够用它完成工作。
我在线上看到很多关于Erlang如何在几乎所有可能的类别中踢出node.js屁股的废话。所以我想学习Erlang并试一试,但这就是问题所在。我发现拿起Erlang比拿起node.js困难得多。使用node.js,我可以选择一个相对复杂的项目,并且一天之内就能完成工作。使用Erlang,我遇到了障碍,并且发展得不那么快。
因此,对于那些有更多经验的人来说,Erlang学习起来是否很复杂,或者我只是想念一些东西?Node.js可能不是完美的,但是我似乎能够用它完成工作。
Answers:
首先,我同意我对学习Erlang的正确回答。它是一种主要是功能性的语言(尽管并发起着很大的作用),并且添加了它的所有功能以实现容错和鲁棒性,这与Javascript最初的设计目标并不完全相同。
其次,让Node.js进入Erlang有点错了。Node.js是单个服务器/框架,它借助回调以事件驱动的方式完成所有工作。Erlang有自己的框架(OTP),但根本不在同一个级别上。
如果您打算学习Erlang,建议您先阅读我的博客文章《致Erlang初学者的公开信》(或Onlooker)作为入门阅读,然后再学习教程。
就模式和用法而言,您唯一可以比较Erlang和Node.js的地方就是它们是事件驱动的。但是,这里有两个主要区别。Node.js的模型基于绑定到事件的回调。Erlang基于消息队列和选择性接收。里面有什么含义?
首先,如果您以基于回调的方式进行操作,则携带状态的唯一方法是使状态全局化或进入连续传递样式编程。其次,您必须自己照顾完整的事件矩阵。这样的一个例子是,如果我们想象一个非常简单的有限状态机:一个互斥信号量,是事件驱动的。
互斥量信号量具有两种状态:锁定和空闲。每当给定的计算单位(工作人员,流程,函数或线程)想要访问互斥锁时,它就必须触发一个事件,告诉它“我很感兴趣”。现在,您必须注意以下类型的事件:
然后,您需要考虑其他事件,例如超时以避免死锁:
然后,您还有超出范围的事件:
事件矩阵变得非常复杂。我们的FSM在这里只有2个状态。对于Erlang(或任何具有选择性接收和异步与潜在同步事件的语言),您必须考虑以下几种情况:
就是这样。计时器的处理与接收完成的情况相同,对于与“等待直到空闲”有关的任何事情,消息将自动排队:工作人员仅需等待回复。在这些情况下,模型要简单得多。
这意味着在通常情况下,CPS和基于回调的模型(例如,node.js中的模型)要么要求您非常聪明地处理事件,要么请您完全处理整个复杂的事件矩阵,因为对于因奇怪的时序问题和状态更改而导致的每一个无关紧要的情况,您都必须回电。
选择性接收通常使您仅关注所有潜在事件的子组,并在这种情况下让您更轻松地进行事件推理。请注意,Erlang的行为(设计模式/框架实现)称为gen_event
。gen_event实现使您可以拥有一种与node.js中使用的机制非常相似的机制(如果需要的话)。
还有其他几点可以区分它们。Erlang具有抢先式调度功能,而node.js使其具有协作性,Erlang更适合某些大型应用程序(分布式和所有),但是Node.js及其社区通常更适合Web且对最新Web趋势了解。选择最佳工具是一个问题,这取决于您的背景,问题类型和偏好。就我而言,Erlang的模型非常适合我的思维方式。不一定每个人都是这样。
希望这可以帮助。
Erlang的学习并不复杂,这与钱伯斯·康斯坦斯(99.44%)的编码人员在编程工作中所学的思维方式无关。您面临的问题可能只是概念上的迷失方向,而不是实际的复杂性。
以下是Erlang的一些外来功能,它们会咬住一个典型的程序员:
因此,与学习Node.js相比,学习Erlang对大多数程序员而言将是更大的挑战-特别是如果程序员已经熟悉JavaScript。最后,然而,一旦你过去的概念障碍,我认为Erlang的编码将是较少比相同的Node.js编码复杂。这有几个原因:
如果可以的话,请继续在Erlang上告白,如果尚未这样做,请访问“ 学习一些Erlang的好处”,以获取有关Erlang概念的温和且(非常)有趣的介绍。
Erlang和Node之间有一些重大区别
首先是该节点是Javascript,这意味着它是一种非常通用的语言,与越来越多的人所熟悉的语言具有很多共同点,因此通常更容易启动和运行。对于大多数人来说,Erlang的语法常常很陌生和陌生,尽管语言远比javascript简单得多,但由于其独特性,它需要更多的时间来习惯
其次,Erlang有一个非常特殊的无共享并发模型,它要求您以不同的方式解决问题,这是一件好事(TM)
最后一个重要的问题是,Erlang是由一家商业公司开发的,并且是在两年后才开源的,因此人们实际上可以在源代码管理中看到单个提交,即使现在我也不认为所有的erlang开发人员都已经搬走了向公众github仓库进行开发。node.js从一开始就在社区内部构建,这意味着它对社区的支持要好得多,已经有更多的节点库,更多的社区文档,更多的实时示例,无处不在的软件包管理器等。Erlang正在追赶在这方面,它的起步幅度仍然更大。
Node将使您能够快速且相对轻松地编写有趣的事情,对于erlang已经解决了很长时间的大型应用程序,Node仍存在越来越大的麻烦。Erlang将改变您的编程方式,并且(imo)使您成为更好的程序员,但是一开始它不会使您的生活变得轻松。两者都以不同的方式很有趣。