语法:
1.模式匹配:=表示一个模式匹配操作。Lhs=Rhs实际上是这样一个过程,对右端求值(Rhs),然后将结果与左端(Lhs)进行模式匹配。
2.分号:
逗号(,)用来分隔函数调用,数据构造器以及模式中的参数。
句号(.)(后跟一个空白符号)用来在shell中分隔完整的函数和表达式。
分号(;)用来分隔字句。如分段的函数定义,case语句,if语句,try...catch语句以及receive表达式。
原理:
1.Erlang采用消息模型,进程之间不共享任何数据,完全避免了引入锁的必要。对于多核而言,完全无锁。
2.COP(面向并发编程):进程+消息的模型来建模现实世界中多人协作的场景。一个进程表示一个人,人与人之间并不存在任何共享的内存,彼此之间的协作完全通过消息交互来完成。
3.Erlang工作机制:
- Erlang程序由成百上千个进程组成,这些进程可以相互发消息。
- 进程能否收到和理解这些消息是不确定的。如果你想知道一个消息是否被对方收到和理解,那么必须向这个进程发消息咨询并等待回应。
- 两个进程可以相互链接。如果其中一个进程消亡,那么另外一个进程就会收到一条消息,指明第一个进程消亡的原因。
特点:
Erlang中可以使用一种叫做二进制(
binary)数据的结构来存储大量的原始数据。相对于列表或元组,二进制类型更加节省内存,而且运行时系统也对此进行了优化,对二进制的输入输出更加高效。
Erlang里,
进程属于程序语言而非操作系统。
- 创建和销毁进程非常迅速。
- 在两个进程间收发消息非常迅捷。
- 进程在所有的操作系统上行为相同。
- 可以创建大量进程。
- 进程之间不共享任何数据,彼此完全独立。
- 进程间交互的唯一方法就是通过消息传递。
客户端/服务端:
send其实并非是把消息传递到一个进程去,而是把一个消息发送到这个进程的邮箱中去。同理receive则是在试图把一条消息从进程邮箱中删除。Erlang的每一个进程都有与之对应的邮箱。当向进程发消息时,消息就被送入邮箱之中。当系统对receive语句进行求值时,就是对进程邮箱进行检查的唯一机会。
尾递归:
例子:
loop() ->
receive
{From,{rectangle,Width,Ht}} ->
From ! {self(),Width * Ht},
loop();
{From,{circle,R}} ->
From ! {self(),3.14 * R * R},
loop();
{From,Other} ->
From ! {self(),{error, Other}},
loop()
end.
编译尾递归的函数可以使在一系列语句最后的一个函数调用,可以被替换为一个简单的跳转指令,指向被调用函数的开头。这就意味着一个尾递归的函数可以无限而不需要消耗栈空间。
参考资料:
《Erlang程序设计》。