Cosmic Cube
TheJ–Machine
The J–Machine was developed by Bill Dally ''et al.'' at MIT providing architectural support suitable for Actors. This included the following: *Asynchronous messaging *A uniform space of Actor addresses to which messages could be sent concurrently regardless of whether the recipient Actor was local or nonlocal *A form of Actor pipelining (see Actor model) Concurrent Smalltalk (which can be modeled usingPrototype Actor Programming Language
HewittEnvironment Actors
Each Eval message has the address of an Actor that acts as an environment with the bindings of program identifiers. Environment Actors are immutable, i.e., they do not change. When Request ind[identifier_valuecustomer.html" ;"title="dentifier_value.html" ;"title="ind[identifier value">ind[identifier valuecustomer">dentifier_value.html" ;"title="ind[identifier value">ind[identifier valuecustomer/kbd> is received by an Actor Environment, a new environment Actor is created such that when the new environment Actor receives Request[Lookup[identifier’] customer’] then if identifier is the same as identifier’ send customer’ Returned[value], else send Environment Request[Lookup[identifier’] customer’]. The above builds on an Actor EmptyEnvironment which when it receives Request ookup[identifiercustomer.html" ;"title="dentifier.html" ;"title="ookup[identifier">ookup[identifiercustomer">dentifier.html" ;"title="ookup[identifier">ookup[identifiercustomer/kbd>, sends customer Thrown[NotFound[identifier. When it receives a Bind request EmptyEnvironment acts like Environment above.Expressions
The prototype programming language has expressions of the following kinds: ; <identifier> :When Request val[environmentcustomer.html" ;"title="nvironment.html" ;"title="val[environment">val[environmentcustomer">nvironment.html" ;"title="val[environment">val[environmentcustomer/kbd> is received, send environment Request[Lookup[<identifier>] customer] ; ''send'' <recipient> <communication> :When Request val[environmentcustomer.html" ;"title="nvironment.html" ;"title="val[environment">val[environmentcustomer">nvironment.html" ;"title="val[environment">val[environmentcustomer/kbd> is received, send <recipient> Request val[environmentevalCustomer1] where evalCustomer1 is a new Actor such that :when evalCustomer1 receives the communication Returned[theRecipient], then send <communication> :Request val[environmentevalCustomer2.html" ;"title="nvironment.html" ;"title="val[environment">val[environmentevalCustomer2">nvironment.html" ;"title="val[environment">val[environmentevalCustomer2/kbd> where evalCustomer2 is a new actor such that :when evalCustomer2 receives the communication Returned[theCommunication], then send theRecipient theCommunication. ;<recipient>.<message> :When Request val[environmentcustomer.html" ;"title="nvironment.html" ;"title="val[environment">val[environmentcustomer">nvironment.html" ;"title="val[environment">val[environmentcustomer/kbd> is received, send <recipient> Request val[environmentevalCustomer1] such that :when evalCustomer1 receives the communication Returned[theRecipient], then send <message> Request val[environmentevalCustomer2.html" ;"title="nvironment.html" ;"title="val[environment">val[environmentevalCustomer2">nvironment.html" ;"title="val[environment">val[environmentevalCustomer2/kbd> such that :when evalCustomer2 receives the communication Returned[theMessage], then send theRecipient :Request[theMessage customer] ;''receiver'' ... <pattern>i <expression>i ... :When Request val[environmentcustomer.html" ;"title="nvironment.html" ;"title="val[environment">val[environmentcustomer">nvironment.html" ;"title="val[environment">val[environmentcustomer/kbd> is received, send customer a new actor theReceiver such that :when theReceiver receives a communication com, then create a new bindingCustomer and send environment :Request[Bind[<pattern>i com] bindingCustomer] and :if bindingCustomer receives Returned nvironment’/kbd>, send <expression>i :Request[Eval[environment’ :otherwise if bindingCustomer receives Thrown ../kbd>, try <pattern>i+1 ; ''behavior'' ... <pattern>i <expression>i ... :When Request val[environmentcustomer.html" ;"title="nvironment.html" ;"title="val[environment">val[environmentcustomer">nvironment.html" ;"title="val[environment">val[environmentcustomer/kbd> is received, send customer a new actor theReceiver such that :when theReceiver receives Request[message customer’], then create a new bindingCustomer and send environment :Request[bind[<pattern>i message] customer’] and :# if bindingCustomer receives Returned nvironment’/kbd>, send <expression>i :#:Request val[environment’customer’.html" ;"title="nvironment’.html" ;"title="val[environment’">val[environment’customer’">nvironment’.html" ;"title="val[environment’">val[environment’customer’/kbd> :# otherwise if bindingCustomer receives Thrown ../kbd>, try <pattern>i+1 ; :When Request val[environmentcustomer.html" ;"title="nvironment.html" ;"title="val[environment">val[environmentcustomer">nvironment.html" ;"title="val[environment">val[environmentcustomer/kbd> is received, send <expression>1 Request[Eval[environment and concurrently send <expression>2 Request[Eval[environment customer]. ; ''let'' <identifier> = <expression>value ''in'' <expression>body :When message val[environmentcustomer.html" ;"title="nvironment.html" ;"title="val[environment">val[environmentcustomer">nvironment.html" ;"title="val[environment">val[environmentcustomer/kbd> is received, then create a new evalCustomer and send <expression>value :Request val[environmentevalCustomer1. :When evalCustomer receives Returned[theValue], create a new bindingCustomer and send environment :Request[bind[<identifier> theValue] bindingCustomer] :When bindingCustomer receives Returned nvironment’/kbd>, send <expression>body Request val[environment’customer.html" ;"title="nvironment’.html" ;"title="val[environment’">val[environment’customer">nvironment’.html" ;"title="val[environment’">val[environment’customer/kbd> ; ''serializer'' <expression> :When Request val[environmentcustomer.html" ;"title="nvironment.html" ;"title="val[environment">val[environmentcustomer">nvironment.html" ;"title="val[environment">val[environmentcustomer/kbd> is received, then send customer Returned[theSerializer] where theSerializer is a new actor such that communications sent to theSerializer are processed in FIFO order with a behavior Actor that is initially <expression>.Eval nvironment/kbd> and :When communication com is received by theSerializer, then send the behavior Actor Request om customer’/kbd> where customer’ is a new actor such that :when customer’ receives Returned heNextBehavior/kbd> then theNextBehavior is used as the behavior Actor for the next communication received by theSerializer.Example program
An example program for a simple storage cell that can contain any Actor address is as follows: : Cell ≡ :: ''receiver'' ::: Request reate[initialcustomer.html" ;"title="nitial.html" ;"title="reate[initial">reate[initialcustomer">nitial.html" ;"title="reate[initial">reate[initialcustomer:::: ''send'' customer Returned[''serializer'' ReadWrite(initial)] The above program which creates a storage cell makes use of the behavior ReadWrite which is defined as follows: : ReadWrite(contents) ≡ :: ''behavior'' ::: Request[read[] customer] :::: ::: Request rite[xcustomer.html" ;"title=".html" ;"title="rite[x">rite[xcustomer">.html" ;"title="rite[x">rite[xcustomer:::: Note that the above behavior is pipelined, i.e., the behavior might still be processing a previous read or write message while it is processing a subsequent read or write message.. For example, the following expression creates a cell x with initial contents 5 and then concurrently writes to it with the values 7 and 9. :''let'' x = Cell.Create[5] ''in'' The value of the above expression is 5, 7 or 9.See also
* Actor model and process calculi * Actor model theoryReferences
*Henry Baker (computer scientist), Henry Baker and Carl Hewitt The Incremental Garbage Collection of Processes Proceedings of the Symposium on Artificial Intelligence Programming Languages. SIGPLAN Notices 12, August 1977. *Peter Bishop Very Large Address Space Modularly Extensible Computer Systems MIT EECS Doctoral Dissertation. June 1977. *Henry Baker. Actor Systems for Real-Time Computation MIT EECS Doctoral Dissertation. January 1978. *Carl Hewitt and Russ Atkinson. Specification and Proof Techniques for Serializers IEEE Journal on Software Engineering. January 1979. *Ken Kahn. A Computational Theory of Animation 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. *Bill Kornfeld and Carl Hewitt. The Scientific Community Metaphor IEEE Transactions on Systems, Man, and Cybernetics. January 1981. *Henry Lieberman. Thinking About Lots of Things at Once without Getting Confused: Parallelism in Act 1 MIT AI memo 626. May 1981. *Henry Lieberman. A Preview of Act 1 MIT AI memo 625. June 1981. *Bill Kornfeld. Parallelism in Problem Solving MIT EECS Doctoral Dissertation. August 1981. *Daniel Theriault. A Primer for the Act-1 Language MIT AI memo 672. April 1982. *Henry Lieberman and Carl Hewitt. A real Time Garbage Collector Based on the Lifetimes of Objects CACM June 1983. *Daniel Theriault. Issues in the Design and Implementation of Act 2 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 Henry Lieberman. Design Issues in Parallel Architecture for Artificial Intelligence MIT AI memo 750. Nov. 1983. *Charles Seitz. The Cosmic Cube CACM. Jan. 1985. *Carl Manning. Traveler: the Actor observatory ECOOP 1987. Also appears in Lecture Notes in Computer Science, vol. 276. *Carl Manning,. Acore: The Design of a Core Actor Language and its Compile MastersThesis. MIT EECS. Maiy 1987. *William Athas and Charles Seitz Multicomputers: message-passing concurrent computers 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 Rapport de Recherche 88-58, RXF-LITP, Paris, France, September 1988 *William Dally and Wills, D. Universal mechanisms for concurrency PARLE ‘89. *W. Horwat, A. Chien, and W. Dally. Experience with CST: Programming and Implementation PLDI. 1989. *