Mana (プログラミング言語)

Manaは、ビデオゲーム開発向けスクリプト言語である。ゲームの登場人物の移動やアニメーション、およびメッセージの制御などを簡単な構造で記述できることが特徴である。アクターモデルを扱って並列処理を再現したものである。

構成概念
Mana言語ではプログラミングするという行為を、ドラマの製作過程になぞらえて考える。プログラマーは映画でいう監督・脚本家・演出家である。そして、プログラムに登場する要素は役者になぞらえられ「アクター」と呼ばれる。Mana言語のプログラムは、複数のアクターという単位によって構成される。それぞれの場面に必要なアクターが、その場面のソースファイルの中に存在する。そして、各アクターがお互いの動きに応じて反応しあい、一つの場面を作り上げていく。Mana言語を象徴する概念がリクエストとプライオリティである。これはアクター同士でお互いの動きを命令しあうもので、これによって並列的な動きとアクター同士の連携を実現している。

「台本」のようなコードを記述するコンピューター言語には他に、プログラミング言語の「Shakespeare」や データ記述言語の「TVML」があるが、Mana言語ではreqやjoinなど並列制御に関する命令のみ言語使用に定義されているだけで、ゲームに関する命令は全て拡張関数として定義しなければならない。

アクターとリクエスト、プライオリティ
Mana言語を象徴する概念が「リクエスト」である。これはアクター同士でお互いの動きを命令しあうもので、これにより並列的な動きとアクター同士の連携を実現している。

アクターは全１６段階のプライオリティ（優先度）毎にプログラムカウンタを持っており、現在のプライオリティの処理のみが実行される。優先すべきリクエストが来た場合、即座に処理を切り替える。逆に、下位のリクエストが来た場合は、現在の処理終了後に処理を切り替える。
このようにして、高いプライオリティのタスクは即座に切り替わり、低いプライオリティのタスクは予約される。

コード例

基本的な「Hello world」プログラムはこのように書く。
action HelloWorldActor::init
{
 print ("Hello, world!\n") ;
}

オブジェクトAがオブジェクトBに話しかけるプログラムの例。（大文字の命令は拡張関数である）
action ObjectA::walk
{
 ShowMessage ("Hello!\n") ;
 req (1, ObjectB::talk);
 join (1) ;
}
action ObjectB::talk
{
 ShowMessage ("Hello! Nice to meet you.\n") ;
}

関連項目
Shakespeare (プログラミング言語)
TVML

外部リンク
Mana公式ウェブサイト

スクリプト言語
プログラミング言語