2012-03-09 9 views
7

この質問は、this questionへの応答として(今削除された)議論に基づいています。それは実際のプログラミングのセマンティクスよりも専門用語です。一般的なインスタンス化はいつ行われますか(つまり、単語の意味は何ですか)?

具体的には「インスタンシエーション」は何ですか?コンパイル時または実行時に発生しますか?

Ada 2012規格のlatest draftを参照します。

用語の意味generic_instantiationは明確です。それは構文のようなものです

package Inst is new Generic_Package(This => That); 

私の質問は動詞「インスタンス化」についてです。

私はいつも「インスタンス化」をコンパイル時に発生するものと考えてきました。これは汎用テンプレートの拡張であり、コンパイラがgeneric_instantiationをコンパイル単位で検出したときに発生します。

しかし、他の情報源は、少なくともオプションで実行時に「インスタンス化」が行われることを指します。

This Wikipedia articleは言う:

にインスタンス化は、一般的なユニット、プログラマは、各仮ため実際 パラメータを渡します。一般的なインスタンスは、他のユニットと同様に、ちょうど のように動作します。実行時に、例えばループ内で汎用単位を にインスタンス化することは可能です。

これは、インスタンス化がコンパイル時または実行時に発生する可能性があると思われるようです。これは実行時に発生する詳細generic_instantiationを参照していると思いますが、実行時にすべての詳細が発生しますか?

私はAda RMから決定的な答えを得ることは驚くほど困難であることがわかりました。 「インスタンス化」または「インスタンス化」用の用語集エントリ(Annex N)はありません。

「動的意味論」の下で、私は12.2(ジェネリック機関)第2項では、この文だった見つけることができる最も近い:

一般的な体の精緻化が よりも、他の効果もありませんが、一般的なことを立証ユニットはその後、Elaboration_Checkに失敗することなく のインスタンス化が可能です。

は、間接的には、インスタンスが実行時のイベントであることを意味します。

"instantiate"という動詞は、コンパイル時のイベント(一般的なテンプレートを展開する)を正しく参照していますか?実行時のイベント(generic_instantiationを精緻化する)に?後者の場合は、前者とはどういう意味ですか? Ada RMはこの時点で必要なだけ明確ですか?

+0

インスタンス化とは、ちょうど英語に基づいているように見えますが、インスタンスの作成は実行時と同じように思えます。 –

+0

@DonRoby:ああ、しかし、 "インスタンス"は何ですか?テンプレートを展開した結果のインスタンスが* code *の場合、コンパイル時です。 –

+0

@DonRoby:緩やかな類推:Cのマクロ展開は、実行時ではなくコンパイル時に行われます。明らかに、Adaジェネリックスは同じものではありませんが、同じ原理のいくつかが適用されます。 –

答えて

0

「インスタンス化」は、型(オブジェクトまたは派生型のいずれか)のインスタンスを作成する行為です。ジェネリックスを話すときには、パッケージまたはサブプログラムのインスタンスの作成を参照することもできます。型のインスタンスは、その型のオブジェクトである:

type My_Type is 
    record 
     Range_Begin : Natural := 1; 
     Range_End : Natural := 15_000_000; 
    end record; 

type My_Type_Access is access all My_Type; 

My_Object1 : My_Type_Access := new My_Type; -- instantiation of My_Type 
              -- to create My_Object1 

My_Array_Objects : array (Positive range 1 .. 250_000) of My_Type_Access := 
    (others => new My_Type); -- creates an array of objects of My_Type 

「詳細説明」は、ロードおよび実行するためのパッケージまたはタスクなどの構築物を調製する方法です。しかし、最近これを研究していない。

+0

"型のインスタンス(オブジェクト)の作成を参照するのに使用されますが、これは私が話していたものではありません。 Adaでは、この用語はほとんどの場合* generic * instantiationを指します。ジェネリックスを話すときにパッケージやサブプログラムのインスタンスの作成を参照できるということは、本当にその質問に答えることはできません。コンパイル時または実行時に* creation *が発生するかどうかには対処しません。 –

+0

はい。たしかにそれは正しいね。一般的なインスタンス化は、パッケージ、サブプログラム、またはタスクの宣言部分である任意の仕様内で発生する可能性があります。 ジェネリックは、別のジェネリックの仕様でインスタンス化することができます。この場合、そのジェネリックは親のインスタンス生成時に有効になります。 実行時に任意の構造体に対して仕様を作成すると、詳細化中に定数または初期化された変数の作成が行われるように、インスタンス化が発生する可能性があります。そして、はい、これはNWSが示すようにループ内で発生する可能性があります。 –

1

の静的セマンティクス部分のthe generic instantiationによると、ルール12,13、および14の部分は、コンパイル時に行われたようです。

しかしthe Gnat documentationは、その精緻化順序制御部分には、プログラムエラーは、特定の状況下で提起されることを説明します。そのような例外は、プログラムを実行するときにだけスローされます。

コンパイル時に、コンパイラは引数が操作と汎用のプッシュされた範囲をサポートしていることを確認しますが、実際のコードは実行時に実行されます。

関連する問題