Когда происходит родовое создание (то есть, что означает слово)? - PullRequest
7 голосов
/ 10 марта 2012

Этот вопрос основан на обсуждении (теперь удалено) в ответ на этот вопрос . Это больше о терминологии, чем о фактической семантике программирования.

Что именно является родовым "воплощением"? Это происходит во время компиляции или во время выполнения?

Я буду ссылаться на последний вариант стандарта Ada 2012.

Значение термина generic_instantiation ясно; это синтаксическая конструкция, что-то вроде

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

Мой вопрос о глаголе "экземпляр".

Я всегда думал об «создании экземпляров» как о том, что происходит во время компиляции. Это расширение универсального шаблона, и оно происходит, когда компилятор встречает generic_instantiation в модуле компиляции.

Но другие источники ссылаются на "создание экземпляров", происходящее, по крайней мере, необязательно, во время выполнения.

Эта статья в Википедии гласит:

Чтобы создать универсальную единицу, программист передает фактический параметры для каждого формального. Общий экземпляр тогда ведет себя просто как и любой другой блок. Можно создать единичные единицы в время выполнения, например внутри цикла.

, что, по-видимому, означает, что создание экземпляров может происходить либо во время компиляции, либо во время выполнения. Я думаю, что это относится к разработке generic_instantiation , которая происходит во время выполнения - но тогда вся разработка происходит во время выполнения, да?

Мне было удивительно трудно получить окончательный ответ на этот вопрос от Ада РМ. Нет записи глоссария (Приложение N) для «создания экземпляров» или «создания экземпляров».

Самым близким, что я смог найти, было это утверждение в параграфе 2 12.2 (Универсальные тела) в разделе «Динамическая семантика»:

Разработка общего тела не имеет никакого другого эффекта, кроме как установить, что общая единица может с тех пор быть создан без сбоев проверки Elaboration_Check.

что косвенно подразумевает, что создание экземпляра является событием времени выполнения.

Правильно ли относится глагол "экземпляр" к событию времени компиляции (развертывание универсального шаблона)? Для события во время выполнения (разработка generic_instantiation )? Если последнее, что мы называем первым? Ада РМ настолько ясна, насколько это необходимо по этому вопросу?

Ответы [ 2 ]

1 голос
/ 19 сентября 2012

Согласно обобщенной реализации в части Статическая семантика в правилах 12, 13 и 14, похоже, что это делается во время компиляции.

Но документация Gnat в ее части управления порядком разработки описывает, что Ошибка программы будет возникать при определенных обстоятельствах. Такое исключение возникает только при запуске программы.

Итак, насколько я понял, смысл в том, что во время компиляции компилятор проверяет, поддерживают ли аргументы операции и диапазоны, выдвигаемые вашим универсальным модулем, но что настоящий код выполняется во время выполнения.

0 голосов
/ 12 марта 2012

«Instantiation» - это действие по созданию экземпляра типа (объекта или производного типа).Это также может относиться к созданию экземпляра пакета или подпрограммы, когда речь идет об обобщениях.Экземпляр типа является объектом этого типа:

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

«Разработка» - это процесс подготовки конструкции, такой как пакет или задача, для загрузки и выполнения.Однако, недавно это не изучали.

...