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?
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. –
@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. –
@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. –