演员模型

在电脑科学中，演员模型（Actor model）是一种并行运算上的模型。「演员」是一种程式上的抽象概念，被视为并行运算的基本单元：当一个演员接收到一则讯息，它可以做出一些决策、建立更多的演员、传送更多的讯息、决定要如何回答接下来的讯息。演员可以修改它们自己的私有状态，但是只能通过消息间接的相互影响（避免了基于锁的同步）。
演员模型在1973年于Carl Hewitt、Peter Bishop及Richard Steiger的论文中提出。它已经被用作并发计算的理论理解框架和并发系统的实际实现基础。演员模型和其他类似工作的关系讨论可见于actor model and process calculi。

**基本概念**
演员模型推崇的哲学是“一切皆是演员”，这与面向对象编程的“一切皆是对象”类似。
演员是一个运算实体，响应接收到的消息，相互间是并发的：- 发送有限数量的消息给其他演员；- 创建有限数量的新演员；- 指定接收到下一个消息时要用到的行为。
以上动作不含有顺序执行的假设，因此可以并行进行。
发送者与已发送通信的解耦，是演员模型的根本优势，演员模型启用了异步通信并将控制结构当作消息传递的模式。
消息接收者是通过地址区分的，有时也被称作“邮件地址”。因此演员只能和它拥有地址的演员通信。它可以通过接收到的信息获取地址，或者获取它创建的演员的地址。
演员模型的特征是，演员内部或相互之间的计算本质上是并发性的，演员可以动态创建，演员地址包含在消息中，交互只有通过直接的异步消息传递通信，不限制消息到达的顺序。

**历史**
演员模型受到了Lisp、Simula、Smalltalk-72、基于权限的系统和分组交换的影响。其发展“受到由几十、几百、甚至几千个独立微处理机构成的高度并行计算机器的前景所推动，其中的每个处理机都有自己局部内存和通信处理器，它们通过高性能网络进行通信。”此后随着采用多核和众核计算机架构的大规模并发计算的出现，人们已经重新燃起了对演员模型的兴趣。
在Hewitt、Bishop和Steiger的1973年刊物之后，Irene Greif在1975年博士论文中，为演员模型开发出了一种操作语义。Henry Baker和Hewitt在1977年发表了演员系统的公理法则。其他主要的里程碑包括：William Clinger的1981年学位论文，它介入了基于Power domains的指称语义；还有Gul Agha的1985年学位论文，它进一步发展出基于transition的语义模型，从而补充了Clinger的模型。这些工作促成了actor model theory的全面发展。
主要的软件实现工作，由麻省理工学院的消息传递语义小组完成，其成员包括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。分别由加州理工学院的Chuck Seitz和麻省理工学院的Bill Dally领导的研究小组，致力于构造新的计算机架构，用以进一步发展演员模型中的消息传递。有关工作详见Actor model implementation。
演员模型的研究，已经开展于加州理工学院、京都大学、Microelectronics and Computer Technology Corporation、MIT人工智能实验室、斯坦福国际研究所、斯坦福大学、伊利诺伊大学厄巴纳-香槟分校、巴黎第六大学、比萨大学、东京大学米泽研究室、荷兰数学和计算机科学研究学会和其他一些地方。

**使用演员模型编程**
一些编程语言使用了演员模型或变种。这些语言包括：

**早期的演员模型编程语言**
- Act 1，2，3
*Acttalk
*Ani
*Cantor
*Rosette

**后期的演员模型编程语言**
- ABCL- AmbientTalk- Axum- CAL Actor Language- D- E- Elixir- Encore- Erlang- Fantom- Humus- Io- Pony- Ptolemy Project- P- P#- Rebeca- Reia- Rust- SALSA- Scala- Scratch- TNSDL

**演员模型库及框架**
演员模型库及框架，允许用户在没有内置演员模型的语言中进行编程。这些框架包括：
注意这里没有列出全部框架和库。

**并发编程语言用例**
尽管Erlang语言设计者并未如此表述，因其进程间通信是通过无共享消息传递系统运作，它一般被引证为采用演员模型的典型代表之一。在Erlang中，所有进程都有一个自己的“邮箱”，它是从其他进程已经发送过来而仍未被消费的消息的队列。进程使用receive原语来检索匹配预期模式的消息。一个消息处理例程针对每个模式依次测试这些消息，直到其中有一个匹配。在消息被消费并从邮箱中移除之时进程恢复执行。消息可以包含任何Erlang结构，包括原始类型（整数，浮点数、字符、原子）、元组、列表和函数。
下面例子展示了Erlang对分布式进程的内建支持：
% 建立一个进程并启用函数web:start_server(Port, MaxConnections)
ServerProcess = spawn(web, start_server, Port, MaxConnections),
% 在机器RemoteNode上建立一个远程进程并启用函数web:start_server(Port, MaxConnections)
RemoteProcess = spawn(RemoteNode, web, start_server, Port, MaxConnections),
% (异步的)发送消息到ServerProcess。消息包含一个元组，它具有原子"pause"和数"10"。
ServerProcess ! {pause, 10},
% 接收发给这个进程的消息
receive
a_message -> do_something;
{data, DataContent} -> handle(DataContent);
{hello, Text} -> io:format("Got hello message: ~s", Text);
{goodbye, Text} -> io:format("Got goodbye message: ~s", Text)
end.

**原型的演员编程语言**
Hewitt在2006年发表了一个原型的演员编程语言，用意在于直接表达演员行为的重要方面。消息采用如下表示法：
1 ... n
编程语言的语义是通过将每个程序构造确定为有自己行为的演员来定义的。执行是通过在执行期间让Eval消息在程序构造之间传递来建模的。

**环境演员**
每个Eval消息都有一个充当环境的演员的地址，它能够进行标识符与值的绑定（binding）。environment演员是不可变的（immutable），也就是不变更的。
*当一个environment演员收到RequestBindidentifier value customer的时候，建立一个新的环境演员environment’发送给customer，使得这个新环境演员收到RequestLookupidentifier’ customer’的时候，如果identifier同于identifier’，则发送给customer’一个Returnedvalue，否则发送给environment一个RequestLookupidentifier’ customer’。
*当一个environment演员收到RequestBind String customer的时候，如果此形如Requestmsgparamerer customer，匹配于String形如Requestmsgargument customer，则建立一个新的环境演员environment’发送给customer，使得这个新环境演员收到RequestLookupparameter’ customer’的时候，如果parameter’同于parameter，则发送给customer’一个Returnedargument，否则发送给customer一个ThrownNotFound。
*当一个environment演员收到RequestBindidentifier(parameter) value customer的时候，建立一个新的环境演员environment’发送给customer，使得这个新环境演员收到RequestLookupidentifier’(argument) customer’的时候，如果identifier同于identifier’，则建立一个新的环境演员environment’’，发送给customer’一个Returnedvalue和一个Returnedenvironment’’，否则发送给environment一个RequestLookupidentifier’(argument) customer’。这个新环境演员environment’’在收到RequestLookupparameter’ customer’的时候，如果parameter’同于parameter，则发送给customer’一个Returnedargument，否则发送给environment’一个RequestLookupparameter’ customer’。
上述环境演员建造在EmptyEnvironment演员之上，它在接收到RequestLookupidentifier customer的时候，发送给customer一个ThrownNotFoundidentifier。当它收到Bind请求的时候，EmptyEnvironment表现的如同上述环境演员。

**表达式**
原型语言有如下种类的表达式，这里的通信包括Request...、Returned...和Thrown...，这里的消息包括Eval...、Bind...和Lookup...：
 
在收到RequestEvalenvironment customer的时候，发送给environment一个RequestLookup customer。
 send  
在收到RequestEvalenvironment customer的时候，建立一个新演员evalCustomer1，发送给一个RequestEvalenvironment evalCustomer1，使得
在evalCustomer1收到通信ReturnedtheRecipient的时候，建立一个新演员evalCustomer2，发送给一个RequestEvalenvironment evalCustomer2，使得
在evalCustomer2收到通信ReturnedtheCommunication的时候，发送给theRecipient一个theCommunication。
.
在收到RequestEvalenvironment customer的时候，建立一个新演员evalCustomer1，发送一个RequestEvalenvironment evalCustomer1，使得
在evalCustomer1收到通信ReturnedtheRecipient的时候，建立一个新演员evalCustomer2，发送给一个RequestEvalenvironment evalCustomer2，使得
在 evalCustomer2收到通信ReturnedtheMessage的时候，发送给theRecipient一个RequesttheMessage customer。
receiver ... i i ...
在收到RequestEvalenvironment customer的时候，发送给customer一个新演员theReceiver，使得 
在theReceiver收到通信内容com的时候，建立一个新演员bindingCustomer，并发送给environment一个RequestBindi com bindingCustomer，而且
#如果bindingCustomer收到Returnedenvironment’，发送给i一个RequestEvalenvironment’
#不然如果bindingCustomer收到Thrown...，尝试i+1。
 behavior ... i i ...
在收到RequestEvalenvironment customer的时候，发送给customer一个新演员theReceiver，使得 
在theReceiver收到Requestmessage customer’的时候，建立一个新演员bindingCustomer，并发送给environment一个Requestbindi message customer’，而且
# 如果bindingCustomer收到Returnedenvironment’，发送给i一个RequestEvalenvironment’ customer’
# 不然如果bindingCustomer收到Thrown...，尝试i+1。
{1, 2}
在收到RequestEvalenvironment customer的时候，发送给1一个RequestEvalenvironment，而且并发的发送给2一个RequestEvalenvironment customer。
 let  = 值 in 体
在收到messageEvalenvironment customer的时候，建立一个新演员evalCustomer，并发送给值一个RequestEvalenvironment evalCustomer。
在evalCustomer收到ReturnedtheValue的时候，建立一个新演员bindingCustomer，并发送给environment一个Requestbind theValue bindingCustomer。
在bindingCustomer收到Returnedenvironment’的时候，发送给体一个RequestEvalenvironment’ customer。
 serializer 
在收到RequestEvalenvironment customer的时候，发送给customer一个ReturnedtheSerializer，这里的theSerializer是新演员，使得发送到theSerializer的通信按FIFO次序由行为演员处理，行为演员初始是.Evalenvironment，而且
在theSerializer收到通信内容com的时候，建立一个新演员customer’，发送给行为演员一个Requestcom customer’，使得
在customer’收到Returnedvalue和ReturnedtheNextBehavior的时候，Returnedvalue被发送给customer，而theNextBehavior被theSerializer用作下次通信的行为演员。

**例子程序**
下面是简单的存储单元格（cell）的例子脚本（script），它可以包含任何演员地址：
 Cell ≡
: receiver
:: RequestCreateinitial customer
::: send customer Returnedserializer ReadWrite(initial)
上述脚本将建立一个存储单元格，它采用的行为ReadWrite定义如下：
 ReadWrite(contents) ≡
: behavior
:: Requestread customer
::: {send customer Returnedcontents, ReturnedReadWrite(contents)}
:: Requestwritex customer
::: {send customer Returned, ReturnedReadWrite(x)}
例如，下列表达式建立一个单元格x，具有初始内容5，并接着并发的向它写值7和9。
let x = Cell.Create5 in {x.write7, x.write9, x.read}
上述表达式的值是5、7或9。

**影响**
演员模型在并发计算的理论发展和实践软件开发中都有影响。

**理论**
演员模型影响了π-演算和随后的进程演算的发展。在Robin Milner的图灵奖获奖演说中，他写到：
纯lambda演算现在只使用两种东西来建造：项和变量。我们在进程演算上也能实现同样的经济性吗？Carl Hewitt凭借其演员模型，很久以前就应对了这个挑战；他宣告了值、在值上的算子和进程，都应该是同一种东西：即演员。
这个目标打动了我，因为它蕴涵了表达式有着同质性和完整性 ... 但是很久以后我才明白了如何依据代数演算来达成这个目标 ...
因此本着Hewitt的精神，我们的第一步，就是要求由项指示或由名字访问的所有东西，包括值、寄存器、算子、进程、对象，都是同一种东西；它们都应当是进程。

**实践**
演员模型在商业实践中已经有了巨大的影响。例如，Twitter将演员用于可伸缩性应用。还有，Microsoft在其开发的异步代理库中使用了演员模型。

**参见**
 数据流程编程- 并行编程模型- Input/output automaton- Scientific community metaphor

**引用**

**延伸阅读**
Gul Agha.  Actors: A Model of Concurrent Computation in Distributed Systems date=20201112004342 . MIT Press 1985.
*Paul Baran. On Distributed Communications Networks IEEE Transactions on Communications Systems. March 1964.
*William A. Woods.  Transition network grammars for natural language analysis date=20170203134542  CACM. 1970.
*Carl Hewitt.  Procedural Embedding of Knowledge In Planner date=20210205001847  IJCAI 1971.
*G.M. Birtwistle, Ole-Johan Dahl, B. Myhrhaug and Kristen Nygaard. SIMULA Begin Auerbach Publishers Inc, 1973.
*Carl Hewitt, et al. Actor Induction and Meta-evaluation Conference Record of ACM Symposium on Principles of Programming Languages, January 1974.
*Carl Hewitt,  Behavioral Semantics of Nonrecursive Control Structure date=20180610081217  Proceedings of Colloque sur la Programmation, April 1974.
*Irene Greif and Carl Hewitt.   Actor Semantics of PLANNER-73 date=20210205120636  Conference Record of ACM Symposium on Principles of Programming Languages. January 1975.
*Carl Hewitt.  How to Use What You Know date=20190307161903  IJCAI. September, 1975.
*Alan Kay and Adele Goldberg.  Smalltalk-72 Instruction Manual. Xerox PARC Memo SSL-76-6.  May 1976.
*Edsger Dijkstra. A discipline of programming Prentice Hall. 1976.
*Carl Hewitt and Henry Baker  Actors and Continuous Functionals Proceeding of IFIP Working Conference on Formal Description of Programming Concepts. August 1–5, 1977.
*Carl Hewitt and Russ Atkinson.   Synchronization in Actor Systems Proceedings of the 4th ACM SIGACT-SIGPLAN symposium on Principles of programming languages. 1977
*Carl Hewitt and Russ Atkinson.   Specification and Proof Techniques for Serializers date=20170831085117  IEEE Journal on Software Engineering. January 1979.
*Ken Kahn.  A Computational Theory of Animation date=20170818200257  MIT EECS Doctoral Dissertation. August 1979.
*Carl Hewitt, Beppe Attardi, and Henry Lieberman.  Delegation in Message Passing Proceedings of First International Conference on Distributed Systems Huntsville, AL. October 1979.
*Nissim Francez, C.A.R. Hoare, Daniel Lehmann, and Willem-Paul de Roever. Semantics of nondetermiism, concurrency, and communication Journal of Computer and System Sciences.  December 1979.
*George Milne and Robin Milner. Concurrent processes and their syntax JACM. April 1979.
*Daniel Theriault. A Primer for the Act-1 Language MIT AI memo 672. April 1982.
*Daniel Theriault.   Issues in the Design and Implementation of Act 2 date=20190408011038  MIT AI technical report 728. June 1983.
*Henry Lieberman. An Object-Oriented Simulator for the Apiary Conference of the American Association for Artificial Intelligence, Washington, D. C., August 1983
*Carl Hewitt and Peter de Jong.  Analyzing the Roles of Descriptions and Actions in Open Systems date=20170714021055  Proceedings of the National Conference on Artificial Intelligence. August 1983.
*Carl Hewitt and Henry Lieberman. Design Issues in Parallel Architecture for Artificial Intelligence MIT AI memo 750.  Nov. 1983.
*C.A.R. Hoare.  Communicating Sequential Processes date=20210201151713  Prentice Hall. 1985.
*Carl Hewitt. The Challenge of Open Systems Byte. April 1985.  Reprinted in The foundation of artificial intelligence: a sourcebook Cambridge University Press. 1990.
*Carl Manning. Traveler: the actor observatory ECOOP 1987. Also appears in Lecture Notes in Computer Science, vol. 276.
*William Athas and Charles Seitz  Multicomputers: message-passing concurrent computers date=20210205000300  IEEE Computer August 1988.
*William Athas and Nanette Boden Cantor: An Actor Programming System for Scientific Computing in Proceedings of the NSF Workshop on Object-Based Concurrent Programming.  1988.  Special Issue of SIGPLAN Notices.
*Jean-Pierre Briot.   From objects to actors: Study of a limited symbiosis in Smalltalk-80 date=20201125071501  Rapport de Recherche 88-58, RXF-LITP, Paris, France, September 1988
*William Dally and Wills, D.  Universal mechanisms for concurrency date=20180618003814  PARLE 1989.
*W. Horwat, A. Chien, and W. Dally.  Experience with CST: Programming and Implementation PLDI. 1989.
*Carl Hewitt. Towards Open Information Systems Semantics Proceedings of 10th International Workshop on Distributed Artificial Intelligence. October 23–27, 1990. Bandera, Texas.
*Akinori Yonezawa, Ed. ABCL: An Object-Oriented Concurrent System MIT Press. 1990.- K. Kahn and Vijay A. Saraswat, " Actors as a special case of concurrent constraint (logic) programming", in SIGPLAN Notices, October 1990. Describes Janus.
*Carl Hewitt. Open Information Systems Semantics Journal of Artificial Intelligence. January 1991.
*Carl Hewitt and Jeff Inman.   DAI Betwixt and Between: From "Intelligent Agents" to Open Systems Science date=20170831090048  IEEE Transactions on Systems, Man, and Cybernetics. Nov./Dec. 1991.
*Carl Hewitt and Gul Agha. Guarded Horn clause languages: are they deductive and Logical? International Conference on Fifth Generation Computer Systems, Ohmsha 1988. Tokyo.  Also in Artificial Intelligence at MIT, Vol. 2. MIT Press 1991.
*William Dally, et al.  The Message-Driven Processor: A Multicomputer Processing Node with Efficient Mechanisms date=20210205001037  IEEE Micro. April 1992.
*S. Miriyala, G. Agha, and Y.Sami.  Visualizing actor programs using predicate transition nets date=20201110134840  Journal of Visual Programming. 1992.
*Carl Hewitt and Carl Manning.   Negotiation Architecture for Large-Scale Crisis Management AAAI-94 Workshop on Models of Conflict Management in Cooperative Problem Solving. Seattle, WA. Aug. 4, 1994.
*Carl Hewitt and Carl Manning.  Synthetic Infrastructures for Multi-Agency Systems Proceedings of ICMAS '96. Kyoto, Japan. December 8–13, 1996.
*S. Frolund. Coordinating Distributed Objects: An Actor-Based Approach for Synchronization MIT Press. November 1996.
*W. Kim.  ThAL: An Actor System for Efficient and Scalable Concurrent Computing date=20170831085055  PhD thesis. University of Illinois at Urbana Champaign. 1997.
*Jean-Pierre Briot.  Acttalk: A framework for object-oriented concurrent programming-design and experience 2nd France-Japan workshop. 1999.
*N. Jamali, P. Thati, and G. Agha.  An actor based architecture for customizing and controlling agent ensembles date=20201125071501  IEEE Intelligent Systems. 14(2). 1999.
*Don Box, David Ehnebuske, Gopal Kakivaya, Andrew Layman, Noah Mendelsohn, Henrik Nielsen, Satish Thatte, Dave Winer. Simple Object Access Protocol (SOAP) 1.1 W3C Note. May 2000.
*M. Astley, D. Sturman, and G. Agha.  Customizable middleware for modular distributed software date=20170831083740  CACM. 44(5) 2001.
*Edward Lee, S. Neuendorffer, and M. Wirthlin.  Actor-oriented design of embedded hardware and software systems date=20161020063715  Journal of Circuits, Systems, and Computers. 2002.
*P. Thati, R. Ziaei, and G. Agha. A Theory of May Testing for Actors Formal Methods for Open Object-based Distributed Systems. March 2002.
*P. Thati, R. Ziaei, and G. Agha. A theory of may testing for asynchronous calculi with locality and no name matching Algebraic Methodology and Software Technology. Springer Verlag. September 2002. LNCS 2422.
*Stephen Neuendorffer.   Actor-Oriented Metaprogramming date=20200925073835  PhD Thesis. University of California, Berkeley. December, 2004
*Carl Hewitt (2006a)   The repeated demise of logic programming and why it will be reincarnated   What Went Wrong and Why: Lessons from AI Research and Applications.  Technical Report SS-06-08. AAAI Press.  March 2006.
*Carl Hewitt (2006b)  What is Commitment? Physical, Organizational, and Social date=20210211011938   COIN@AAMAS.  April 27, 2006b.
*Carl Hewitt (2007a) What is Commitment? Physical, Organizational, and Social (Revised) Pablo Noriega .et al. editors. LNAI 4386. Springer-Verlag. 2007.
*Carl Hewitt (2007b)  Large-scale Organizational Computing requires Unstratified Paraconsistency and Reflection date=20201125071524  COIN@AAMAS'07.
*D. Charousset, T. C. Schmidt, R. Hiesgen and M. Wählisch.  Native actors: a scalable software platform for distributed, heterogeneous environments in AGERE! '13 Proceedings of the 2013 workshop on Programming based on actors, agents, and decentralized control.