演员模型

title: 基本概念.
content: 演员模型推崇的哲学是“一切皆是演员”,这与面向对象编程的“一切皆是对象”类似。  演员是一个运算实体,响应接收到的消息,相互间是并发的:  以上动作不含有顺序执行的假设,因此可以并行进行。  发送者与已发送通信的解耦,是演员模型的根本优势,演员模型启用了并将控制结构当作消息传递的模式。  消息接收者是通过地址区分的,有时也被称作“邮件地址”。因此演员只能和它拥有地址的演员通信。它可以通过接收到的信息获取地址,或者获取它创建的演员的地址。  演员模型的特征是,演员内部或相互之间的计算本质上是并发性的,演员可以动态创建,演员地址包含在消息中,交互只有通过直接的异步消息传递通信,不限制消息到达的顺序。
title: 历史.
content: 演员模型受到了编程语言Lisp、Simula、早期版本的Smalltalk、和分组交换的影响。它的发展是“由几十、几百、甚至几千独立的微处理机构成的高度并行计算机器的前景所推动的,每个处理机都有自己局部内存和通信处理器,通过高性能网络进行通信。”从那时起,随着通过多核和计算机架构的大规模并发的到来,人们已经复兴了对演员模型的兴趣。  跟从Hewitt、Bishop和Steiger在1973年的出版物,Irene Greif为演员模型开发了一个操作语义作为他的博士论文研究的一部分。两年以后,Henry Baker和Hewitt出版了针对演员系统的一组公理法则。其他的主要里程碑包括William Clinger的1981年学位论文,介入了基于的指称语义,和Gul Agha的1985年学位论文,它进一步的发展了基于transition的语义模型,补充了Clinger的模型。这些工作导致了的全面发展。  主要的软件实现工作是麻省理工学院(MIT)消息传递语义小组的Russ Atkinson、Giuseppe Attardi、Henry Baker、Gerry Barber、Peter Bishop、Peter de Jong、Ken Kahn、Henry Lieberman、Carl Manning、Tom Reinhardt、Richard Steiger和Dan Theriault完成的。分别由加州理工学院(Caltech)的Chuck Seitz和MIT的Bill Dally领导的研究组,致力于构造进一步发展在这个模型中的消息传递的计算机架构。参见。  关于演员模型的研究已经在加州理工学院、京都大学、微电子及计算机技术公司(MCC), MIT人工智能实验室、SRI、斯坦福大学、伊利诺伊大学厄巴纳-香槟分校、 皮埃尔和玛丽·居里大学(巴黎第六大学)、比萨大学、东京大学研究室、荷兰数学和计算机科学研究学会(CWI)和其他一些地方开展了。
title: 影响.
content: 演员模型在理论发展和实践软件开发中都有影响。
title: 理论.
content: 演员模型影响了π-演算和后续的进程演算的发展。在Robin Milner的图灵奖获奖演讲中,他写到: 现在,纯粹的lambda-演算只使用两种东西来建造:项(term)和变量。我们在进程演算上能实现如此的经济节约吗?Carl Hewitt,与他的演员模型一起,很久以前就响应了这个挑战;他宣布值、在值上的算子(operator)和进程都应该是同一种东西:演员。 这个目标打动了我,因为它意味着表达式的同质性和完整性... 但是很久以前我就能领会到如何依据代数演算来达成这个目标... 所以,本着Hewitt的精神,我们的第一步是,要求由项指示的或由名字访问的所有东西,值、寄存器、算子、进程、对象,都是同一种东西;它们都应当是进程。
title: 实践.
content: 演员模型在商业实践中已经有了巨大的影响。例如,Twitter将演员用于可伸缩性应用。还有,Microsoft在开发的异步代理库中使用了演员模型。下面章节列出了很多其他的演员库。
title: 使用演员模型编程.
content: 一些编程语言使用了演员模型或变种。这些语言包括:
title: 演员模型库及框架.
content: 演员模型库及框架,允许用户在没有内置演员模型的语言中进行编程。这些框架包括:  注意这里没有列出全部框架和库。
title: 并发编程语言用例.
content: 尽管设计者并未如此表述,Erlang语言一般被引证为采用演员模型的典型代表之一。在Erlang中,进程间通信是通过消息传递系统运作的:所有进程都有一个自己的“邮箱”,它是从其他进程已经发送过来而仍未被消费的消息的队列。进程使用codice_1原语来检索匹配预期模式的消息。一个消息处理例程针对每个模式依次测试这些消息,直到其中有一个匹配。在消息被消费并从邮箱中移除之时进程恢复执行。消息可以包含任何Erlang结构,包括原始类型(整数,浮点数、字符、原子)、元组、列表和函数。  下面例子展示了Erlang对分布式进程的内建支持:
title: 原型的演员编程语言.
content: Hewitt在2006年发表了一个原型的演员编程语言,用意在于直接表达演员行为的重要方面。消息采用如下表示法:  编程语言的语义是通过将每个程序构造确定为有自己行为的演员来定义的。执行是通过在执行期间让Eval消息在程序构造之间传递来建模的。
title: 环境演员.
content: 每个Eval消息都有一个充当环境的演员的地址,它能够进行标识符与值的绑定(binding)。Environment演员是不可变的(immutable),也就是不变更的。当一个Environment演员收到Request[Bind[identifier value] customer]的时候,建立一个新的环境演员,使得这个新环境演员收到Request[Lookup[identifier’] customer’]的时候,如果identifier同于identifier’,则发送给customer’一个Returned[value],否则发送Environment Request[Lookup[identifier’] customer’]。上述环境演员建造在EmptyEnvironment演员之上,它在接收到Request[Lookup[identifier] customer]的时候,发送给customer一个Thrown[NotFound[identifier]]。当它收到Bind请求的时候,EmptyEnvironment表现的如同上述Environment。
title: 表达式.
content: 原型语言有如下种类的表达式:
title: 例子程序.
content: 下面是简单的存储单元格(cell)的例子脚本(script),它可以包含任何演员地址:  上述脚本将建立一个存储单元格,它采用的行为ReadWrite定义如下:  例如,下列表达式建立一个单元格x,具有初始内容5,并接着并发的向它写值7和9。  上述表达式的值是5、7或9。

Summary: 在电脑科学中,演员模型(英语:Actor model)是一种并行运算上的模型。「演员」是一种程序上的抽象概念,被视为并行运算的基本单元:当一个演员接收到一则讯息,它可以做出一些决策、建立更多的演员、传送更多的讯息、决定要如何回答接下来的讯息。演员可以修改它们自己的私有状态,但是只能通过消息间接的相互影响(避免了基于锁的同步)。

Actor model: The actor model in computer science is a mathematical model of concurrent computation that treats "actor" as the universal primitive of concurrent computation. In response to a message it receives, an actor can: make local decisions, create more actors, send more messages, and determine how to respond to the next message received. Actors may modify their own private state, but can only affect each other indirectly through messaging (removing the need for lock-based synchronization).