Orc is ...

... a novel language for distributed and concurrent programming which provides uniform access to computational services, including distributed communication and data manipulation, through sites. Using four simple concurrency primitives, the programmer orchestrates the invocation of sites to achieve a goal, while managing timeouts, priorities, and failures.

Orc 2.1.2 is available for download (release notes)

What can I use Orc for?

  • As a general purpose programming language for concise encoding of concurrent and distributed applications. See a probabilistic solution to the dining philosophers problem, or try out some simple programs that combine concurrency and synchronization with fault-tolerance and time-out.
    hide this demo
    {-
    Dining Philosophers.
    
    Based on the randomized algorithm given in:
    Lehmann, D. J., Rabin M. O.  On the Advantages of Free Choice: A Symmetric and Fully Distributed Solution to the Dining Philosophers Problem. Principles Of Programming Languages 1981 (POPL'81), pages 133-138.
    -}
    
    -- Randomly swap two elements
    def shuffle(a,b) = if (Random(2) = 1) then (a,b) else (b,a)
    
    -- Acquire two forks in the order given
    def take((a,b)) =
      a.acquire() >> b.acquireD() ;
      a.release() >> take(shuffle(a,b))
    
    -- Release two forks
    def drop(a,b) = (a.release(), b.release()) >> signal
    
    -- Start a philosopher process with forks a and b
    def phil(a,b,name) =
      def thinking() = Rwait(Random(1000))
      def hungry() = take((a,b))
      def eating() =
        Println(name + " is eating.") >>
        Rwait(Random(1000)) >>
        Println(name + " has finished eating.") >>
        drop(a,b)
      thinking() >> hungry() >> eating() >> phil(a,b,name)
    
    -- Start n philosophers dining in a ring
    def dining(n) =
      val forks = Table(n, lambda(_) = Semaphore(1))
      def phils(0) = stop
      def phils(i) =
          phil(forks(i%n), forks(i-1), "Philosopher " + i)
        | phils(i-1)
      phils(n)
    
    -- Simulate 5 philosophers for 10 seconds before halting
    Let( dining(5) | Rwait(10000) ) >>
    Println("Simulation stopped.") >>
    stop
    
  • As a web scripting language to create a web-service mashup in a few minutes. Orc's emphasis on concurrency makes mashups much simpler to write than in other scripting languages. See a simple search mashup that starts a Bing search and a Google search simultaneously and prints the first set of responses. You can create your own mashup here.
  • As an executable specification language for workflow applications and process coordination problems. Read about how Orc can represent many common workflow patterns

Read more about the ideas behind Orc, or dive in to Orc in 15 minutes.

Get Started

Get Involved

Contact Us

Supporting Agencies

This research is supported in part by funding from the National Science Foundation. Any opinions, findings, and conclusions or recommendations expressed on this website are those of the author(s) and do not necessarily reflect the views of the National Science Foundation.

Last updated 2017-05-31