Skip to main content
QUICK REVIEW

[論文レビュー] A system for reflection in C++

Duraid Madina, Russell K. Standish|ArXiv.org|Jan 27, 2004
Simulation Techniques and Applications被引用数 7
ひとこと要約

この論文では、コンパイル時オブジェクト記述子を生成することでランタイム内省、シリアル化、スクリプト連携を可能にするC++システム、Classdescを提示する。この手法はC++クラスを解析し、再帰的にオブジェクト構造を走査する関数テンプレートを出力することで機能し、マシン非依存のシリアル化とTclなどのスクリプト言語への動的バインディングを可能にする。Eco Labシミュレーションフレームワークへの応用で成功が確認された。

ABSTRACT

Object-oriented programming languages such as Java and Objective C have become popular for implementing agent-based and other object-based simulations since objects in those languages can {\em reflect} (i.e. make runtime queries of an object's structure). This allows, for example, a fairly trivial {\em serialisation} routine (conversion of an object into a binary representation that can be stored or passed over a network) to be written. However C++ does not offer this ability, as type information is thrown away at compile time. Yet C++ is often a preferred development environment, whether for performance reasons or for its expressive features such as operator overloading. In this paper, we present the {\em Classdesc} system which brings many of the benefits of object reflection to C++.

研究の動機と目的

  • C++にはリフレクションサポートがなく、コンパイル時に型情報が失われるという問題に対処すること。
  • 複雑なC++オブジェクトのマシン非依存のシリアル化を、チェックポイントや分散コンピューティングのために可能にすること。
  • Tclのようなスクリプト言語へのC++オブジェクトの動的バインディングを可能にし、インタラクティブなシミュレーション制御を可能にすること。
  • ランタイムオーバーヘッドなしにプライベートおよびプロテクテッドメンバを内省するメカニズムを提供すること。
  • GUIやリモート実行環境などの外部ツールとC++オブジェクトをシームレスに統合すること。

提案手法

  • コードジェネレータがC++のクラス、構造体、共用体型の定義を解析し、オブジェクトレイアウトを記述する関数テンプレートを生成する。
  • 基底クラスとメンバ変数の正しい走査をコンパイル時に保証するため、関数オーバーロードを用いてオブジェクト記述子を生成する。
  • 汎用テンプレート関数 `pack<T>()` は、プリミティブ型をメモリ表現そのままでバッファにコピーすることでシリアル化を行う。
  • システムはXDRを介したマシン非依存のシリアル化をサポートする `pack_t` クラスを用い、バイナリデータを `append()` メソッドで格納する。
  • プライベートおよびプロテクテッドメンバへのアクセスを許可するために、プリプロセッサツールを介して `friend` 宣言を挿入する。
  • `Single_Obj_Ptr` のようなマクロを用いてポインタの特別な処理を行い、動的型をクラスにカプセル化することでメモリリークを回避する。

実験結果

リサーチクエスチョン

  • RQ1Java やObjective-C で見られるリフレクション機能を、言語レベルのサポートなしにC++に実装するにはどうすればよいか?
  • RQ2ランタイム内省を可能にするC++オブジェクト構造のコンパイル時記述子を効果的に生成する最良の方法は何か?
  • RQ3コード生成と最小限のランタイムオーバーヘッドを用いて、C++でマシン非依存のシリアル化を達成できるか?
  • RQ4型安全性を保ちながら、Tcl などのスクリプト言語にC++オブジェクトを動的バインディングするにはどうすればよいか?
  • RQ5リフレクションシステムにおいて、ポインタや動的メモリを安全に扱うにはどのようなメカニズムが有効か?

主な発見

  • Classdescシステムは、コード生成された記述子を用いて、ネストされた構造体や配列を含む複雑なC++オブジェクトのシリアル化に成功している。
  • XDRライブラリを用いることでマシン非依存のシリアル化が達成され、チェックポイントファイルを異機種間で移行可能になっている。
  • Tclを介した直接的なスクリプトアクセスにより、シミュレーションのインタラクティブ制御やデバッグが可能になった。
  • 汎用ポインタに対してはランタイム警告が発行され、 `Single_Obj_Ptr` のような特別なマクロにより、有効なオブジェクトを指すポインタまたはNULLを明示的にマークできる。
  • `friend` 宣言とプリプロセッサツールの使用により、クラス定義の変更なしに記述子がプライベートおよびプロテクテッドメンバにアクセス可能になっている。
  • このシステムはEco Labシミュレーションフレームワークに正常に統合され、クライアントサーバー型シミュレーションおよびチェックポイント処理に使用されている。

より良い研究を、今すぐ始めましょう

論文の読解から最終レビューまで、研究時間を劇的に削減しましょう。

クレジットカード登録不要

このレビューはAIが作成し、人間の編集者が確認しました。