泛型实例化何时发生(即,这个词是什么意思)?

Kei*_*son 7 generics ada

此问题基于对此问题的回答(现已删除).它更多地是关于术语而不是实际的编程语义.

什么是通用的"实例化"?它是在编译时还是在运行时发生的?

我将参考Ada 2012标准的最新草案.

术语generic_instantiation的含义是明确的; 它是一个句法结构,类似于

package Inst is new Generic_Package(This => That);
Run Code Online (Sandbox Code Playgroud)

我的问题是关于动词"实例化".

我一直认为"实例化"是在编译时发生的事情.它是泛型模板的扩展,它发生在编译器在编译单元中遇到generic_instantiation时.

但是其他来源提到"实例化",至少可选地,在运行时发生.

这篇维基百科的文章说:

为了实例化一个通用单元,程序员 为每个正式传递实际参数.然后,通用实例的行为与任何其他单元一样.可以在运行时实例化通用单元,例如在循环内.

这似乎意味着实例化可以在编译时或运行时发生.我认为这是指制定了的generic_instantiation,它确实发生在运行时-但是,所有的论述出现在运行时,是吗?

我发现从Ada RM得到明确的答案是非常困难的."实例化"或"实例化"没有词汇表条目(附件N).

我能找到的最接近的是12.2(通用机构)第2段中"动态语义学"下的声明:

通用主体的详细说明除了确定通用单元从那时起可以实例化而不会使Elaboration_Check失败之外没有其他效果.

间接暗示实例化是一个运行时事件.

动词"实例化"是否正确引用了编译时事件(扩展通用模板)?到运行时事件(详细说明generic_instantiation)?如果是后者,我们称之为前者?Ada RM是否清晰,因为它需要在这一点上?

小智 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
Run Code Online (Sandbox Code Playgroud)

“精化”是准备诸如包或任务之类的构造以供加载和执行的过程。不过最近没研究过这个。