本文主要描述一些Erlang语言特点
The characteristics of Erlang
语法与语义
- 模式匹配使得代码/数据易于理解、简洁和可维护。
- 函数头的模式匹配使得条件计算简单明了;如果它可以用一种有序的方式来描述(在一定规律下,比如说需要循环的情况下),你就可以构建函数来把它分开。
- 缺乏传统的共享内存意味着永远不必考虑访问模式或锁定。一个通过在进程之间传递消息来“共享”。
- 与上述因素相结合,缺乏进程内并发性意味着不必编写进程来担心被中断或干扰自身。
- 缺少可变数据就无法欺骗和传递可变引用。此外,所有数据都保持不变,从而简化了对程序的推理(当然,如果您发现函数式的推理很简单)。
- 如果进程A向进程B发送一条消息,且B是活动的,则保证消息到达。
- 每个进程收件箱的消息池子,按接受它们的顺序排列。可以通过模式匹配有选择地从接收箱中删除消息。
- 消息传递无视本地/远程进程的区别。也就是说,从程序员的角度来看,vm内消息传递与vm间消息传递以相同的方式完成。
- 进程可以“链接”,在对崩溃时接收特殊消息。
- 进程有一个唯一的Id称为PID-但是可以为每个集群指定一个唯一的名称。
Erlang vm的实现的含义是微妙的,但它们允许:
- 软实时、低延迟性能特征:例如,共享状态意味着垃圾收集是每个进程的工作,消除了在其他GC语言中看到的整个应用程序暂停的类型。
- 高并发性:由于所有进程都是单线程的,Erlang可以根据需要对它们进程调度。
- 高并行性:如果将一些OS进程交给Erlang调度程序,它可以跨这些线程调度进程。进程之间缺乏共享内存意味着调度器不必关心如何解决进程之前的锁冲突。
- 分布式:通过VM透明地发送远程消息,Erlang程序员可以在网络上来回压缩消息,而不会产生认知开销。
- 容错:有了进程链接,就可以处理崩溃消息并重新生成新死的伙伴进程。
- 零停机部署:通过交换指定名称的流程,您可以更改将在不中断服务的情况下接收消息的流程(请注意,发送到旧流程的消息一定会到达)。
Erlang的优点
- 对延迟敏感的工作:如果您需要对响应时间比较有很强的限制,Erlang可以解决。
- 吞吐量敏感的工作:Erlang在处理单个工作单元时不一定能及时击败其他语言,但是当您需要同时或多或少地处理数千个工作单元时,它的性能会更好。(并发/并行聚合进程性能一直是优化目标,但不是每个进程的性能。)
- 网络服务:Erlang的bit语法使得处理二进制和文本协议变得同样自然,而且您可以确保在您的服务在遇到故障时仍能在线并做出响应。
- 任务关键型中间件:Erlang的零停机部署、容错和优化重点使得服务变得非常可靠(请考虑消息传递、队列、分布式锁定、作业批处理等)。
- 纯粹的函数式算法工作:Erlang在这里没有Haskell或Lisp那么受关注,但是模式匹配加上高阶函数非常棒。
- 无共享的并行计算:消息传递与进程的并行执行相结合,使得这一点非常简单。
- 大型嵌入式环境:虽然Erlang适合部署在大型、健壮的机器上,但它最初是在小型电话交换机中开发的,并保留了低内存使用特征。
Erlang的缺点
- 短期计算:Erlang VM启动起来非常快,但没有那么快。如果您开始使用Erlang编写脚本,您会注意到这种延迟。
- CPU密集型工作:Erlang VM没有针对这项工作进行优化,挂钟性能可能会下降。
- 共享内存并行计算:没有可用的共享内存。
- 元编程:Erlang有宏,但是它们很简单文本替换宏。如果您的技巧严重依赖于编写代码来编写代码,那么Erlang将非常困难。
- 粘合风格的web应用程序:虽然在Erlang中生成REST API非常简单,但是没有与Rails等价的东西。有一个类似于rails的,但是它们没有相同深度的库支持。