Occamは、並行プログラミングに特化した言語であり、その設計はCSP(
Communicating Sequential Processes)という理論モデルに強く影響を受けています。この言語の名前は、ウィリアム・オッカムの「
オッカムの剃刀」という哲学的な原理に由来しています。Occamは、CSPの実用的な実装と捉えることもでき、並行処理を記述するための強力なツールを提供します。一方、並行処理に関わらない部分では、手続き型(または命令型)のプログラミングスタイルを採用しています。
概要
Occamのコードは、インデントとフォーマットに非常に依存しており、これらはコードの構造を決定する上で重要な役割を果たします。式は改行によって区切られ、複数の式を連続して記述する場合は、同じレベルのインデントを保つ必要があります。これは、いわゆる「
オフサイドルール」と呼ばれるものです。
プロセス間の通信は、チャネルを通じて行われます。あるプロセスがチャネルにデータを送信する際は`!`演算子を使用し、チャネルからデータを受信する際は`?`演算子を使用します。これらの入出力操作は、通信相手が準備完了状態になるまでブロックされます。例えば、以下のコードでは、`c`が変数、`keyboard`と`screen`がチャネルを表しています。
occam
keyboard ? c
screen ! c
`SEQ`キーワードは、それに続く式のリストを逐次的に実行することを示します。他の言語のように、逐次実行がデフォルトで適用されることはありません。以下の例では、`:=`が代入演算子として使われています。
occam
SEQ
x := x + 1
y := x x
`PAR`キーワードは、それに続く式のリストを並列に実行してもよいことを示します。これは、複数のプロセスを同時に実行する場合に用いられます。
occam
PAR
x := x + 1
y := y 2
`ALT`キーワードは、選択実行を可能にします。ガード付きのコマンドのリストが続き、各ガードは条件式(省略可能)と入力チャネル式(省略可能)で構成されます。ガードは条件が真で、かつ入力チャネルからデータが到着した場合に成功します。複数のガードが同時に成功する可能性もあります。
occam
ALT
count1 < 100 & c1 ? data
SEQ
count1 := count1 + 1
merged ! data
count2 < 100 & c2 ? data
SEQ
count2 := count2 + 1
merged ! data
status ? request
SEQ
out ! count1
out ! count2
この例では、`c1`と`c2`チャネルからデータを読み込み、それらを`merged`チャネルに送信します。`countN`が100になると、対応する入力チャネルは無効になります。`status`チャネルからリクエストを受信すると、`c1`と`c2`から受け取ったデータの回数を`out`チャネルに送信します。
言語バージョン
Occam 2
Occam 2は、1987年にINMOS社によって開発された拡張版であり、浮動小数点演算や整数サイズの選択(16ビットまたは32ビット)、文字型などの機能が追加されました。これにより、Occamは実用的なプログラムを記述するための十分な機能を備え、初期のOccam 1が研究やアルゴリズム開発に限定されていたのに対し、実用的なプログラミングが可能になりました。
Occam 2.1
Occam 2.1は、1988年にINMOS社がリリースした二度目の拡張版であり、INMOSが開発した最後のバージョンです。バージョン番号の増加は小さいですが、使いやすさの面で大きな変更が加えられました。これには、名前付きデータ型、名前付きレコード、パックされたレコード、より柔軟な型変換ルール、新しい演算子(`BYTESIN`など)、チャネルの型変換とチャネル配列、固定長配列を戻り値として使用できる機能などが含まれます。
Occam 3
Occam 3は、INMOSのプログラマーによって作成された次世代Occam言語の仕様です。この仕様はコミュニティからのフィードバックを求めるために公開されました。主な変更点は、コードの共有、同時開発、およびコードの再利用に焦点が当てられていました。しかし、Occam 3の仕様に対応するコンパイラは実際には開発されませんでした。これは、主にINMOS社とその買収企業の問題に起因します。
Occam 2.5
Occam 3の一部要素は、Occam 2.1コンパイラに導入され、その結果としてOccam 2.5として知られる中間バージョンが誕生しました。これは、Kent Retargettable Occam compiler (KRoC)によって提供され、ネストされたプロトコル、実行時のプロセス生成、移動可能なチャネル、データ、プロセス、再帰、プロトコル継承、配列生成、拡張されたランデブー機能などの拡張が含まれています。KRoCチームはコンパイラを開発し、Webサイトで公開しています。最近では、π計算(en:π-calculus)を使用していることから、コンパイラの名称をOccam-Piに変更しました。
外部リンク
以下は、Occamに関する英語の外部リンクです。
Internet Parallel Computing Archive: occam (ドキュメントと実装)
The Transterpreter, an occam virtual machine
KRoC - Kent Retargettable occam Compiler
occam tutorial