JPH0836494A - 動的拡張可能オブジェクト用のタイプ・セーフ・フレームワークのための方法及び装置 - Google Patents

動的拡張可能オブジェクト用のタイプ・セーフ・フレームワークのための方法及び装置

Info

Publication number
JPH0836494A
JPH0836494A JP7031836A JP3183695A JPH0836494A JP H0836494 A JPH0836494 A JP H0836494A JP 7031836 A JP7031836 A JP 7031836A JP 3183695 A JP3183695 A JP 3183695A JP H0836494 A JPH0836494 A JP H0836494A
Authority
JP
Japan
Prior art keywords
data structure
shadow
node
code
computer
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP7031836A
Other languages
English (en)
Inventor
J Gibbons Jonathan
ジョナサン・ジェイ・ギボンズ
Michael J Day
マイケル・ジェイ・デイ
Theodore C Goldstein
セオドア・シイ・ゴールドステイン
Michael J Jordan
マイケル・ジェイ・ジョルダン
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sun Microsystems Inc
Original Assignee
Sun Microsystems Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Sun Microsystems Inc filed Critical Sun Microsystems Inc
Publication of JPH0836494A publication Critical patent/JPH0836494A/ja
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/48Incremental compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/436Semantic checking
    • G06F8/437Type checking

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【目的】 コンピュータ・プログラムを表す既存のデー
タ構造を、そのコンピュータ・プログラムの新バージョ
ンを作成するのに必要な時間とコストを削減できるとい
う形で利用するシステム及び方法を提供する。 【構成】 コンピュータ・プログラムの新バージョンの
タスクを実行するのに必要な、既存のデータ構造の要素
またはノードのシャドウだけを含むシャドウ・データ構
造を生成するように、既存のデータ構造を修正する。本
発明は元のプログラムのデータ構造をシャドウ可能にす
るためのプロセスと、シャドウ・データ構造を作成する
プロセスを含めて、プログラムの新バージョンをコンパ
イルする際に元のプログラム・コンパイル・プロセスか
らのデータを使用するプロセスと、コンピュータ・プロ
グラムの新バージョンをシャドウ・データ構造と共に使
用して所望の実行を作成するプロセスとを含む。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、コンピュータ・システ
ムの分野に関し、具体的にはプログラミング言語コンパ
イラ、インタプリタ、及び関連する補助システムに関す
る。さらに詳しくは、本発明は、オブジェクトの接続さ
れた集合体からなるデータ構造の機能性の拡張と、この
ようなオブジェクトのデータ構造をあるタイプ空間から
別のタイプ空間に投影する機構とに関する。
【0002】
【従来の技術】オブジェクト指向プログラミング言語を
含めて、現代のプログラミング言語の実施は、一般に
「コンパイラ」と呼ばれるプログラムを使って行う。コ
ンパイラとは、ある言語、すなわち「原始」言語で書か
れたプログラムを読み取り、それを別の言語、すなわち
「目的」言語による同じプログラムに変換するプログラ
ムである。オブジェクト指向プログラムと共に使用され
るコンパイラの具体例はC++コンパイラである。
【0003】図1にコンパイラ42の一実施例を示す。
コンパイラ42は、字句解析/パーサ部44と、中間表
現作成部46と、意味解析部48と、コード生成部50
を備える。これらの諸要素は互いに順次結合される。こ
れらが一緒になって、プログラム原始コード52を、ト
ークン化ステートメント54、中間表現56、注釈付き
中間表現58、最後に記号的に行ったデータ参照を伴う
中間形コード60に変換する。注釈付き中間表現58
は、「注釈付き意味論グラフ」(ASG)と呼ぶことが
好ましい。字句解析/パーサ部44と中間表現作成部4
6と意味解析部48は、大部分のコンパイラに見られる
要素の幅広いカテゴリを表現するためのものである。こ
れらの要素の組成と基本的機能は周知であり、本明細書
ではこれ以上詳しくは説明しない。同様に、周知の各種
のトークン、中間表現、注釈及び中間形も、本発明を実
施するために使用される。
【0004】コンパイルの解析段階では、原始プログラ
ムによって暗示される動作が、「構文ツリー」あるいは
さらに一般的に「抽象構文ツリー」(AST)と呼ばれ
る階層構造で決定され記録される。次に図2には、式
“position:=A+B*60”に関するAST
が示されている。このタイプのツリーでは、各「ノー
ド」72、74、76はある操作を表し、ノードの子8
0、82、78は動作の引数を表す(このASTは、ツ
リーの諸要素の意味論的関係を記述するように修正され
たときは、やはり上記の「注釈付き意味論グラフ(AS
G)と呼ぶことが好ましい)。次に図3には、式“po
sition:=A+B*60”がより一般的な式“i
d1:=id2+id3*60(たとえばある番号)”
30として示されている。図3(a)においては、式3
0は、たとえば図3(b)に示すような「3アドレス・
コード」形と呼ばれる中間表現形のデータ構造31とし
て表すことができる。このタイプの3アドレス・コード
・データ構造31は、各メモリ位置がレジスタとして機
能できるマシン用のアセンブリ言語に似ている。各3ア
ドレス・コード命令38は、せいぜい1個の演算子32
と左オペランド34と右オペランド36を有する。
【0005】各種のパーサ機構、中間表現作成機構、意
味解析機構、3アドレス・コード表現、及びコード生成
機構の詳細については、A.V. Aho, R. Sethi, J.D. Ull
man著 Compilers:Principles, Techniques, and Tools,
Addison- Wesley, 1986 年刊、pp. 25〜388 及び 463
〜512、ISBN 0-201-10088-6 を参照のこと。
【0006】オブジェクト指向システムにおいて、オブ
ジェクトとは、データと、そのデータを操作するために
呼び出すことのできる操作とを含む構成要素である。各
オブジェクトはオブジェクト・タイプを有する。オブジ
ェクト・タイプは、そのタイプのオブジェクトに対して
実行できる操作を定義する。オブジェクト操作はオブジ
ェクト自体とは独立に実施される。さらに、1つのオブ
ジェクト・タイプが、他のオブジェクト・タイプについ
て定義され、実施されるオブジェクト操作を継承するこ
とが可能である。オブジェクト指向設計及びプログラミ
ング技術の詳細については、Betrand Meyer 著 Object-
oriented Software Construction、Prentice-Hall、198
8 年刊、ISBN 0-13-629049-3を参照のこと。
【0007】C++など現代のオブジェクト指向言語コ
ンパイラでは、注釈付き意味論グラフ(ASG)及びそ
の対応するデータ構造が、オブジェクトの接続された集
合体として表現され、データ構造の各ノード及びリーフ
が、それ自体の内部データ構造と何らかのメソッドとを
有するオブジェクトである。その結果、大きなオブジェ
クト指向プログラムの原始コードが、コンパイル過程の
中間表現として、非常に大きなASGと関連データ構造
(それ自体が非常に大きなオブジェクト指向プログラ
ム)を生成することになる。そのようなコンパイラの多
くはこのASGをユーザに露出させず、単にそれをコン
パイル中のプログラムのオブジェクト・コード作成のた
めコンパイラのコード生成部への入力として使用する。
【0008】どのプログラミング言語の成否も、(基本
コンパイラとリンカの他に)アプリケーション・プログ
ラムの構築と修正を可能にする1組のツールと、ツール
の使い易さ及び有用性とに大いに依存する。デバッガ、
コード・ブラウザ、コード・アナライザ、スタイル・ア
ナライザ及び他の特別プログラムなどのツールは、それ
が使用可能で使い易ければ、アプリケーション・プログ
ラムの有用性を高めることができる。さらに、新しいツ
ールが十分に構築し易くなっている場合は、新しい強力
なツールが出現する。新しいツールの開発を強化し、そ
のようなツールを構築するために、当分野における近年
の開発は、コンパイラに修正を加えることによりASG
を露出させて、ASGデータ構造を出力し、このデータ
構造をオブジェクト・データ・ベースに記憶して、他の
プログラムが使用できるようにすることを促進してき
た。たとえば、Mick Jordan の論文"An Extensible Pro
gramming Environment for Modula-3"、ACM Proceeding
s SIGSOFT'90(米国カリフォルニア州 Irvine)、pp. 6
6〜76 参照。
【0009】
【発明が解決しようとする課題】この様々なオブジェク
ト・タイプの相互接続されたオブジェクトの集合体とい
う形のASGが、ツール開発者に使用可能になっている
とはいえ、その使用に伴って多くの問題がある。
【0010】オブジェクト指向プログラムにおいては、
様々なタイプの相互接続されたオブジェクトの集合体を
もつことが普通である。このような集合体を操作するた
めに、個々のオブジェクトの機能性を、異なる独立した
クライアント(この場合はツール開発者など)のため
に、恐らくは一時に多数のクライアントのために異なる
方式で拡張できることがしばしば望ましい。集合体用の
コードをコンパイルするとき、あるいは集合体を実際に
構築するときには、潜在的クライアントがすべてそっく
りわかっていないことがあり得る。さらに、様々なオブ
ジェクトの機能性を、タイプ互換性規則を保持する形で
拡張できることが望ましい。すなわち、エンティティは
サブクラスを参照できるが、サブクラスはクラスを参照
できないようにすることが望ましい。これを、以下では
タイプ・セーフな形でのオブジェクトの機能性の拡張と
言う。
【0011】この問題にはもう1つの側面がある。所望
のすべての追加の機能性をサポートするようにオブジェ
クトを修正することが可能であったとしても、そうする
ことが望ましくはないこともあり得る。沢山のメソッド
(及びその実施に必要なインスタンス・データ)を付加
すると、「インタフェース・ブロート」と呼ばれる効果
が生じて、オブジェクトをそのすべての機能性を使用し
ようがそうでなかろうがその機能性のコストを負担しな
ければならなくなることがあり得る。すなわち、ユーザ
がASGオブジェクトを使用し始めるとき、コードの再
コンパイルを必要とするメソッドを付加することにな
る。多くのメソッドを付加するにつれて、必然的にオブ
ジェクトの機能、使用、説明などがますます複雑にな
り、記憶のための内部メモリ空間がますます沢山必要に
なる。また追加のメソッドの付加によってこうしたオブ
ジェクトが大きく成長していくにつれて、これらのオブ
ジェクトのデータ・ベースも大きくしなければならな
い。したがって、再コンパイルの必要なく、またこれら
のオブジェクトの既存のメソッドが新しいアプリケーシ
ョンに必要でないならば、それらのメソッドをすべて使
用する必要なしに、ASGオブジェクトを使用する方法
が求められている。
【0012】この問題は1つのプログラミング言語に固
有のものではなく、継承の存在によって悪化する。継承
によってスタティック・タイプのオブジェクトとダイナ
ミック・タイプのオブジェクトの違いが導入されるから
である。本明細書では、これらの問題に対する解決策を
枠付けするため、例としてC++を使用する。たとえば
Ellis と Stroustrup 著 The Annotated C++ Referenc
e Manual、Addison-Wesley、1990 年刊、ISBN 0-201-51
459-1 を参照のこと。
【0013】後でさらに詳しく説明するように、本発明
は、ツール開発者にとって容易にアクセスできるオブジ
ェクトの大型データ構造を作成する問題に適用できると
共に、様々なタイプの接続されたオブジェクトの集合体
を修正するようにどんな環境にも適用できる、動的に拡
張可能なオブジェクト用のタイプ・セーフ・フレームワ
ークである。
【0014】
【課題を解決するための手段】本発明は、コンピュータ
・プログラムの新しいバージョンの作成に要する時間と
費用を短縮するという利益が得られるような形で、コン
ピュータ・プログラムを表す既存のデータ構造を使用す
るためのシステム及び方法を提供する。既存のデータ構
造は、コンピュータ・プログラムの新バージョンのタス
クを実行するのに必要な既存のデータ構造の要素または
ノードのみのシャドウを含むシャドウ・データ構造を生
成するように修正される。本発明は、元のプログラムの
データ構造をシャドウ可能にするプロセスと、シャドウ
・データ構造を作成するプロセスを含めて、プログラム
の新バージョンをコンパイルする際に元のプログラム・
コンパイル・プロセスからのデータを使用するプロセス
と、コンピュータ・プログラムの新バージョンをシャド
ウ・データ構造と一緒に使用して所望の実行を作成する
プロセスを含む。このコンピュータ・プログラムの新バ
ージョンは、一般に元のプログラムの実行を何らかの形
で検査または観察するためのツールである。さらに、こ
こに開示するシステム及び方法は、動的に拡張可能なオ
ブジェクトの接続された集合体のタイプ・セーフなバー
ジョンを作成するためのソフトウェア製造者向けの機構
を提供する。
【0015】第1のデータ構造を準備し、一対のポイン
タを作成して記憶するように動作するシャドウ・マップ
を使って、第1のデータ構造に何らかの形で関係する第
2のデータ構造を構築するコンピュータ実施方法が開示
される。第2のデータ構造中の各要素またはノードは、
シャドウ・マップ中のポインタ対を使って第1のデータ
構造に関係付けられる。第2データ構造中の各ノードに
ついて、ポインタ対の第1のポインタが第2データ構造
中のノードを指し、ポインタ対の第2のポインタが第1
データ構造中の対応するノードを指す。この方法はさら
に、第2データ構造を第1データ構造の実行可能な変形
として使用する。これらのデータ構造は、接続されたオ
ブジェクトの集合体である。
【0016】また、元のプログラム原始コードを、シャ
ドウ可能中間データ構造を生成するコードに変換し、シ
ャドウ可能データ構造の各ノードごとにシャドウ・ノー
ドを作成し、シャドウ・ノードを接続してシャドウ・デ
ータ構造にし、シャドウ・データ構造のノードをシャド
ウ・マップを使って元のデータ構造に関係付けることに
より、既存のデータ構造からシャドウ・データ構造を作
成するコンピュータ実施方法も開示される。
【0017】また、第1のデータ構造と、一対のポイン
タを含むシャドウ・マップと、シャドウ・マップ中のポ
インタ対によって第1のデータ構造に関係付けられた第
2のデータ構造とからなり、コンピュータ・コード装置
が第2データ構造を第1データ構造の実行可能な変形と
して使用できる、コンピュータを使用してデータ構造の
使用を動的に拡張するシステムも開示され特許請求され
る。
【0018】また、元の原始・コードをオブジェクトの
シャドウ可能データ構造を生成する原始コードに変換す
るように動作する第1のプログラム・コード機構と、オ
ブジェクトのシャドウ・データ構造を作成し、オブジェ
クトのシャドウ可能データ構造をオブジェクトのシャド
ウ・データ構造に関係付けるシャドウ・マップ装置とを
含む、オブジェクトの第1データ構造をあるタイプ空間
から別のタイプ空間へタイプ・セーフな形で投影するた
めのコンピュータ機構も開示され特許請求される。本発
明のシステムの目的、特徴及び利点は、以下の説明から
明らかになろう。
【0019】
【実施例】表現法及び命名法 以下の詳細な説明は、コンピュータまたはコンピュータ
・ネットワーク上で実行されるプログラム手順として提
示することができる。こうした手順による記述及び表現
は、当業者がその仕事の本質を他の当業者に最も有効に
伝えるために使用する手段である。
【0020】手順とは、本明細書では、また一般に、所
望の結果に導く自己整合的なステップのシーケンスであ
ると考えられる。これらのステップは、物理的数量の物
理的操作を必要とするものである。必ずしも常にそうで
はないが、通常は、これらの数量は電気信号または磁気
信号の形をとり、記憶し、転送し、組み合わせ、比較
し、またその他の方法で操作することができる。主とし
て一般に使用されている理由から、これらの信号がビッ
ト、値、要素、記号、文字、項、数字などと呼ぶのが便
利なことがある。ただし、これら及び類似の用語はすべ
て、適切な物理的数量と関連付けられるものであり、そ
れらの数量に付けられた便利なラベルにすぎないことに
留意されたい。
【0021】さらに、実行される操作は、一般に人間の
オペレータによって実行される精神的操作に関連する、
加算や比較などの語で呼ばれることが多い。本発明を構
成し本明細書で記述するどの操作においても、そのよう
な人間のオペレータの能力は必要ではなく、大抵の場合
は望ましくもない。操作は機械動作である。本発明の操
作を実行するための有用な機械には、汎用デジタル・コ
ンピュータや類似の装置が含まれる。
【0022】本発明はまた、これらの操作を実行するた
めの機器にも関する。この機器は、必要とされる目的の
ために特別に構築されたものでもよく、またコンピュー
タ内に格納されたコンピュータ・プログラムによって選
択的に活動化または再構成された汎用コンピュータを備
えるものでもよい。本明細書で提示する手段は、特定の
コンピュータまたはその他の装置に本来的に関係するも
のではない。様々な汎用機が、本発明の教示に従って書
かれたプログラムと共に使用でき、あるいは必要とされ
る方法ステップを実行するために特殊な機器を構築する
方が好都合なこともある。こうした多様な機械用に必要
とされる構造は、本明細書における説明から明らかにな
るであろう。
【0023】好ましい実施例の説明 オブジェクト指向プログラムでは、様々なタイプの相互
接続されたオブジェクトの集合体をもつことが普通であ
る。こうした集合体を操作するために、個々のオブジェ
クトの機能性を、異なる独立したクライアントごとに異
なる形で、しかもできれば同時に複数のクライアントに
ついて拡張できることがしばしば望ましい。集合体用の
コードのコンパイル時、または集合体の実際の構築時に
は、潜在的クライアントの全体がわかっていない可能性
がある。さらに、様々なオブジェクトの機能性をタイプ
・セーフな形で、すなわちエンティティはサブクラスを
参照できるが、サブクラスはクラスを参照できないよう
な形で拡張できることが望ましい。
【0024】「シャドウ操作」は、この問題を解決する
ためのフレキシブルな方法であり、オブジェクトの集合
体をあるタイプ空間から別のタイプ空間に投影すること
ができる。内部的には実時間タイピングの単純な形を使
用してタイプ・セイフ性を提供する。好ましい実施例で
は、シャドウ技術と実時間タイピング技術の両方で専用
ShadowMapオブジェクトを使用して、既存のデ
ータ構造のシャドウ・ノードを作成し、各シャドウ・ノ
ードの、元のデータ構造中のそれに対応するノードに対
する関係のマッピングを維持する。
【0025】元のオブジェクトのすべてのメソッドを継
承する必要なしに様々なタイプの接続されたオブジェク
トの集合体を修正する、どんな環境にも適用可能な、動
的に拡張可能なオブジェクト用のタイプ・セーフなフレ
ームワークであるプロセスが開示される。ここに開示す
る機器とプロセスを用いると、ユーザ(たとえばツール
開発者)は、後で実行するために既存のデータ構造のシ
ャドウ・データ構造を作成することができる。どちらの
データ構造も、オブジェクト指向プログラミング・オブ
ジェクトの接続された集合体である。本発明のこの実施
態様は、任意のコンピュータ・プログラム・プロダクト
を含むどんな関連コンテキストにおいても使用できる
が、例として、特定のタイプのオブジェクト指向コンパ
イラ(すなわちC++)及び例示的オブジェクト指向プ
ログラミング・システムのコンテキストにおいて説明す
る。ただし、当業者が、本開示に記述されたプロセス及
びシステムを理解し、他の様々なコンパイラ及び関連ツ
ールを使ってそれを実施するのに、例示システムに関す
る具体的知識は不要である。
【0026】動作環境 本発明が使用される環境は、汎用コンピュータ・ワーク
ステーション、またはパーソナル・コンピュータが様々
なタイプの通信リンクを介してクライアント−サーバ構
成で接続されており、多くはオブジェクトの形をとった
プログラム及びデータが、システムの他のメンバによる
実行とアクセスが可能なように、システムの様々なメン
バによって使用可能にされ共用されている、汎用分散コ
ンピューティング・システムを取り巻くものである。汎
用ワークステーション・コンピュータ20のいくつかの
要素を図4に示す。図4において、プロセッサ1は入出
力(I/O)部2と、中央演算処理装置(CPU)3
と、メモリ4を有する。入出力部2は、キーボード5、
表示装置6、ディスク記憶装置9、及びCD−ROM駆
動装置7に接続されている。CD−ROM装置7は、通
常プログラム10とデータを格納している、CD−RO
M媒体8を読み取ることができる。コンピュータ表示ア
イコン11が表示装置6上に示されている。同様のワー
クステーションを通信経路で接続して、分散コンピュー
タ・システムを形成することができる。
【0027】以下では、本発明の構築方法と機能の仕方
の概要を示すために、本発明を基礎知識と基礎技術に関
して考察することにする。
【0028】基礎技術 シャドウ シャドウは、データ構造をあるタイプ空間から別のタイ
プ空間に投影できるようにする機構に基づいている。そ
うすることの主な理由は、データ構造の諸ノードに追加
メソッドなど追加の機能性を付加することである。これ
らの機構をより精巧に使用すると、シャドウ・タイプ構
造自体の実際の形状を変更することもできる。
【0029】シャドウの1つの具体的特徴は、データ構
造の諸ノードに継承が使用されるときでもうまく働くよ
うに設計されていることである。データ構造の投影を遅
延評価するためのサポートも提供される。
【0030】次に図5には、90として単純データ構造
とそのシャドウが示されている。左の例は単純データ構
造92であり、タイプAのノード96、タイプBのノー
ド97、タイプCのノード99を含む。右の例はシャド
ウ・データ構造94であり、タイプA’のノード10
6、タイプBのノード107、タイプC’のノード10
9がある。このシャドウはおそらく、データ構造中のノ
ードのタイプを拡張するために作成されたものと思われ
る。データ構造自体を変更することは不可能だったから
である。図5で、ノードA96は、ポインタ98によっ
てノードB97に接続され、ノードC99は、ポインタ
100によってノードA96に、またポインタ102に
よってノードB97に接続されている。シャドウ・デー
タ構造94中の対応する諸ノードも同様にポインタ10
8、110、112によって接続されている。
【0031】図5において、データ構造中とそのシャド
ウ中のノードのインスタンスの間に1対1の対応関係が
あり、データ構造中のノードのタイプとそのシャドウ中
のノードのタイプの間にも1対1の対応関係がある。後
述するように、どちらの条件も必ずしも必要ではない。
【0032】本開示中で使用する規約として、タイプT
のノードのシャドウのタイプをT’で表すことにする。
【0033】シャドウ・マップ 好ましい実施例では、図5に示したシャドウ・データ構
造はオブジェクトによって作成され、このオブジェクト
をやはり好ましい実施例ではシャドウ・マップ・オブジ
ェクトと呼ぶ。当業者なら、この同じ作成機能を実行す
る方法が多数あることを理解するであろう。
【0034】ShadowMapオブジェクトは、元の
データ構造中のノードからシャドウ・データ構造中の対
応するノードへの遅延評価されたマッピングを提供す
る。遅延評価とは、特定のノードをシャドウするように
求めるものがない場合、シャドウ・ノードが作成されな
いことを意味する。マッピング中のエントリは、シャド
ウ・データ構造中でノードを作成するようにメソッドに
要求することにより要求に応じて生成される。これらの
メソッドをそのマップの「ファクトリ・メソッド」と呼
ぶ。ファクトリ・メソッドは、シャドウ構造の作成を望
むクライアントによって供給される。
【0035】次に図6には、図5と同じくデータ構造9
2とそのシャドウ・データ構造94が示されているが、
ここには、シャドウ・データ構造94の作成に使用され
るシャドウ・マップ122も示されている。シャドウ・
マップ122はシャドウマップ・オブジェクトによって
作成され、シャドウ対124と130、126と13
2、128と134を含んでいる。これらのシャドウ対
は、シャドウ・マップ122中に保持され、元のデータ
構造92中の各ノードをシャドウ・データ構造94中の
それに対応するシャドウ・ノードに関係付ける。
【0036】したがって、あるノードのシャドウを得る
には、ShadowMapオブジェクトにシャドウを求
め、それを当該のノードに渡すだけで十分である。内部
的に、ShadowMapオブジェクトは、シャドウ・
マップ122を検査して、要求されたノードのシャドウ
・ノードを自らが既に含んでいるかどうか調べる。含ん
でいる場合はその値がただちに戻され、そうでない場合
は、ファクトリ・メソッドを呼び出してシャドウ・ノー
ドを作成する。ファクトリ・メソッドから戻される結果
は、将来参照できるように(シャドウ・マップ122中
にポインタを記憶することにより)ShadowMap
オブジェクトによって記憶され、かつ呼出し側に戻され
る。
【0037】シャドウ・データ構造が作成された後は、
シャドウ・マップ122は他の役割を果たさない場合が
多く、削除されることさえある。あるいは、シャドウ・
マップにシャドウ・データ構造中のすべてのノードに対
するポインタを含め、したがってシャドウ・ノードが不
要になった時に削除するなど、シャドウ・ノード全体に
関する操作の実行に役立つようにすることもできる。当
業者なら、シャドウ・データ構造及びシャドウ・マップ
が任意の数の代替応用例に使用できることを理解するで
あろう。
【0038】データ構造の操作 上記の例では、シャドウ・データ構造の諸ノードが元の
データ構造のノードに非常に類似しており、そのタイプ
がシャドウ・タイプ空間に投影されたにすぎないことを
暗黙の前提にしている。しかし、そうである理由はな
い。シャドウ・ノードを生成するShadowMapオ
ブジェクト上のメソッドは、それが選ぶどんな形のシャ
ドウ・ノードも生成することができる。これらのメソッ
ドに対する唯一の制約は、元のデータ構造中の各ノード
について、シャドウ・データ構造中に対応するノードが
1つしかないということである。ただし、元のデータ構
造中のノードが対応するシャドウ・ノードをもたないこ
ともあり、その場合はシャドウ・マップは当該のエント
リ中にヌル・ポインタを含むことになる。
【0039】たとえば、各ノードに“プリント”メソッ
ドなどのメソッドを付加するためにシャドウを作成して
いるにすぎないと仮定する。この場合、シャドウ・デー
タ構造は、シャドウ空間内のノード間の関係をシャドウ
することなく、元のデータ構造中のノードに対するバッ
ク・ポインタを単に記憶することを選ぶかもしれない。
プリント・メソッドは、シャドウされているノードへの
バック・ポインタをたどることにより、印刷すべきデー
タをそのインスタンスにおいて得ることができる。必要
ならば、各シャドウ・ノードは、要求に応じて元のデー
タ構造中のノードのシャドウを再評価することにより、
そのシャドウにおいて子ノードを得ることができる。こ
のタイプのシャドウ・データ構造を図7に示す。図7で
は、元のデータ構造92とシャドウ・マップ122が示
されているが、新しいシャドウ・データ構造142は、
元のデータ構造92の対応するノードへのバック・ポイ
ンタであるノード144、146、148だけを含んで
いる。
【0040】ファクトリ・メソッドは、シャドウ・ノー
ドに関するインスタンス・データを指定するだけでな
く、諸ノードのタイプをインスタンスごとに変更するこ
ともできる。すなわち、もとのデータ構造中の2個のノ
ードを、インスタンス・データが異なるにもかかわらず
同じタイプで表すことができる。この2つのノードをシ
ャドウする際に、ファクトリ・メソッドは、インスタン
ス・データを検討し、シャドウされるノードの2つの異
なる表現のうちから選択することができる。
【0041】たとえば、シャドウされているデータ構造
が、コンパイラのフロント・エンドによって生成された
構文解析ツリーである場合、次のことが得られる。構文
解析ツリー中の2進式ノードは単一ノード・ツリーPT
_BinaryExprで表され、列挙された値は式の
演算すなわち加算、減算、乗算または除算を示す。ただ
し、コンパイラのバック・エンドは、CG_AddEx
pr、CG_SubExpr、CG_MultExp
r、CG_DivExprなど関係する演算に応じて異
なるタイプのシャドウ・ノードを生成することにより、
この1つのタイプのノードをシャドウすることを選択す
ることもできる。
【0042】すべてのデータ構造をシャドウする必要は
ない場合もそうである。コンパイラのフロント・エンド
によって生成された構文解析ツリーのケースをもう一度
考えてみる。増分式ノード生成機構は、ツリー全体では
なく1つまたは2つのメソッドについての構文解析ツリ
ー用のコードを生成する(したがって、構文解析ツリー
をシャドウする)だけでよいことがある。本発明が様々
な状況で何種類ものシャドウ・データ構造の生成にも使
用できることを当業者なら理解するであろう。
【0043】循環型データ構造と非循環型データ構造 ノードをシャドウするために、これまで述べてきた好ま
しい実施例では、クライアントが単にShadowMa
pオブジェクトにシャドウを求めるべきであり、Sha
dowMapオブジェクトは、必要ならば適当なファク
トリ・メソッドを呼び出すことによってシャドウを計算
するとしている。しかし、そのメソッドは呼び出された
場合に、しばしばShadowMapオブジェクトに元
のノードの子ノードのシャドウを求める。シャドウされ
るデータ構造が非循環型であるならば、すべてうまくい
く。
【0044】好ましい実施例では、データ構造がサイク
ルを含む場合、もう少し配慮しなければならない。具体
的には、サイクル(の可能性)がわかっていなければな
らず、サイクルを明示的に破らなければならない。図8
を参照すると、サイクル構造を含むデータ構造152が
示されている。すなわち、ノードA162がノードB1
64に接続され、ノードB164はノードC166に接
続され、ノードC166はノードA162に接続されて
いる。シャドウ・データ構造154を作成する際に、ノ
ードA162をシャドウする過程でノードB164をシ
ャドウしなければならず、それにはノードC166をシ
ャドウしなければならず、それにはノードA162をシ
ャドウしなければならない可能性があるが、それはまだ
完了していず、しがたがってシャドウ・マップで使用可
能でない。
【0045】その代わりに、ShadowMapオブジ
ェクトによって作成されたシャドウ・ノードC’172
がシャドウ・ノードA’168へのレイジー・ポインタ
178を記憶する。このレイジー・ポインタは、絶対的
に必要なときだけ実ポインタに参照解除される。具体的
には、ノードA162のシャドウ操作が完了した後での
みが参照解除でき、その場合、ShadowMapオブ
ジェクトはノードA162のシャドウ操作の結果がシャ
ドウノードA’168であるとの情報を提供することが
できる。それが実ポインタに変換された後、将来のアク
セスがポインタ自体を使用するのとほとんど同じ位速く
なるようにその値が記憶される。
【0046】好ましい実施例のC++実施態様では、そ
のサイクル内のどこかで、遅延評価された特別なタイプ
のポインタを使用する働きをする。このことは、下記の
「循環型データに対する遅延シャドウ」の節で詳しく説
明する。
【0047】本発明の構成と使用法 好ましい実施例におけるC++実施態様 本発明の好ましい実施例では、ファクトリ・オブジェク
トを呼び出し、結果をハッシュ・テーブルにキャッシュ
することによりシャドウ・マップを実施することは、継
承を考慮に入れたとき、及びC++型システムの諸規則
及び特質によって制約されるとき、複雑になる。
【0048】継承 図9を参照すると、データ構造181とそのシャドウ・
データ構造183は、継承が存在するときのシャドウ操
作を例示するものである。データ構造181において、
Bがベース・クラスであり、DがBから派生したクラス
である2つのクラスB、Dを考える。ここで宣言された
タイプB*182のポインタを含む別のクラスXを考え
る。このポインタが初期化されるとき、それはクラスB
188のオブジェクトを指すポインタで初期化されるこ
とも、クラスD184のオブジェクトを指す、タイプD
からタイプB* へ拡幅されたポインタで初期化されるこ
ともできる。
【0049】ここでシャドウ・タイプ空間183につい
て考える。B188のシャドウ・タイプをB’196、
D184のシャドウ・ノードをD’192、X182、
186のシャドウ・ノードをX’190、194とす
る。その場合、単純なシャドウ・マッピングでは、ノー
ドX190はタイプB’* 191のポインタを含むこ
とになり、このポインタはタイプB’196のオブジェ
クトを指し、ポインタが拡幅されている場合はタイプ
D’192のオブジェクトを指すようになる。
【0050】その場合の問題はオブジェクトの動的(す
なわち「真」の)タイプだけでなく、静的(すなわち
「感知される」)タイプをも正確にシャドウすることで
ある。
【0051】Shadowable,ShadowMa
p and T’::shadow 好ましい実施例では、いくつかのクラス及びメソッドが
協働してシャドウ操作機構を提供する。図10に関係す
るクラス及び主メソッドの概略を示す。
【0052】shadowable シャドウすべきノードはShadowableから継承
しなければならない。これは、ノードのシャドウをイン
スタンス化する過程で使用される重要な仮想メソッドを
提供する。 class Shadowable { public: virtual Narrowable*create_shadow(ShadowMap*map) = 0; };
【0053】シャドウすべきすべてのノードが create_
shadowの実施態様を提供しなければならないが、このメ
ソッドはクライアントによって直接呼び出されることは
ない。好ましい実施例では、この実施態様は、シャドウ
・マップ引数の適当なサブタイプ上の適当なファクトリ
・メソッドを呼び出す、ボイラープレート・コードであ
る。このボイラープレート・コードは、プログラム"a
utodefine"によって機械的に生成できる。こ
のマップ引数は、シャドウのコンテキストを提供し、同
じノードの異なるシャドウが共存できるようにする。
【0054】ShadowMap 好ましい実施例では、ShadowMapオブジェクト
がシャドウ・マップを表す。これは、マップ中のシャド
ウ・ノードをルックアップするために1つの公用メソッ
ドを有する。見つからない場合は作成する。しかし、こ
のメソッドも通常はクライアントによって直接呼び出さ
れることはない。その代わりに、クライアントは目的ク
ラス上のshadowメソッドを呼び出し、それによっ
てシャドウ・ノードへのより便利でタイプ・セーフなア
クセスが提供される。
【0055】通常は、ShadowMapに基づく継承
のレベルは2つある。第1のものは、特定のタイプのノ
ードをシャドウできる能力を定義する1組の純仮想メソ
ッドでShadowMapを拡張するものである。第2
のレベルは、それらの純仮想メソッドの実施態様を提供
するものである。 class ShadowMap { public: Narrowable*lookup_or_create_shadow(Shadowable*orig); //'orig' のシャドウ・ノードを戻す };
【0056】T’::shadow 好ましい実施例における最も重要なメソッドはT’::s
hadowである。あるノードのシャドウをクライアン
トが作成またはアクセスする主な方法だからである。こ
れは所望のタイプT’のシャドウ・ノードに対する静的
メソッドであり、タイプTのシャドウすべきノードと、
シャドウ・マップの2つの引数を取る。 staticT'*T'::shadow(T*t,ShadowMap*map);
【0057】これは、"map"に従って"t"のシャドウ
を戻す。"map"としてパスされる引数は、Tノードか
らT’ノードを生成できるマップのインスタンスである
はずである。これは、後述のようにShadowMap
の適当なサブタイプを使用することによって実施でき
る。
【0058】データ構造のシャドウ可能化 次に、好ましい実施例においてデータ構造をシャドウ可
能にするために取るべき諸ステップについて述べる。図
11に、元のデータ構造のプログラマ用のタスク流れ図
200が示されている。図11において、データ構造を
構成することになるオブジェクトを記述するために、プ
ログラマがヘッダ・ファイルを書く(204)ことから
プロセスが始まる。これらのヘッダ・ファイルは、シャ
ドウ可能オブジェクトの各タイプに"create_s
hadow"メソッドを付加するために拡張される(2
06)。ヘッダ・ファイル中で宣言されたオブジェクト
は、"Shadowable"ライブラリ・クラスから継
承することになる。データ構造はオブジェクトから構成
され、オブジェクトはメソッドを有するので、プログラ
マは次にデータ構造中のオブジェクトのメソッド用のコ
ードを書く(208)。好ましい実施例ではプログラ
ム"autodefine"を通過してヘッダ・ファイル
を走らせて、定義及びボイラープレート機能及びオブジ
ェクトを作成する(210)ことにより、一部のメソッ
ドを機械的に生成することができる。 "autodef
ine" の出力はC++コードであり、それがステップ
208からの書かれたコードと組み合わされる。プログ
ラマはまた、データ構造をシャドウしたいと思う他のユ
ーザのために特別の"ShadowMap"オブジェクト
を提供しなければならない。"ShadowMap"クラ
スはまた、ステップ210で"autodefine"に
よって生成され、その結果ヘッダ・ファイルができ、そ
れがステップ204からのヘッダ・ファイルと組み合わ
され、これらすべてのヘッダ・ファイルが他のユーザが
後で使用できるように一緒に集められる(212)。次
にすべてのヘッダ・ファイルとコード・ファイルが、コ
ンパイラによって処理されて(216)、オブジェクト
・コードを生成する。コンパイラからの出力221は、
元のプログラマにも、それからシャドウ・データ構造を
作成しない他のユーザにも使用される(218)。
【0059】好ましい実施例では、いくつかの追加コメ
ントが重要である。データ構造をシャドウ可能にするに
は、データ構造中のシャドウすべきすべてのノードが、
共通ルート・クラスから継承しなければならず、この共
通ルート・クラス自体は "Shadowable" から
継承しなければならない。"Shadowable"以外
の共通ルート・クラスを必要とすることは、シャドウ機
械の部分を自動的に生成するのに使用されるプログラ
ム"autodefine"の要件である。
【0060】シャドウすべきすべてのノードは、"Sh
adowable"から継承した抽象的"create_
shadow"メソッドを実施しなければならない。 Narrowable*create_shadow(ShadowMap*);
【0061】こうした"create_shadow"の
実施態様は、通常、それがクライアントによって直接呼
び出されないことを強調するため、シャドウすべきノー
ド上で私用メソッドとして宣言される(そのメソッド
は"Shadowable"上で公用と宣言される)。こ
の実施態様は、シャドウ・マップ引数の適当なサブタイ
プ上の適当なファクトリ・メソッドを呼び出すボイラー
プレート・コードである。このボイラープレート・コー
ドは、ユーティリティ"autodefine"によって
機械的に生成できる。
【0062】データ構造をシャドウ可能にするには、も
う一つ行わなければならないことがある。シャドウすべ
き各ノード・タイプT用の特別なメソッドを定義する "
ShadowMap" の抽象的サブタイプを提供しなけ
ればならない。 Narrowable*shadowT(T*);
【0063】これらのメソッドは、"create_s
hadow"のボイラープレート実施態様で参照され
る。
【0064】例 図12にデータ構造例230用のクラス構造が示されて
いる。このデータ構造は、タイプAのノード238、タ
イプBのノード234、タイプCのノード240、タイ
プDのノード236を含んでいる。C240はA238
から継承し、D236はA238とB234から継承す
るものとする。これら4つのクラスのスーパータイプ
を"Roman"232とする。そうすると、コード中に
次のパターンが見られると期待される。
【0065】 class Roman:public virtual Shadowable { public: // すべてのRomanノード・タイプ上のどんな総称メソッドもここで宣言でき る private: Narrowable*create_shadow(ShadowMap*); }; class A:public virtual Roman { public: // A メソッド... private: Narrowable*create_shadow(ShadowMap*); }; class B:public virtual Roman { public: // B メソッド... private: Narrowable*create_shadow(ShadowMap*); }; class C:public virtual B { public: // C メソッド... private: Narrowable*create_shadow(ShadowMap*); }; class D:public virtual A,public virtual B { public: // D メソッド... Narrowable*create_shadow(ShadowMap*); }; class Roman_ShadowMap:public virtual ShadowMap { public: virtual Narrowable*shadowRoman(Roman*); virtual Narrowable*shadowA(A*); virtual Narrowable*shadowB(B*); virtual Narrowable*shadowC(C*); virtual Narrowable*shadowD(D*); };
【0066】ルート・クラスの名前として"Roman"
が与えられているものとすると、ユーティリティ"au
todefine"は、クラス "Roman_Shad
owMap" の定義とデフォルト・メソッド本体を機械
的に生成することができる。デフォルト"Shadow
T"の詳細については後で述べる。当業者なら、この例
では「仮想継承」がスタイルとして使用されるが、必ず
しもあらゆる状況でそうである必要はないことを理解す
るであろう。
【0067】データ構造の特有シャドウの作成 どんなデータ構造をシャドウするにも、上記の規約に則
ってデータ構造を構築しなければならない。特有のシャ
ドウが作成できるための主な課題は、データ構造中のノ
ードに特有の"ShadowMap"のみでサブタイプを
実施することである。このシャドウ・マップのサブタイ
プは、下記の形のメソッドの集合体を含んでいる。 Narrowable*shadowT(T*);
【0068】これらのメソッドは、クライアントが
T’::shadow(t,map)を始めて呼び出した
ことの結果として明示的に呼び出される(その後の呼び
出しでは、シャドウ・マップにセーブされていた同じ結
果を戻すことになる)。したがって、T* 引数からT’
オブジェクトを構築することがメソッドの課題である。
これは通常、Tオブジェクトのメンバをシャドウするこ
と、それからT’オブジェクトを構築することを伴う。
【0069】シャドウ・データ構造の諸ノードを実際に
作成するファクトリ・メソッドによってシャドウ・マッ
プを実施することに加えて、シャドウ・データ構造中の
諸ノードの各クラス上でシャドウ・メソッドを宣言しな
ければならない。より正確に言うと、シャドウ・メソッ
ドは、シャドウ可能ノードのシャドウ操作の結果生成で
きるクラス上で宣言しなければならない(上記のT’::
shadowの節を参照のこと)。
【0070】シャドウされるクラスがTであり、対応す
るシャドウ・クラスがT’である場合、シャドウ・メソ
ッドは下記のように宣言される。
【0071】
【0072】好ましい実施例では、このメソッドの実施
態様はボイラープレートであり、ユーティリティ"au
todefine"によって生成できる。このユーティ
リティは、map−>lookup_or_creat
e_shadow(t)を呼び出し、その結果をタイプ
T’* となるように縮幅(narrow)する。「縮
幅」とはここでは、C++技術を指し、付録Aにその説
明がある。縮幅は、C++世界では「ダウンキャスティ
ング」とも呼ばれる。
【0073】次に図13を参照すると、既存の何らかの
シャドウ可能データ構造からシャドウ・データ構造を作
成するために後続のプログラマ250が従うプロセスが
示されている。プログラマは、シャドウ・データ構造を
構成することになるオブジェクトを記述するヘッダ・フ
ァイル254を書く。このヘッダ・ファイルは、元のデ
ータ構造のプログラマから供給されたヘッダ・ファイル
(図11の204)を参照することができる。シャドウ
・データ構造はオブジェクトから構成されるので、プロ
グラマはそれらのオブジェクトのメソッド用のコード・
ファイル256も書く。これらのコード・ファイル25
6は、元のデータ構造のプログラマから供給されるヘッ
ダ・ファイル(図11の212)を参照することにな
る。「シャドウ・ファクトリ」メソッド用のコードも書
かれる(258)。ヘッダ・ファイル254はヘッダ・
ファイル214(図11及び13)と組み合わされ、ユ
ーティリティ"autodefine"260を通過し
て、シャドウ・データ構造を作成するためのボイラープ
レート・コードを生成する。"autodefine"か
ら出力されるC++コードと新たに書かれたコード・フ
ァイル256がすべてのヘッダ・ファイルと一緒にコン
パイルされ(262)、出力されたオブジェクト・コー
ド263が供給されたオブジェクト・コード220(図
11及び13)と組み合わされ、一緒にリンクされてプ
ログラム264を形成する。
【0074】次のこのプログラムが(図13の266
で)図14の270に示すように実行される。次に図1
4を参照すると、プログラム実行中にシャドウ可能な元
のデータ構造が作成され(274)、シャドウ・データ
構造が作成され(276)、シャドウ済みデータ構造が
実行される(278)。
【0075】次に図15を参照しながらシャドウ・デー
タ構造を作成するためのサブルーチン(図14の27
6)についてより詳しく説明する。図15において、サ
ブルーチン290は呼び出されたとき(292)、シャ
ドウ・マップ及び関連シャドウ・ファクトリを既に作成
していなければ、まずそれを作成する(294)。次に
サブルーチン290は、問題の元のデータ構造ノードが
シャドウ・マップ中に登録されているかどうかを判定す
る(296)。そうである場合(299)、サブルーチ
ンは、シャドウ・マップ中に問題のノードに対して登録
された値(ポインタ)をサブルーチンの呼び出し側に戻
し(304)、終了する(306)。しかし、問題の元
のデータ構造ノードがシャドウ・マップ中に登録されて
いない場合(298)は、ノードのタイプに応じてその
ノードのcreate_shadowメソッドが呼び出
される(300)。これによってシャドウ・ノードが作
成され、結果(シャドウ・ノードを指すポインタ)がシ
ャドウ・マップに登録される(302)。次にこの値が
サブルーチンの呼出し側に戻され(304)、サブルー
チンを終了する(306)。
【0076】次に図16を参照して、create_s
hadowメソッド(図15の300)の詳細を説明す
る。図16において、create_shadowメソ
ッド310が呼び出されると(312)、この実施態様
ではまず参照ノード314の真のタイプを決定する(3
14)。シャドウ・ファクトリ上でシャドウ・ノードを
作成するために、参照されたノード・オブジェクトのタ
イプに適したメソッドが呼び出され(316)、新しく
作成されたシャドウ・ノード参照が呼出し側に戻され
(318)、create_shadowメソッドを終
了する(320)。シャドウ・ファクトリ用のメソッド
(図16の316)の詳細が図17に示されている。
【0077】図17において、シャドウ・ファクトリ・
メソッド330は、呼び出されると(332)、シャド
ウ可能ノードを検査して、シャドウすべき特定のノード
の子ノードがあるかどうか調べる(334)。あれば、
サブルーチンを実行して、元のデータ構造336の子ノ
ードのシャドウ・ノードを作成する(336)。その際
に、このステップで、ループを実行するかどうか決定
し、後での処理のために引数を記録する。最後に、この
シャドウ・ファクトリ実施態様では、シャドウされた子
とシャドウ可能ノードからの他のシャドウ不能情報とか
らシャドウ・ノードを作成し(338)、終了する(3
40)。
【0078】例:シャドウ・メソッドとシャドウ・ノー
ドを生成する方法 "Roman"から継承するクラスA、B、C、Dに関す
る上記の例を続けて共通ルート・ノード"Greek"を
有するノードAlpha、Beta、Gamma、De
ltaに関するシャドウを作成したものとする。例とし
て"Alpha"を取り上げると、その「シャドウ」メソ
ッドは次のように定義できる。
【0079】
【0080】ここで、クラス"Roman_Shado
wMap"の実施態様である "GreekFromRo
man_ShadowMap" のようなファクトリ・ク
ラスの定義が必要である。そのクラスは、ルート・ノー
ド"Roman"の様々なサブタイプ用の抽象的(または
省略的)「シャドウT」メソッドを宣言するだけである
ことも留意されたい。このクラスは、作成すべきシャド
ウ・ノードのタイプに関するどんな知識を具体化したも
のではなく、その知識はGreekFromRoman
_ShadowMapの諸メソッドの実施態様中で具体
化される。クラスGreekFromRoman_Sh
adowMapの定義は次のような形になる。
【0081】 class GreekFromRoman_ShadowMap: public virtual Roman_ShadowMap { public: // Roman_ShadowMapメソッドはこのクラスによって定義される Narrowable *shadowA(A *); Narrowable *shadowB(B *); Narrowable *shadowC(C *); Narrowable *shadowD(D *); }:
【0082】継承されるシャドウ・マップが純粋な仮想
メソッドのみを有する場合、それらのメソッドはすべて
ここで実施する必要がある。デフォルト実施態様がある
場合は、ここですべてのメソッドを実行する必要はな
い。シャドウ・マップのデフォルト・ファクトリ・メソ
ッドについては以下で説明する。
【0083】使用できるパラダイムはいくつかあり、以
下の例は、使用できる技法の例示にすぎない。特定の状
況でどのパラダイムが適切かは、好みの問題であり、シ
ャドウィング・コードをどうグループにまとめるか、全
部一緒か、あるいはシャドウすべきノードのコードによ
ってかの考慮にもよる。
【0084】シャドウ・ノード用のファクトリ・メソッ
ド内部でのインスタンス・データのシャドウ操作 AオブジェクトをAlphaオブジェクトにシャドウし
たいものとし、Aオブジェクトが、タイプB*とC*の2
つのメンバを有し、その両方がAlphaオブジェクト
にシャドウされるものとする。次に適当なアクセス機能
とコンストラクタを仮定すると、ファクトリ・メソッド
は次のように書くことができる。
【0085】 Narrowable*GreekFromRoman_ShadowMap::shadowA(A*a) { Beta*beta = Beta::shadow(a->get_b(),this); Gamma*gamma = Gamma::shadow(a->get_c(),this); return new Alpha(beta, gamma); };
【0086】このメソッドは、Aの子メンバ用のシャド
ウ機構を繰り返して呼び出し、結果に対するコンストラ
クタを呼び出すことによって、Aの子メンバをシャドウ
する。シャドウ・ノード中で子が必要でない場合は、す
べての子をシャドウする必要はない。一部のメンバはシ
ャドウ可能でないこともある。たとえば、基本タイプ、
列挙値、ストリングなどがそうである。これらのメンバ
は直接シャドウ・ノードにコピーすることもでき、また
元のノードに対するバック・ポインタをシャドウ中に記
憶して、バック・ポインタをたどってこれらのメンバの
所でシャドウを得ることができるようにすることもでき
る。それらをどんな形で記憶するかの決定は、空間とア
クセス時間を考慮に入れて行うべきである。
【0087】元のノードのすべてのメンバーがシャドウ
できないのと同様に、シャドウ・ノードのすべてのメン
バが元のノードからメンバをシャドウした結果ではな
い。バック・ポインタの記憶は非常に簡単な例である。
あるいは、シャドウ・ノードの一部のメンバは、元のノ
ードの1つまたは複数のメンバに関する複雑な表現を計
算しキャッシュ記憶した結果である。
【0088】シャドウ・ノード用のコンストラクタ内部
でのインスタンス・データのシャドウ操作 ファクトリ・メソッドにおいて子をシャドウする代わり
に、シャドウ・ノード自体のコンストラクタ中でシャド
ウ操作を行うこともできる。
【0089】 Narrowable *GreekFromRoman_ShadowMap::shadowA(A *a) { return new Alpha(a,this); }; Alpha::Alpha(A*a,Roman_ShadowMap*map) :beta(Beta::shadow(a->get_b0,map)), gamma(Gamma::shadow(a->get_c0,map0) { };
【0090】コンストラクタ中でシャドウ操作を実行す
ると、変換コードがAlpha用のコードの残り部分の
近くに維持されるが、ファクトリ中でシャドウ操作を実
行すると、(すべてのクラスの)シャドウイング・コー
ドがすべて一緒にグループ化される。
【0091】シャドウ・ノードの静的メソッド内部での
インスタンス・データのシャドウ操作 ファクトリ・メソッドにシャドウ・ノード用のコンスト
ラクタを呼び出させることは、"new Alpha.
(.. .)"の呼出しによって示されるようにシャド
ウ・タイプが実際に何であるかをファクトリが正確に知
っていることを暗示する。もう1つの解決策は、Alp
haクラス上で静的createメソッドを使用するも
のである。こうすると、具体的タイプの知識に縛られず
にファクトリ・コードが簡単になる。
【0092】
【0093】例:異なるタイプのシャドウ・ノードの生
成 2進操作に応じて異なるいくつかのタイプの1つにシャ
ドウされるタイプPT_BinaryExprのコンパ
イラパーサツリー・ノードに関する上記の例があった。
シャドウ・クラスにおける静的createメソッドを
使ってそれを実施する方法は次の通りである。
【0094】 CG_Expr*CGBinaryExpr::create(PT_BinaryExpr*be,PT_ShadowMap*map) { CG_Expr*left=CGExpr::shadow(be->get_left(),map); CG_Expr*right=CGExpr::shadow(be->get_right(),map); switch(be->get_op0){ case Op::Add: return new CG_AddExpr(left,right); case Op::Sub: return new CG_SubExpr(left, right); case Op::Mult: return new CG_MultExpr(left,right); case Op::Div: return new CG_DivExpr(left,right); default: should_not_happen(); } };
【0095】このメソッドの本体は、ファクトリ・メソ
ッドshadowPT_BinaryExprに入れる
こともできることに留意されたい。コードをどこに置く
かの選択は主としてスタイルの問題であるが、それをP
T_BinaryExpr上のメソッドにすることによ
り、より精巧な例で、私的にしかアクセス可能でないか
もしれないクラス中で定義された他のメソッドを利用で
きるようにすることも可能である。
【0096】循環データ用の遅延シャドウ 上記のシャドウを作成する様々な例では、プリミティブ
操作T’::shadowも使用した。上記の説明で指摘
した通り、これは、シャドウ上でシャドウされるノード
のすべての子に対する反復呼出しを起こす可能性が高
い。その当然の結果として、ノードをシャドウする際
に、そのノードのすべての子の推移閉鎖もシャドウされ
ることになる。データ構造が非循環型ならばこれはうま
くいく。データ構造が循環型の場合は、反復処理シェー
マが終了せず、最終的にメモリを使い尽くすことにな
る。
【0097】「遅延シャドウ」はこれらの問題を避ける
方法を提供する。これは、データがサイクルを有する
(または有する可能性がある)場合に使用すべきであ
る。また、データ構造のすべてを公然とシャドウする必
要がない場合、あるいは望ましくない場合にも使用でき
る。
【0098】シャドウすべきノードのタイプがT、Tの
シャドウ・ノードのタイプがT’である場合、Lazy
Shadow<T’,T>はT’::shadowを遅延
評価するスマート・ポインタ用のテンプレートである。
このスマート・ポインタは、T’::shadow用の2
つの引数、すなわちT* ポインタとShadowMap
* で初期化される。このスマート・ポインタはT’ポイ
ンタに割り当てることができ、T’ポインタとして透過
的に参照解除することができる。このどちらの操作によ
ってもシャドウが評価される。遅延シャドウを使わずに
書かれた下記のコードについて考えてみる。
【0099】 Narrowable*GreekFromRoman_ShadowMap::shadowA(A*a) { return new Alpha(a,this); } class Alpha { public: Alpha::Alpha(A*a,Roman_ShadowMap*map); void print(); private: Beta*beta; Gamma*gamma; }; Alpha::Alpha(A*a,Roman_ShadowMap*map) : beta(Beta::shadow(a->get_b(),map)), gamma(Gamma::shadow(a->get_c0,map0) { } void Alpha::print() { Beta*beta2 = beta; gamma->print(); };
【0100】何らかの理由でクラスAlphaの子ノー
ド用に遅延シャドウを使用することが必要に、または望
ましくなった場合、コードは次のように変わる。
【0101】 class Alpha { public: Alpha::Alpha(A*a,Roman_ShadowMap*map); void print(); private: LazyShadow<Beta,B>beta; //was Beta*beta; LazyShadow<Gamma,C>gamma; //was Gamma*gamma; }; Alpha::Alpha(A*a,Roman_ShadowMap*map) :beta(a->get_b0,map), //shadow call removed gamma(a->get_c0,map0 //shadow call removed { }
【0102】メソッドGreekFromRoman_
ShadowMap::shadowAは変化しないまま
である。Alpha::printの実施態様も変化しな
いままである。betaはトランスペアレントにBet
a* ポインタに変換しBeta* ポインタとして使用す
ることができ、同様にgammaはGamma* ポイン
タに変換できるからである。betaが最初にBeta
* ポインタに変換されるとき、Beta::shadow
(a−>get_b(),map)の呼出しが最終的に
起こるが、その後のbetaの使用ではその呼出しを迂
回し、評価済みポインタを使用する場合とほぼ同じ速さ
になる。
【0103】データ構造のシャドウのインスタンス化
(あるいは、最終クライアントが実際に知る必要がある
こと) 好ましい実施例でデータ構造のシャドウをインスタンス
化するのに必要な装置の大部分が既に示されている。当
業者なら、いくつもの代替実施例を理解するであろう。
ただし、好ましい実施例ではその他に、データ構造をシ
ャドウするためにクライアントは次のものを必要とす
る。 シャドウすべきデータ構造またはシャドウすべきデータ
構造の一部分を指すルート・ポインタ 適切なシャドウ・タイプ空間用のシャドウ・マップ・サ
ブタイプ
【0104】シャドウをインスタンス化するために使用
される典型的コード・シーケンスは次の通りである。 A*a=... //get pointer to data structure to be shadowed Roman_ShadowMap*map=new GreekFromRoman_ShadowMap; Alpha*alpha=Alpha::shadow(a,map); //that's all there is to it
【0105】これは次のように動作する。シャドウすべ
きノードを指すポインタを得た後、コードはShado
wMapの適切なサブタイプのインスタンスを作成し、
次いでシャドウされるノードの子メンバをシャドウする
際に既に見たものと全く同じメソッドを使って、ルート
・ポインタを単にシャドウする。その結果、alpha
がGreekFromRoman_ShadowMap
オブジェクトによって定義されるシャドウ・データ構造
を指すルート・ポインタとなる。
【0106】ノードはシャドウされた後、マップがいつ
削除できるかに関して、GreekFromRoman
_ShadowMapの指定に依存する。alphaシ
ャドウ・ノードが内部的遅延シャドウを含まず、マップ
に対する他の暗示的依存関係がないと、完全に評価され
た場合、そのマップは実際に削除できる。ただし、クラ
イアントは、マップを他のノードをシャドウするのに使
用可能な状態に保つことを選ぶこともでき、その場合
は、マップ中のセーブされたエントリの一部または全部
が以降のシャドウ操作をスピードアップすることができ
る。
【0107】好ましい実施例に関する追加情報 上記の開示では、機構全体の概要、及びデータ構造をシ
ャドウ可能にし、かつ実際にシャドウを作成するために
必要なことの詳細を示した。本節では、好ましい実施例
においてコードの様々な要素を一緒にするのに必要なグ
ルー・コードについて述べる。
【0108】前ページのコード例の2行の実行に続い
て、以下を実行する。 Roman_ShadowMap*map=new GreekFromRoman_ShadowMap; Alpha*alpha=Alpha::shadow(a,map); //that's all there is to it
【0109】シャドウ・マップの作成 新しいGreekFromRoman_ShadowM
apの呼出しにより、romanノードのgreekシ
ャドウを生成するのに使用できるShadowMapの
サブタイプの実施態様のインスタンスが構築される。こ
の呼出しにより、ShadowMapベース・クラス中
のテーブルが自動的に初期化される。このテーブルは、
そのサブタイプによって供給されるファクトリ・メソッ
ドを呼び出した結果をキャッシュ記憶するために使用さ
れる。
【0110】シャドウ・ノードの作成 シャドウ・ノードは、必要なタイプ上でシャドウ・メソ
ッドを呼び出すことによって作成される。これはクラス
・スタティック・メソッドであり、その実施態様は次の
形をとる。 T'*T'::shadow(T*x,TRoot_ShadowMap*m) { return T'::narrow(m->lookup_or_create_shadow(x)); }
【0111】“m−>lookup_or_creat
_shadow(x)”の呼出しにより、マップがxの
シャドウについて照会される。マップは実際に必要なタ
イプを知ることはできないので、lookup_or_
create_shadowの結果は、タイプNarr
owable* のものである。したがって、T’::na
rrowを呼び出すことによって、この結果が正しいタ
イプに縮幅される。シャドウが正しく作成されたとする
と、これは必要な結果を与える。そうでないとゼロが戻
される。
【0112】シャドウ作成中のサイクル検出を処理する
ためのいくつかの些細な複雑さを無視すると、look
up_or_creat_shadowの呼出しは、そ
の引数に対するシャドウ・ノードが既に登録されている
かどうか検査し、登録されていない場合はシャドウ・ノ
ードを作成するためのステップを講じる。幾分簡略化し
たコードは次のようになる。
【0113】 Narrowable*ShadowMap::lookup_or_create_shadow(Shadowable*sp) { Narrowable *np; if(sp==0)return 0; if(!tbl->get_shadow(sp,np)){ np=sp->create_shadow(this); tbl->set_shadow(sp,np); } return np; }
【0114】上記のことをさらに説明する際に以下の注
が重要である。 tb1 これはlookup_or_create_shado
wへの以前の呼出しの結果を含むテーブルを表す。
【0115】tb1−>get_shadow(sp,
np) これはspのシャドウをルックアップし、npを設定
し、それが見つかった場合はTRUEを戻し、そうでな
い場合はnpだけを残してFALSEを戻す。
【0116】tb1−>set_shadow(sp,
np) これは、npをspのシャドウとして記録する。
【0117】説明を要する重要行は次のものである。 np=sp−>create_shadow(thi
s); これは、シャドウ機構が、オブジェクトの知覚されるタ
イプとは無関係にシャドウ・ノードの適切なタイプを正
しく作成するための手段である。クライアントはB* ポ
インタを有することができ、これは実際にはDオブジェ
クトを指す。とはいえ、クライアントは当然Beta::
shadow(b,map)を呼び出すことができ、B
etaオブジェクトを受け取ると期待するが、シャドウ
されるオブジェクトの実際のタイプはDであり、シャド
ウ・ノードの実際のタイプはDeltaでなければなら
ない。
【0118】create_shadowは、シャドウ
されるノードの仮想メソッドである。これはシャドウさ
れるオブジェクトの各タイプごとに実施され、次のよう
な形をとる。
【0119】 Narrowable*D::create_shadow(ShadowMap*map) { Roman_ShadowMap *m=Roman_ShadowMap::narrow(map); return m->shadowD(this, map); }
【0120】引数はShadowMap* タイプのもの
だけで、Roman_ShadowMap* タイプのも
のではないことに留意されたい。これは、create
_shadowが、ShadowMapについてだけ知
っているShadowableから継承されることの残
念な結果である。
【0121】sp−>create_shadow(t
his)が呼び出されると、そのcreate_sha
dowの実施態様においてはメッセージをオブジェクト
の真のタイプが受け取る。この真のタイプの知識は、真
のタイプに特有のメソッドを呼び出すことによってマッ
プ上に渡される。これがこの呼出しの目的である。m->s
hadowD(this)
【0122】これはRomanノード(D)をシャドウ
するための呼出しなので、Roman_ShadowM
ap上のメソッドであり、それがコードの前行での「狭
い」呼出しの理由である。マップは、知られてもいず必
要ではないので、シャドウ・マップの実際の実施タイプ
に縮幅されず、様々なタイプをシャドウするために抽象
メソッドを定義するタイプに縮幅されるだけであること
に留意されたい。
【0123】通常、m−>shadowD(this)
の呼出しは、Dノードを適切なシャドウ・タイプにシャ
ドウする方法の知識を提供するRoman_Shado
wMapのサブタイプによって実施される。この例で
は、呼出しは、GreekFromRoman_Sha
dowMap::shadowDによって処理されるが、
これについては既に見た(上記のshadowAの実施
態様についての議論を参照のこと)。
【0124】マップ上でのシャドウ呼出しの結果はNa
rrowable* タイプのものである。この結果はS
hadowMap::lookup_or_create
_shadowに戻される。これはその値を将来使用で
きるようにセーブし、それをやはりNarrowabl
e* として目的タイプ上のシャドウの元の呼出しに戻
す。これは、戻された値を適切なタイプに縮幅しようと
試みる。狭い呼出しが成功した場合、クライアントは、
望んでいた値を有する。そうでない場合はゼロが戻され
るが、それはシャドウされる項目自体がゼロであったこ
と、あるいはその項目が要求されたタイプにシャドウで
きないことを意味するものと解釈すべきである。この2
つのケースを区別することが重要である場合、クライア
ントは、シャドウされる項目がゼロか否かを容易に検査
することができる。
【0125】継承及び拡幅されたポインタを前にして何
が起こるかを検査する価値がある。クライアントがその
手にDオブジェクトを指すB* ポインタを有するとす
る。B* ポインタとして、シャドウがBeta* ポイン
タであることが期待される。したがって、Beta::s
hadow(b,map)が呼び出される。これがb上
の最初のシャドウ呼出しであるとすると、Shadow
Map::lookup_or_create_shad
owはb上のcreate_shadowを呼び出し、
これは真のタイプDにより仮想機能ディスパッチを介し
て処理される。これはshadowDに対するファクト
リを呼び出す。したがって、正しいシャドウ・タイプの
シャドウ・ノードが作成される。シャドウ・ノード(た
とえば、Delta* )を指すポインタはNarrow
able* として戻され、Beta::shadow用の
コード中でBeta*に縮幅される。したがって、ノー
ド・タイプとシャドウ・ノード・タイプの間でのマッピ
ングが、関係ある真のタイプのオブジェクトでも知覚さ
れるタイプのオブジェクトでも維持される。
【0126】誰が何をするか ここに開示するシャドウ・システムには異なる多くの部
分があり、好ましい実施例では様々な部分用のコードが
異なる様々な作成者の責任である。少なくとも3人の作
成者が関与する。標準シャドウ・コードの作成者と、シ
ャドウされるデータ構造の作成者と、シャドウ・データ
構造自体の作成者である。
【0127】さらに、一部のコードは、autodef
ineと呼ばれる特殊なユーティリティによって機械的
に生成できる。このautodefineについては図
18並びに付録Bに説明がある。付録Aにも、好ましい
実施例で使用されるNarrow実施態様に関する追加
の説明情報がある。図19を参照すると、テーブルに、
シャドウ・システムの様々な構成要素が記述してあり、
好ましい実施例における様々な部品の責任が同定してあ
る。
【0128】シャドウ・マップ上のデフォルト・ファク
トリ・メソッド 上記の好ましい実施例の開示では、データ構造をシャド
ウ可能にするのに必要な措置について述べ、シャドウす
る必要のあるデータ構造中の各クラスT用のshado
wTメソッドを宣言したShadowMapのサブタイ
プの必要性を導入した。
【0129】上記の開示では、これらのメソッドが純粋
な仮想メソッドであり得ること、及びそのクラスがau
todefineによって自動的に生成できることを指
摘した。次にShadowMapサブタイプ上のデフォ
ルト・メソッドがどのように有利に使用できるかを例示
する。
【0130】これまでの例では、データ構造の各タイプ
がシャドウ・データ構造中の対応する1つまたは複数の
タイプを有することを示唆した。1−1マッピングと1
−多数マッピングの両方の例を示した。ただし、多数−
1マッピングも(さらには多数−多数マッピングも)可
能である。
【0131】図20に示した継承階層370を考えてみ
る。ノードA373、B376、C378はRoman
372から継承し、ノードC1 380、C2 382、
C3384はC378から継承する。
【0132】これらのデータ・タイプから構築されたデ
ータ構造の特定のシャドウについて、タイプC1 38
0、C2 382、C3 384におけるすべての情報を
シャドウする必要がない場合があり得る。すなわち、C
378オブジェクトとして有する特性をシャドウするだ
けで十分なこともある。言い換えれば、C1をGamm
a1に、C2をGamma2に、C3をGamma3に
シャドウする代わりに、すべてのCノードをGamma
ノードにシャドウしたいものとする。
【0133】これらのタイプのノードをGammaノー
ドにシャドウしたいので、Gamma::shadow
(C*,Roman_ShadowMap*)を呼び出す
のが適当である。これがC* 引数上での最初のシャドウ
呼出しであるとすると、これは仮想create_sh
adowメソッドを通して呼び出し、その呼出しが真の
タイプのオブジェクトC1、C2またはC3によって受
け取られる。どのタイプが呼出しを受け取ろうと、それ
をファクトリ上の適切なメソッドshadowC1,s
hadowC2またはshadowC3に渡す。
【0134】Roman_ShadowMap上のメソ
ッドがすべて純粋な仮想メソッドである場合、それらは
すべて、特定のシャドウ用に使用される実際のマップに
よって別々に実施されなければならない。しかし、Ro
man_ShadowMap上のメソッドがデフォルト
実施態様を有する場合は、使用される実際のマップ中で
オーバーライドされる必要はない。この場合、望まれる
ことはshadowC1,shadowC2、shad
owC3のすべてがshadowCに委任することであ
る。すなわち使用される実際のマップ中で、shado
wCのみを提供すればよく、これはCであれ、C1、C
2またはC3オブジェクトであれ、任意のCオブジェク
トをシャドウするために必要なことを行うことができ
る。
【0135】この原理に基づいて、この実施例では、T
Rootから継承するタイプの集合体用のTRoot_
ShadowMapを生成する際に以下の規則がaut
odefineによって実施される。各shadowT
メソッド用のデフォルト実施態様は、単独継承の場合に
は直接親のタイプに、多重継承の場合は、一番左の直接
の親のタイプに委任することである(好ましい実施例に
おけるautodefineには、TRoot_Sha
dowMapクラス上のメソッドを純粋な仮想メソッド
にするオプションもある。また、好ましい実施例におい
ては、autodefineは継承したテンプレート・
タイプに気がつかないことに留意されたい)。1つの例
外はshadowTRootメソッドであり、オーバラ
イドされない場合はすべてのメソッドが最終的にこれに
委任し、このメソッドは呼び出された場合、打ち切られ
る。それをオーバーライドすることにより、あるいはT
Rootのインスタンスが割り振られず、TRootの
すべてのサブタイプがマップ中の適切なshadowT
メソッドをオーバーライドし終わるようにすることによ
って、この打切りが呼び出されないようにすることはク
ライアントの責任である。
【0136】シャドウのシャドウ 一部のシャドウ・データ構造がシャドウされて新しいデ
ータ構造をもたらす場合、その新しいデータ構造がそれ
自体シャドウ可能でない理由はない。必要なことは、新
しいデータ構造中の基本ノードの基本タイプがshad
owableから継承し、それらのノードがcreat
e_shadowを実施することだけである。
【0137】一連のシャドウを使用して、(たとえば)
コンパイル・パイプラインに関与する構文ツリーから機
械コード命令への変換を表すことができる。この場合、
各ステージでシャドウ・ノードを製作するジョブは恐ら
く些細ではないが、これが行えない固有の理由はない。
【0138】これの変形は、呼び出されると異なるデー
タ構造を作成させるメソッドをシャドウが提供し、その
結果、得られるこのデータ構造自体がシャドウ可能とな
ることである。
【0139】シャドウ呼出しへの追加パラメータのパス ノードをシャドウする際に、シャドウ・ノードを製作す
る呼出しに追加情報を渡すことができると役立つことが
ある。それは、(ウィンドウ・ハンドルやエラー・スト
リームなど)シャドウ全体によって大域的に必要とされ
る情報でも、特定のタイプ及び特定のシャドウ呼出しに
よって必要とされるものでもよい。
【0140】これが必要な場合、そのような情報はSh
adowMapの実際の実施態様のインスタンス・デー
タとして記憶することができる。すなわち、後で呼び出
されるshadowTのどの呼出しにおいてもその情報
が使用可能である。
【0141】シャドウ操作プロセスにとって大域的な情
報は、マップの構築時にマップ中にインスタンス・デー
タとして記憶することができる。ノードごとに必要とさ
れる情報はやや多くの配慮を必要とする。その容易な解
決法は、シャドウ操作プロセス全体を通じて追加インス
タンス・データを直接にアクセスさせ修正させる、アク
セス・メソッドをファクトリ上で提供するものである。
しかし、この技法を使用する場合、プログラマ・エラー
が検出されないという重大な可能性がある。以下のシナ
リオを考えてみる。
【0142】Tx’::shadow(Tx*X,TRo
ot_ShadowMap*map)のある呼出しの内
部で マップ:map−>set_data(d)の上でイン
スタンス・データdを設定する。ある子yをシャドウす
るためにTy’::shadow(y,map)を呼び出
す。
【0143】問題は、Ty’::shadow(y,ma
p)の最終呼出しがデータdを見ることが本来は保証さ
れないことである。何らかのプログラマ・エラーによっ
てシャドウ呼出しが既に値yについて実行されていた場
合、マップ中にあるエントリが存在し、後続の呼出しは
その値を戻し、ファクトリ・メソッドを通過してそのデ
ータを拾い上げることはしない。さらに、クライアント
がデータを設定するため及び所望のノードをシャドウす
るために2つのメソッドを呼び出さなければならないと
いうのはスマートではない。必要なことは、より使いや
すく、より良い意味論的保証を与えるやや異なる機構で
ある。
【0144】好ましい実施例では、解決法は、単一操作
でインスタンス・データを設定し、かつノードをシャド
ウする、メソッドをマップ上で提供するものである。こ
れらのメソッドの理由は追加のシャドウ特有パラメータ
を有することなので、これらのメソッドは、シャドウ・
マップの実施態様上で直接に定義されるメソッドであ
り、継承されることはない。たとえば、上記の行を以下
に定義するメソッドによって置き換えることができる。
【0145】
【0146】Ty’* create_Ty_shado
w(Ty*y,Data*d)の実施態様は、インスタン
ス変数data_for_create_Ty_sha
dowを設定することができ、次ぎにシャドウを作成さ
せなければならない。これは、Ty’::shadow
(y,map)を明示的に呼び出すことによってそれを
行うことができるが、より適した別のメソッドがSha
dowMap上にある。Ty’::shadow(y,m
ap)は内部的にTy’::narrow(map−>l
ookup_or_create_shadow
(y))を呼び出し、先に見たようにこれはマップ中に
記憶された値がある場合はそれを返す。代替方法は、T
y’::shadow(y,map)の呼出しをy’=T
y::narrow(map−>create_shad
ow(y))によって置き換えるものである。
【0147】map−>lookup_or_crea
te_shadow(y)の呼出しは、子メソッドma
p->create_shadow(y)への呼出しによ
って置き換えられている。この子メソッドはやはりマッ
プ中でyをルックアップするが、今度はそこに値が記憶
されていないことを検査するためである。値が見つかっ
た場合は実行時エラーである。エントリが見つからない
と仮定すると、コードはy−>create_shad
ow(map)を内部的に呼出し、これは前と同様にマ
ップ上のshadowTメソッドの1つにコールバック
する。これらのshadowTメソッドはすべてデータ
dへのアクセス権を有し、ノードのタイプとクライアン
トから渡されたコンテキスト情報とに基づいてシャドウ
・ノードを正しく製作することができる。
【0148】create_Ty_shadowの名前
はシャドウ・マップ実施クラス、この場合はTRoo
t’_from_TRoot_ShadowMapの作
成者の選択による。これは実施クラスに特有のものであ
り、継承されることはない。実施クラスがさらに多くの
タイプをシャドウするために実施継承によって拡張され
る場合は、それをオーバーロードされた名前にはしない
ことが提案されている。
【0149】本発明を特定のオペレーティング・システ
ム、コンパイラ、プログラム・コード機構、オブジェク
ト及びオブジェクト参照定義に関して説明してきたが、
本発明は所与のオペレーティング環境内のいくつかの変
形のうちのどれでも、また異なるオペレーティング・シ
ステムやオブジェクト・システム環境でも実施できるこ
とを当業者なら理解されよう。同様に、例示した特定の
コンピュータ・クライアントとサーバの構成または組合
せは、本発明を使用できるそのような多くのクライアン
トとサーバの構成及びオブジェクトとサブオブジェクト
の関係の1つを表すのにすぎない。さらに、図は例示の
ためのものにすぎず、本発明に対する制限と見なすべき
ではないことも理解されよう。ここに開示したシャドウ
技法のいくつかの追加の適用例には次のものが含まれ
る。
【0150】コンパイラのASGを、コード・ジェネレ
ータの要件により一致するデータ構造でシャドウするこ
とができる(たとえば、ノードによって表されるプログ
ラムの断片を機械コードに変換するための追加メソッド
をノードに付加することができる)。
【0151】コンパイラのASGを、プログラムに対す
る走査能力を提供するデータ構造でシャドウすることが
できる。
【0152】コンパイラのASGを、ASGを編集可能
にするデータ構造でシャドウすることができる。シャド
ウ・ノードは、それらのノードの何らかのテキスト表現
を含むことになり、そのテキストは編集してASGに逆
解析することができる。
【0153】コンパイラのASGを、プログラム実行の
ためインタープリタへの入力として使用できるデータ構
造でシャドウすることができる。
【0154】集積回路設計用のシェマティックは、タイ
プ付きオブジェクトの接続された集合体として表すこと
ができる。このようなデータ構造をシャドウ可能にし
て、拡張可能なツールの集合体がデータ構造を操作でき
るようにすることができる。たとえば、異なる製造工程
用の様々な設計規則チェッカなどのツールが使用でき
る。もう1つの例として、データ構造を、特定のチップ
製造工場に必要な情報を表すデータ構造の形にシャドウ
することができる。
【0155】今日ではワード・プロセッサが複雑な構造
の文書を操作している。文書構造をシャドウ可能にする
ことにより、文書を処理するための様々なツールを1つ
のワード・プロセッシング・プログラムに組み込まずに
付加することができる。そのようなツールは、スタイル
・チェッカ、スペル・チェッカ、相互参照プログラム、
インデックス構造、及び他のワード・プロセッシング・
プログラム用のフォーマットへの変換がある。
【0156】シャドウ技法のこうした可能な用途は、こ
こに開示するシャドウ機能の可能な用途をいかなる形で
も制限するものではなく、いくつかの例を表すものにす
ぎず、当業者なら単に例示的なものであると理解されよ
う。
【図面の簡単な説明】
【図1】 例示的コンパイラを示す図である。
【図2】 例示的構文ツリーを示す図である。
【図3】 構文ツリー(3a)とそれに対応するデータ
構造(3b)を示す図である。
【図4】 例示的コンピュータ・ワークステーションを
示す図である。
【図5】 単純データ構造とそのシャドウを示す図であ
る。
【図6】 単純データ構造とそのシャドウを示し、シャ
ドウ・マップを示す図である。
【図7】 バック・ポインタを使ったシャドウ・データ
構造のサイズの縮小を示す図である。
【図8】 シャドウ操作のサイクルを示す図である。
【図9】 継承の存在下でのシャドウ操作を示す図であ
る。
【図10】 シャドウを実施するのに使用される一次ク
ラス及びメソッドを示す図である。
【図11】 第1のプログラマのタスク流れ図である。
【図12】 データ構造例のクラス構造を示す図であ
る。
【図13】 第2のプログラマのタスク流れ図である。
【図14】 第1のプログラマと第2のプログラマの協
力によって書かれたプログラムのタスク流れ図である。
【図15】 シャドウ可能データ構造の任意のノードを
シャドウ操作するためのサブルーチンの流れ図である。
【図16】 あるノードに関するシャドウ作成メソッド
の流れ図である。
【図17】 シャドウ・ファクトリでシャドウ・ノード
を作成するための例示的方法を示す図である。
【図18】 autodefineプログラムの流れ図
である。
【図19】 シャドウ・データ構造を作成するための例
示的実施責任を示す図である。
【図20】 例示的継承データ構造を示す図である。
【符号の説明】
92 単純データ構造、 94 シャドウ・データ構
造、 96 タイプAノード、 97 タイプBノー
ド、 98 ポインタ、 99 タイプCノード、10
1 ポインタ、102 ポインタ、106 タイプA’
ノード、107 タイプB’ノード、108 ポイン
タ、109 タイプC’ノード、110 ポインタ、1
12 ポインタ、122 シャドウ・マップ。
───────────────────────────────────────────────────── フロントページの続き (72)発明者 マイケル・ジェイ・デイ アメリカ合衆国 94041 カリフォルニア 州・マウンテンビュー・マウンテンビュー アヴェニュ・372 (72)発明者 セオドア・シイ・ゴールドステイン アメリカ合衆国 94306 カリフォルニア 州・パロ アルト・ラ パラ アヴェニ ュ・875 (72)発明者 マイケル・ジェイ・ジョルダン アメリカ合衆国 94306 カリフォルニア 州・パロ アルト・ジョシーナ アヴェニ ュ・784

Claims (9)

    【特許請求の範囲】
  1. 【請求項1】 シャドウすべきオブジェクトのシャドウ
    を作成する働きをするメソッドをシャドウすべきオブジ
    ェクトの各タイプに付加するために、第1のヘッダ・フ
    ァイルを拡張するステップと、 前記第1ヘッダ・ファイルを走査して、標準メソッドの
    宣言を探し、前記標準メソッドが見つかった場合は、前
    記宣言の対応する標準定義を生成するステップと、 前記第1ヘッダ・ファイルを後で使用出来るように集め
    るステップと、 第1コード・ファイル及び前記第1ヘッダ・ファイルを
    コンパイルして、前記第1コード・ファイル及び前記第
    1ヘッダ・ファイルに対応する第1オブジェクト・コー
    ドを生成するステップと、 集めた前記第1ヘッダ・ファイルを後で使用できるよう
    に前記第1オブジェクト・コードと組み合わせて、シャ
    ドウ可能データ構造を処理するための機構を形成するス
    テップとを含むコンピュータ実施方法。
  2. 【請求項2】 シャドウ・データ構造を構成することに
    なるオブジェクトを記述する第2のヘッダ・ファイルを
    書くステップと、 シャドウ・データ構造を構成することになる前記オブジ
    ェクトのメソッド用の第2コード・ファイルを書くステ
    ップと、 前記第2ヘッダ・ファイルと前記第2コード・ファイル
    と前記第1ヘッダ・ファイルを組み合わせて、第1のフ
    ァイル組合わせを形成するステップと、 前記第1ファイル組合わせをコンパイルして、前記第1
    ファイル組合わせに対応する第2のオブジェクト・コー
    ドを生成するステップと、 前記第1オブジェクト・コードと前記第2オブジェクト
    ・コードをリンクして第1のプログラムを形成し、前記
    第1プログラムを実行するステップとをさらに含む請求
    項1に記載のコンピュータ実施方法。
  3. 【請求項3】 第1データ構造を供給するステップと、 第2データ構造用の要素を作成し、かつ前記要素を識別
    するポインタ機構を作成して記憶する働きをするプログ
    ラムを呼び出すことにより、前記第1データ構造に関係
    する第2データ構造を構築するステップと、 前記プログラムを使用して、前記ポインタ機構により前
    記第2データ構造中の要素を前記第1データ構造中の対
    応する要素に関係付けるステップとを含み、 前記ポインタ機構のうちの第1のものが前記第1データ
    構造中の要素を指し、前記ポインタ機構のうちの第2の
    ものが前記第2データ構造中の要素を指すことを特徴と
    するコンピュータ実施方法。
  4. 【請求項4】 前記第2データ構造を前記第1データ構
    造の実行可能な変形として使用するステップをさらに含
    む請求項3に記載のコンピュータ実施方法。
  5. 【請求項5】 シャドウ可能な第1データ構造を供給す
    るステップと、 それぞれデータ構造中の1要素を識別する一対のポイン
    タを作成して記憶する働きをするシャドウ・マップを呼
    び出すことにより、前記シャドウ可能第1データ構造の
    各ノードごとにシャドウ・ノードを作成するステップ
    と、 前記シャドウ・マップ中の前記一対のポインタにより、
    前記第2データ構造中の前記シャドウ・ノードのそれぞ
    れを、前記シャドウ可能第1データ構造中の対応するノ
    ードに関係付けるステップとを含む、既存のデータ構造
    のシャドウ・データ構造を作成するコンピュータ実施方
    法。
  6. 【請求項6】 前記シャドウ・マップを使用して、前記
    一対のポインタにより、前記第2データ構造中の要素を
    前記第1データ構造中の対応する要素に関係付けるステ
    ップをさらに含み、 前記一対のポインタのうちの第1のものが前記第1デー
    タ構造中の要素を指し、前記一対のポインタのうちの第
    2のものが前記第2データ構造中の要素を指すことを特
    徴とする請求項5に記載のコンピュータ実施方法。
  7. 【請求項7】 コンピュータと、 前記コンピュータに結合された第1データ構造と、 第2データ構造を作成し、かつ前記第1データ構造中の
    要素を指す第1の要素と前記第2データ構造中の要素を
    指す第2の要素とを含むポインタ構造によって前記第2
    データ構造中の要素を前記第1データ構造中の対応する
    要素に関係付ける働きをする、前記コンピュータに結合
    された装置と、 前記第2データ構造に結合された、前記第2データ構造
    を前記第1データ構造の実行可能な変形として使用する
    コンピュータ・コード装置とを備えるデータ構造の使用
    を拡張するためのシステム。
  8. 【請求項8】 オブジェクト指向プログラミング・オブ
    ジェクトの第1データ構造をあるタイプ空間から別のタ
    イプ空間に投影するためのコンピュータ機構であって、 オブジェクトの前記第1データ構造をオブジェクトのシ
    ャドウ可能データ構造に変換する働きをする第1プログ
    ラム・コード機構と、 オブジェクトの第2データ構造を作成し、かつ前記第1
    データ構造中の要素を指す第1の要素と前記第2データ
    構造中の要素を指す第2の要素とを含むポインタ構造に
    よって前記第2データ構造中の要素を前記第1データ構
    造中の対応する要素に関係付ける働きをする、前記コン
    ピュータ機構に結合された装置と、 前記第2データ構造に結合された、前記第2データ構造
    を前記第1データ構造の実行可能な変形として使用する
    ためのコンピュータ・コード装置とを備えるコンピュー
    タ機構。
  9. 【請求項9】 シャドウ・データ構造を構築するための
    コンピュータ機器であって、 前記シャドウ・データ構造の指定されたノードが存在す
    るかどうかを判定する照合装置と、 前記照合装置に結合された、前記指定ノードがまだ存在
    しない場合に前記シャドウ・データ構造の前記指定ノー
    ドを作成する作成装置と、 前記作成装置に結合された、前記シャドウ・データ構造
    の前記指定ノードが作成済みであることを示す値を記憶
    するレジスタ装置と、 前記レジスタ装置に結合された、前記シャドウ・データ
    構造の前記指定ノードが作成済みであることを示す前記
    値を、前記指定ノードの存在に関する照合を実行する機
    構に提供する回答装置とを備えるコンピュータ機器。
JP7031836A 1994-01-28 1995-01-30 動的拡張可能オブジェクト用のタイプ・セーフ・フレームワークのための方法及び装置 Pending JPH0836494A (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US187972 1994-01-28
US08/187,972 US5761511A (en) 1994-01-28 1994-01-28 Method and apparatus for a type-safe framework for dynamically extensible objects

Publications (1)

Publication Number Publication Date
JPH0836494A true JPH0836494A (ja) 1996-02-06

Family

ID=22691262

Family Applications (1)

Application Number Title Priority Date Filing Date
JP7031836A Pending JPH0836494A (ja) 1994-01-28 1995-01-30 動的拡張可能オブジェクト用のタイプ・セーフ・フレームワークのための方法及び装置

Country Status (4)

Country Link
US (1) US5761511A (ja)
EP (1) EP0665493B1 (ja)
JP (1) JPH0836494A (ja)
DE (1) DE69518446T2 (ja)

Families Citing this family (46)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6678880B1 (en) * 1995-05-08 2004-01-13 Apple Computer, Inc. System for iteratively designing an object heterarchy in an object-oriented computing environment
US5692184A (en) 1995-05-09 1997-11-25 Intergraph Corporation Object relationship management system
US5983019A (en) * 1996-03-18 1999-11-09 Tandem Computers Incorporated Method and system for providing interpretive access to an object system
US6263485B1 (en) 1996-07-11 2001-07-17 Andrew Schofield Method and apparatus for describing an interface definition language-defined interface, operation, and data type
US6173327B1 (en) 1996-07-11 2001-01-09 Jeroen De Borst Object-oriented method and apparatus for information delivery
US5943674A (en) * 1996-07-11 1999-08-24 Tandem Computers Incorporated Data structure representing an interface definition language source file
EP0841612A3 (en) * 1996-11-08 2003-05-28 International Business Machines Corporation Framework for software development
US5961659A (en) * 1997-06-30 1999-10-05 International Business Machines Corporation Independent simultaneous queueing of message descriptors
GB9816301D0 (en) * 1998-07-28 1998-09-23 Int Computers Ltd Data processing apparatus and method
GB9825102D0 (en) * 1998-11-16 1999-01-13 Insignia Solutions Plc Computer system
US6523171B1 (en) * 1998-12-29 2003-02-18 International Business Machines Corporation Enhanced source code translator from procedural programming language (PPL) to an object oriented programming language (OOPL)
US6832368B1 (en) 1999-02-17 2004-12-14 International Business Machines Corporation Method and system for enhancing the performance of interpreted web applications
US6366932B1 (en) * 1999-06-24 2002-04-02 International Business Machines Corporation Apparatus and method for accessing an object oriented object using a smart passive reference
US6353925B1 (en) * 1999-09-22 2002-03-05 Compaq Computer Corporation System and method for lexing and parsing program annotations
EP1292887A1 (en) * 2000-04-21 2003-03-19 Togethersoft Corporation Methods and systems for generating source code for object-oriented elements
DE10025260B4 (de) * 2000-05-22 2004-11-25 Conti Temic Microelectronic Gmbh Verfahren zur Detektion von Überrollvorgängen bei Kraftfahrzeugen mit Sicherheitseinrichtungen
US6591274B1 (en) * 2000-05-31 2003-07-08 Sprint Communications Company, L.P. Computer software framework and method for accessing data from one or more datastores for use by one or more computing applications
US6851104B1 (en) * 2000-08-14 2005-02-01 Rodrigues Da Silva Fernando Jose Barros System and method for programming using independent and reusable software units
US6760905B1 (en) * 2000-09-21 2004-07-06 Curl Corporation Lazy compilation of template-generated classes in dynamic compilation execution environments
US7203756B2 (en) * 2001-04-27 2007-04-10 International Business Machines Corporation Mechanism to cache references to Java RMI remote objects implementing the unreferenced interface
WO2003023498A2 (en) * 2001-09-06 2003-03-20 Acclaima Ltd. Method and apparatus for applying alterations selected from a set of alterations to a background scene
US8935297B2 (en) * 2001-12-10 2015-01-13 Patrick J. Coyne Method and system for the management of professional services project information
US20030144970A1 (en) * 2001-12-10 2003-07-31 Coyne Patrick J. Project management database and method of managing project related information
CN1464401B (zh) * 2002-06-28 2010-05-26 国际商业机器公司 使用影子对象进行核准控制的面向对象系统和方法
US7685581B2 (en) 2003-06-27 2010-03-23 Microsoft Corporation Type system for representing and checking consistency of heterogeneous program components during the process of compilation
US7559050B2 (en) 2003-06-30 2009-07-07 Microsoft Corporation Generating software development tools via target architecture specification
US7707566B2 (en) 2003-06-26 2010-04-27 Microsoft Corporation Software development infrastructure
US7305666B2 (en) * 2003-07-23 2007-12-04 Microsoft Corporation Description language for an extensible compiler and tools infrastructure
US7120898B2 (en) 2003-06-26 2006-10-10 Microsoft Corporation Intermediate representation for multiple exception handling models
US7788652B2 (en) 2003-06-27 2010-08-31 Microsoft Corporation Representing type information in a compiler and programming tools framework
US20050120329A1 (en) * 2003-12-01 2005-06-02 Gafter Neal M. Method and apparatus for supporting typesafe software design
US7418582B1 (en) 2004-05-13 2008-08-26 Sun Microsystems, Inc. Versatile register file design for a multi-threaded processor utilizing different modes and register windows
US7571284B1 (en) 2004-06-30 2009-08-04 Sun Microsystems, Inc. Out-of-order memory transactions in a fine-grain multithreaded/multi-core processor
US7509484B1 (en) 2004-06-30 2009-03-24 Sun Microsystems, Inc. Handling cache misses by selectively flushing the pipeline
US7290116B1 (en) 2004-06-30 2007-10-30 Sun Microsystems, Inc. Level 2 cache index hashing to avoid hot spots
US7366829B1 (en) 2004-06-30 2008-04-29 Sun Microsystems, Inc. TLB tag parity checking without CAM read
US7590632B1 (en) 2004-10-12 2009-09-15 Sun Microsystems, Inc. Method for serializer maintenance and coalescing
US20070225943A1 (en) * 2004-12-06 2007-09-27 Marano Howard T Executable application operation monitoring system
US8079023B2 (en) * 2007-03-22 2011-12-13 Microsoft Corporation Typed intermediate language support for existing compilers
US7962519B2 (en) * 2007-08-06 2011-06-14 International Business Machines Corporation Method, system, and program product for building hierarchies
US8763115B2 (en) * 2007-08-08 2014-06-24 Vmware, Inc. Impeding progress of malicious guest software
US8490050B2 (en) * 2008-04-17 2013-07-16 Microsoft Corporation Automatic generation of user interfaces
US20090328016A1 (en) * 2008-06-27 2009-12-31 Microsoft Corporation Generalized expression trees
US10564944B2 (en) 2010-01-07 2020-02-18 Microsoft Technology Licensing, Llc Efficient immutable syntax representation with incremental change
US9477461B1 (en) * 2014-03-12 2016-10-25 Cloud Linux Zug GmbH Systems and methods for generating and applying operating system live updates
US10303449B2 (en) * 2017-07-31 2019-05-28 Oracle International Corporation Compiling non-native constants

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS63174122A (ja) * 1987-01-05 1988-07-18 コンピュータ・エツクス・インコーポレーテツド コンピユーターヒューマンインタフエース
JP2534360B2 (ja) * 1988-09-26 1996-09-11 インターナシヨナル・ビジネス・マシーンズ・コーポレーシヨン 接続方法、ノ―ド接続方法、デ―タ処理方法、及び木内にノ―ドを挿入する方法
US5361350A (en) * 1991-12-12 1994-11-01 International Business Machines Corporation Object oriented method management system and software for managing class method names in a computer system
US5421016A (en) * 1991-12-12 1995-05-30 International Business Machines Corporation System and method for dynamically invoking object methods from an application designed for static method invocation
EP0546682A3 (en) * 1991-12-12 1993-12-08 Ibm Parent class shadowing
CA2077273C (en) * 1991-12-12 1996-12-03 Mike H. Conner Language neutral objects
JPH05257664A (ja) * 1991-12-12 1993-10-08 Internatl Business Mach Corp <Ibm> バージョン独立のオブジェクト指向アプリケーション・プログラムを生成するシステム及び方法
JPH06103075A (ja) * 1992-07-06 1994-04-15 Internatl Business Mach Corp <Ibm> オブジェクト指向適用業務
US5315703A (en) * 1992-12-23 1994-05-24 Taligent, Inc. Object-oriented notification framework system

Also Published As

Publication number Publication date
EP0665493B1 (en) 2000-08-23
US5761511A (en) 1998-06-02
EP0665493A3 (en) 1996-02-28
DE69518446D1 (de) 2000-09-28
DE69518446T2 (de) 2001-04-26
EP0665493A2 (en) 1995-08-02

Similar Documents

Publication Publication Date Title
JPH0836494A (ja) 動的拡張可能オブジェクト用のタイプ・セーフ・フレームワークのための方法及び装置
Ierusalimschy et al. Lua—an extensible extension language
Ekman et al. The jastadd extensible java compiler
US5978585A (en) Development system with improved methods for recompiling dependent code modules
US7971194B1 (en) Programming language techniques for client-side development and execution
US20070055964A1 (en) System and method for synthesizing object-oriented high-level code into browser-side javascript
Van den Brand et al. Generator of efficient strongly typed abstract syntax trees in Java
Baumgartner et al. On the interaction of object-oriented design patterns and programming languages
Karasick The architecture of Montana: An open and extensible programming environment with an incremental C++ compiler
Drayton et al. C# in a Nutshell
Albahari et al. C# Essentials: Programming the. NET Framework
EP2181387A1 (en) A programming environment with support for handle and non-handle user-created classes
Boshernitsan Harmonia: A flexible framework for constructing interactive language-based programming tools
Hanus et al. Declarative programming of user interfaces
Ike-Nwosu Inside the Python Virtual Machine
Jordan An extensible programming environment for Modula-3
Troelsen et al. Introducing. NET Core
Troelsen et al. Introducing c# and. net 6
Baumgartner et al. On the interaction of object-oriented design patterns and programming languages
Heidrich et al. Automatic Generation of Tcl Bindings for C and C++ Libraries.
Cunningham Multiparadigm Programming with Python (PyMPP)
Gough et al. Reading and Writing PE-files with PERWAPI
Savikko Generative and Incremental Approach to Scripting Support Implementation.
Cooper Jr Basic Lisp Techniques
Kennedy et al. SML .NET 1.1 User Guide