概要 defobjは、Swarm全体で使用されるオブジェクト指向プログラミングのスタイルをサポートします。defobjで定義するのは、オブジェクトの作成、ストレージアロケーション、エラー処理、デバッグサポートといったObjective C言語を使用するための独自のスタイルです。 |
defobjライブラリはライブラリインターフェイス規則を確立し、それを使用してdefobjライブラリを定義し、記述しています。defobjライブラリは、GNU Objective CランタイムシステムのObjectスーパークラスや、その他の標準的な型定義をインポートします。
collectionsライブラリは、常にdefobjライブラリといっしょにリンクしなければなりません。defobjのインターフェイス定義がかならずしもcollectionsに直接依存しているわけではありませんが、これらのライブラリの実装では、ともにもう一方が必要とされます。直接初期化しなければならないのはcollectionsライブラリだけで、collectionsライブラリを初期化するとdefobjライブラリも自動的に初期化されます。
Swarmの特定のバージョンに対して、明らかな互換性の問題はありません。
Swarmがオブジェクト指向プログラミングを採用している理由は、このプログラミング方式が汎用目的のソフトウェアライブラリを構築するのに最適だということもありますが、それだけではありません。この方式のオブジェクトという概念そのものが、Swarmのモデル構築の基礎となっているからです。Swarmのシミュレーションを構築するには、最初のステップとして、実世界あるいは人工世界に存在する様々な種類のオブジェクト(要素)を定義し、次のステップでこれらのオブジェクトに発生し得る各種のイベントを定義します。これらのイベントには、オブジェクト間が相互に作用し合うのに必要なすべての手順が含まれます。
オブジェクトの基礎として、オブジェクトは外部からのイベントに反応するという概念があります。オブジェクトで唯一考慮すべきなのは、これらのイベントに対する反応を観測する方法です。オブジェクト指向プログラミングシステムでは、オブジェクトはユニークに認識できるデータの集合体として表され、イベントはこれらのオブジェクトに発生させることができる動的なオペレーションです。
オブジェクト指向プログラミングのシステムが異なれば、オブジェクトに発生するイベントのオペレーションを定義する方法も異なってきます。たとえば、C++ではこのオペレーションは"メンバ関数"と呼ばれており、C言語の普通の関数呼び出しと極めて似ています。一方、Objective Cでは、オブジェクトに対するオペレーションは"メッセージ"と呼ばれ、それを呼び出す特別な文法が存在しています。ただし、メッセージにも引数があり、また様々な点で関数呼び出しに似た振る舞いをします。
Swarmの重要な必要条件は、シミュレートされている世界の中でイベントが発生すると考えられるとき、任意のオブジェクトに対して任意の時点で、これらすべてのオペレーションをかならず発生させるということです。Swarmはこれらのオペレーションをそれ自身のデータ構造に保存します。Swarmでシミュレーションが実行されると、Swarmシステム自身がこれらのデータ構造を探索し、起きるべきときに必要なオペレーションを発生させます。
Swarmはどんなときでも、あらゆる種類のオブジェクトに、あらゆる種類のアクションを発生させられなければなりません。また、それを実現するには、そのアクション自体のある種の表記を納める汎用性の高い構造体が必要となります。この必要条件は特別なもので、すべてのオブジェクト指向言語が備えているものではありません。あなたはシミュレートするモデルに存在するはずの何種類ものオブジェクトを定義するという、多くの作業をすでに抱えているわけです。その上にあなたがそれらのオブジェクトに発生し得る膨大な数のイベントのすべてを定義しなくて済めば、それに越したことはありません。それがSwarmの望むところです。Swarmは、あなたにこの面倒な作業を強いる代わりに、オブジェクト指向言語を採用しました。この言語では、すでにあなたが定義したオブジェクトに対して、オペレーションの表記を持ったイベントが提供されます。次に、Swarmは、これらの表記をSwarm自身のデータ構造に収容し、必要に応じてそのオペレーションを発生させることができるようになります。
Swarmでは、オブジェクトに発生するイベントの表記が、オブジェクトそのものと同じくモデルの基礎をなします。しかし、オブジェクトシステムがオブジェクトとともに汎用的なイベント表記を提供できなければ、かなり多くの作業が必要となってしまいます。Objective Cシステムでは、"メッセージセレクタ"と呼ばれる特殊なデータ型を使用することで、これを実現するのに必要となる柔軟なオペレーション表記を提供しています。この機能はC++言語にはありません(C++コンパイラは、オペレーションについてSwarmのイベント構造より多くの情報を要求します)。
Objective CがSwarmシステムに必要とされる条件を満たした最適な言語だという根拠は、これ以外にもたくさんあります。Objective Cは、C++のようにオブジェクト上のオペレーションを非常に効率的な形にまとめることができます。ただしObjective Cでは、オペレーションのスタートで、C++より少しだけ多くのオーバーヘッドが発生します。シミュレーションは、シミュレートされている世界で発生するあらゆる振る舞いを網羅する必要があるので、かなりの長い期間実行されることがあります。したがって、この効率の問題はシミュレーションには非常に重要です。Lisp、Smalltalk、Javaといったその他の言語も、汎用的なイベント構造を可能にする"動的メッセージディスパッチ"機能を備えていますが、Cと比較するとかなりのオーバーヘッドが発生します。
Objective Cは、C言語を多少拡張しただけの言語です。C言語の基本知識はすでに多くの人が持っているはずで、それがあれば、Objective Cの数少ない拡張部分はほんの数日で習得することができます。ただし、どのオブジェクト指向言語でも同じことですが、オブジェクトの概念を本当の意味で学ぶには、さらに多くの時間が必要です。
Objective CはSwarmにとって最適な選択でした。Objective Cが高品質でフリーなGNU Cコンパイラに実装されているためです。Objective Cがもつ主要な問題の1つに、この言語がC++などのように広く知られておらず、また使用されていないことが挙げられます。しかし、GNU Cコンパイラがあるので、Swarmを実行したいマシンにインストールして使うことはできます。現在Apple Rhapsodyプロジェクトの一部となっているOpenStepシステム(元NeXT CorporationのNeXTStep)や、同時進行しているGNUStepプロジェクトのおかげで、Objective Cは活きた言語として認知されています。
Swarmが利用しているObjective Cの強力な特徴はまだあり、その一部がdefobjライブラリの上級利用ガイドに説明されています。その他の多くの部分は、SwarmがObjective Cを利用する方法の心臓部にあたるので、この利用ガイドの後半で説明します。defobjの唯一の目的は、Swarm上でObjective Cを使用するための標準的なスタイルを定義することです。このスタイルをバックアップしているのは、それをサポートするためにSwarmが用意しているファンデーションクラスのライブラリです。
Swarmは、オブジェクト作成のような基本的なオペレーションにも独自のファンデーションクラスを提供しています。またその他に、ビルトインされたObjectスーパークラスからユーザクラスが普通に受け取ることのできるサポートもあります。defobjライブラリをしっかりと理解することは、SwarmでObjective Cのプログラミングをするために不可欠です。どのプログラミング言語でも同様ですが、Objective Cを利用するには、言語のルールそのものだけでなく、構築の基礎をなす基本機能を持った標準ライブラリについて学習する必要があります。実際のところは、Objective Cに正式な標準ライブラリはまったくありません(ついでに言えば、言語定義もありません)。ただし、OpenStepファンデーションライブラリ(およびOpenStep言語定義)が、そういった標準的なライブラリにかなり近づいています。
このドキュメンテーションだけでなく上級利用ガイドでも説明しているとおり、様々な理由により、SwarmはNextStepファンデーションインターフェイスに基づいた標準ライブラリを使用しません。他の教材でObjective C言語を学習することも可能ですが、その場合、教材に説明されている標準オブジェクトやライブラリサポートは、言語レベルの説明と切り分けて読む必要があります。
Swarmドキュメンテーションの索引ページでは、Objective Cに関する様々なリソース、特にOpenStep(元NextStep)の定義とGNU Cコンパイラの実装に関するオンラインリファレンスへリンクを張りました。Swarmドキュメンテーションでは、Objective Cの基本部分については一切説明していません。ユーザが他の資料ですでにObjective Cを学習したものとしています。Objective Cリファレンス(Object-Oriented Programming and the Objective C Language)は、公開されているものの中では最高の情報源です。また、Rhapsody Developer Documentationのサイトから書籍を注文することも可能です。この本はObjective Cのプログラミングに欠くことができません。
Objective Cを使ったプログラミングを習得していても、SwarmがObjective C言語とそのランタイムシステムを利用するために採用した特別な手法について理解しないうちは、Swarmを使ったObjective Cプログラミングはしないでください。これらについては、このdefobjライブラリで説明しています。Defobjは、Swarmのファンデーションクラスの中でも最も基礎的な階層を提供しており、同時に、SwarmでObjective Cを使用するためのルールやガイドラインがすべて凝縮されています。
ルールやガイドラインの中にはソフトウェアに実装する必要のないものもあります。しかしそれらは、Swarmの目的に類似した目的でObjective Cのプログラミングする人なら、誰もが従うはずの規則や推奨される流儀です。このセクションはその種の規則に焦点を絞っています。後のセクションでは、特定のソフトウェアサポートに依存したSwarmのObjective Cスタイルの側面を説明します。
このセクションの続きはまだ書いていません... 現在のところ、この情報のいくつかについてはライブラリインターフェイス規則を、そのほかについてはSwarmのチュートリアルを参照してください。
現在のdefobjライブラリには、他のライブラリが使用するCreateDropおよびObject_sスーパークラスが含まれています。ObjectbaseライブラリのSwarmObjectスーパークラスは、Swarmシミュレーションのユーザオブジェクト用に、これらのスーパークラスで必要なすべての振る舞いを1つの単純なスーパークラスにまとめたものです。
defobjはカスタム生成クラスのサポートも提供しています。その中には標準的なcreateプロトコルの個々のフェーズを実装するサポートも含まれます(これらについては、上級ユーザガイドにある生成フェーズのクラスを参照してください)。カスタム生成クラスのフレームワークはまだ詰めの段階なので、カスタム生成クラスからのサブクラス化は正式にはサポートされません。カスタム生成クラスは、現在defobj、collections、activityライブラリでのみ使用されており、これらのライブラリでは、サブクラス化をサポートする特定のクラスを記述しています。
一般に、ライブラリを実装するクラスは、そのままではスーパークラスとして利用できるようにはなりません。どのライブラリも、そこからサブクラス化するユーザクラスに有効なそれらの特定のスーパークラスを、ユーザサブクラスが新しい振る舞いを実装するときに従わなければならないルールに沿って、記述する必要があります。
ドキュメンテーションと実装の現状
現在defobjで定義されているインターフェイスは、パッケージ構造やカスタム生成クラスに関する例外を除き、このまま安定すると見られます。これらのファシリティは全体的に入れ替えられつつあり、この作業が終了するまでは解説されることはありません。カスタム定義型へのサポートも、後に提供されることになっています。
ヘッダファイル内に定義されたすべてのインターフェイスの実装は現在進行中です。ただし、ローカルページのコレクションに割り当てられるすべてのストレージを収容したり、使用していないストレージの自動解放を行う様々なゾーンの型はそれに含まれていません。現在のゾーンの実装は、定義される割り当てメッセージをすべてサポートしており、また、その中で直接作成されたすべてのオブジェクトで構成されるゾーンの個体数を管理することもできます。
利用ガイドのセクションはさわりに過ぎませんが、Swarm全体に使用されているObjective Cプログラミングスタイルに関する説明が書いてあります。まだ手をつけなければならない詳細は残っていますが、インターフェイスリファレンスのセクションは完全です。この文書全体に渡って、「(..」で始まるコメントは、実装やドキュメンテーションに関する現況を説明したものです。