《Erlang程序设计》——笔记

语法:

    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程序设计》。

你可能感兴趣的:(《Erlang程序设计》——笔记)