演員模型

在電腦科學中，演員模型（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.

**外部鏈接==