2012-03-09 13 views
7

Esta pregunta se basa en una discusión (ahora eliminada) en respuesta a this question. Se trata más de terminología que de semántica de programación real.¿Cuándo se produce la instanciación genérica (es decir, qué significa la palabra)?

¿Qué es exactamente "instanciación" genérica? ¿Ocurre en tiempo de compilación o en tiempo de ejecución?

Me referiré al latest draft del estándar Ada 2012.

El significado del término generic_instantiation es claro; es una construcción sintáctica, algo así como

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

Mi pregunta es sobre el verbo "instanciar".

Siempre he pensado en "instanciación" como algo que ocurre en tiempo de compilación. Es la expansión de una plantilla genérica, y ocurre cuando el compilador encuentra generic_instantiation en una unidad de compilación.

Pero otras fuentes hacen referencia a la "instanciación" que tiene lugar, al menos opcionalmente, en tiempo de ejecución.

This Wikipedia article dice:

Para instantiate una unidad genérica, el programador pasa reales parámetros para cada uno formal. La instancia genérica se comporta como como cualquier otra unidad. Es posible crear instancias de unidades genéricas en en tiempo de ejecución, por ejemplo, dentro de un bucle.

que parece implicar que la creación de instancias puede ocurrir en tiempo de compilación o en tiempo de ejecución. Creo que esto se refiere a la elaboración de generic_instantiation, que ocurre en tiempo de ejecución, pero luego, toda la elaboración ocurre en tiempo de ejecución, ¿sí?

Me pareció sorprendentemente difícil obtener una respuesta definitiva a esto del Ada RM. No hay entrada de glosario (Anexo N) para "instanciación" o "creación de instancias".

Lo más cerca que pude encontrar fue esta declaración en 12.2 (Cuerpos genéricos) del párrafo 2, en "Dynamic Semántica":

La elaboración de un cuerpo genérico no tiene otro efecto que el de Establecer que el genérico la unidad puede a partir de ese momento ser instanciada sin fallar el Elaboration_Check.

cuales indirectamente implica que la instanciación es un evento en tiempo de ejecución.

¿El verbo "instanciar" se refiere adecuadamente a un evento en tiempo de compilación (expandir una plantilla genérica)? Para un evento en tiempo de ejecución (elaborando un generic_instantiation)? Si este último, ¿cómo llamamos al primero? ¿El Ada RM es tan claro como debe ser en este punto?

+0

Me parece, basándome en el inglés, la creación de instancias significa la creación de una instancia, que ciertamente suena como en tiempo de ejecución. –

+0

@DonRoby: Ah, pero ¿qué es una "instancia"? Si una instancia es el * código * que resulta de expandir la plantilla, entonces es tiempo de compilación. –

+0

@DonRoby: una analogía flexible: la expansión de macro C definitivamente tiene lugar en tiempo de compilación, no de tiempo de ejecución. Los genéricos de Ada obviamente no son lo mismo, pero se aplican algunos de los mismos principios. –

Respuesta

0

"Instanciación" es el acto de crear una instancia de un tipo (ya sea un objeto o un tipo derivado). También se puede referir a la creación de una instancia de un paquete o subprograma cuando se habla de genéricos. La instancia de un tipo es un objeto de ese tipo:

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 

"Elaboración" es el proceso de preparación de un constructo tal como un envase o una tarea para la carga y ejecución. No he estudiado esto recientemente, sin embargo.

+0

He visto la palabra "instanciación" usado para referirse a crear una instancia (objeto) de un tipo, pero eso no es de lo que estaba hablando; en Ada, el término casi siempre se refiere a la instanciación * genérica *. Decir que "puede referirse a la creación de una instancia de un paquete o subprograma cuando se habla de genéricos" no responde realmente a la pregunta; no aborda si esa * creación * ocurre en tiempo de compilación o tiempo de ejecución. –

+0

Sí. Estás en lo cierto. La instanciación genérica puede ocurrir dentro de cualquier especificación: la parte declarativa de un paquete, subprograma o tarea. Un genérico se puede crear una instancia en la especificación de otro genérico, en cuyo caso se aplica a la creación de instancias de su padre. La elaboración de una especificación, para cualquier construcción, en tiempo de ejecución puede provocar una instanciación, al igual que la creación de una variable constante o inicializada puede ocurrir durante la elaboración. Y sí, esto puede ocurrir dentro de un ciclo como lo indicó NWS. –

1

De acuerdo con the generic instantiation en el semántica estática parte en las reglas 12, 13 y 14, parece que se hace en tiempo de compilación.

Pero the Gnat documentation, en su parte de control para la elaboración , describen que un error Programa sería levantado bajo ciertas circunstancias. Tal excepción solo se produce cuando se ejecuta el programa.

Así que el punto es, por lo que yo entiendo, que en tiempo de compilación, el compilador comprueba que los argumentos soportan operaciones y rangos empujados por su código genérico pero ese código real se hace en tiempo de ejecución.

Cuestiones relacionadas