2012-03-09 11 views
7

Questa domanda è basata su una discussione (ora cancellata) in risposta a this question. È più sulla terminologia che sulla semantica della programmazione reale.Quando si verifica l'istanza generica (ad esempio, che cosa significa la parola)?

Che cos'è esattamente "istanziazione" generica? Si verifica in fase di compilazione o in fase di esecuzione?

Mi riferirò allo standard latest draft dello standard Ada 2012.

Il significato del termine generico_instantiation è chiaro; si tratta di un costrutto sintattico, qualcosa come

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

La mia domanda riguarda la "instantiate" verbo.

Ho sempre pensato all'istanziazione come a qualcosa che si verifica in fase di compilazione. È l'espansione di un modello generico e si verifica quando il compilatore incontra uno generico_instantiation in un'unità di compilazione.

Ma altre fonti si riferiscono a "istanziazione" che si svolge, almeno facoltativamente, in fase di esecuzione.

This Wikipedia article dice:

Per un'istanza di un'unità generica, il programmatore passa effettivi parametri per ogni formale. L'istanza generica si comporta quindi solo come come qualsiasi altra unità. È possibile istanziare unità generiche al tempo di esecuzione , ad esempio all'interno di un ciclo.

che sembra implicare che l'istanziazione può avvenire sia in fase di compilazione che in fase di esecuzione. Penso che questo si riferisca all'elaborazione dello generic_instantiation, che si verifica in fase di esecuzione - ma poi, tutte le elaborazioni avvengono in fase di esecuzione, sì?

Ho trovato sorprendentemente difficile ottenere una risposta definitiva dall'Ada RM. Non vi è alcuna voce nel glossario (allegato N) per "istanziazione" o "istanziazione".

Il più vicino ho trovato è stato questa dichiarazione a 12.2 (Organismi generici) il paragrafo 2, in "Semantica dinamici":

L'elaborazione di un corpo generico non ha altro effetto che di stabilire che il generico l'unità può da allora in poi essere istanziata senza fallire l'Elaboration_Check.

che indirettamente implica che esemplificazione è un evento di run-time.

Il verbo "istanziare" fa correttamente riferimento a un evento in fase di compilazione (espandendo un modello generico)? Per un evento run-time (elaborazione di un generic_instantiation)? Se quest'ultimo, come chiamiamo il primo? L'Ada RM è chiara come deve essere su questo punto?

+0

Mi sembra, basandomi solo sull'inglese, l'istanziazione significa la creazione di un'istanza, che suona sicuramente come il tempo di esecuzione. –

+0

@DonRoby: Ah, ma cos'è una "istanza"? Se un'istanza è il * codice * che risulta dall'espansione del modello, allora è in fase di compilazione. –

+0

@DonRoby: Un'analogia allentata: l'espansione della macro C avviene sicuramente in fase di compilazione, non in fase di esecuzione. I generici di Ada ovviamente non sono la stessa cosa, ma si applicano alcuni degli stessi principi. –

risposta

0

"Instantiation" è l'atto di creare un'istanza di un tipo (un oggetto o un tipo derivato). Può anche fare riferimento alla creazione di un'istanza di un pacchetto o di un sottoprogramma quando si parla di generici. L'esempio di un tipo è un oggetto di questo 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 

"Elaborazione" è il processo di preparazione di un costrutto, come un pacchetto o compito per il caricamento e l'esecuzione. Non ho studiato questo di recente, tuttavia.

+0

Ho visto la parola "istanziazione" usato per riferirsi alla creazione di un'istanza (oggetto) di un tipo, ma non è quello di cui stavo parlando; in Ada, il termine si riferisce quasi sempre all'istanza * generica *. Dire che "può riferirsi alla creazione di un'istanza di un pacchetto o di un sottoprogramma quando si parla di generici" in realtà non risponde alla domanda; non affronta se quella * creazione * si verifica in fase di compilazione o di esecuzione. –

+0

Sì. Hai abbastanza ragione. L'istanza generica può verificarsi all'interno di qualsiasi specifica: la parte dichiarativa di un pacchetto, di un sottoprogramma o di un'attività. Un generico può essere istanziato nella specifica di un altro generico, nel qual caso ha effetto sull'istanza del genitore. L'elaborazione di una specifica, per qualsiasi costrutto, in fase di esecuzione può causare l'istanziazione - proprio come può verificarsi la creazione di una variabile costante o inizializzata durante l'elaborazione. E sì, questo può accadere all'interno di un ciclo come indicato da NWS. –

1

Secondo the generic instantiation nella Semantica Statica parte nelle regole 12, 13 e 14, sembra essere fatto in fase di compilazione.

Ma the Gnat documentation, nella sua parte di controllo ordine elaborazione, descrivono che un errore programma sarebbe alzato in determinate circostanze. Tale eccezione viene lanciata solo durante l'esecuzione del programma.

Quindi il punto è, per quanto ho capito, che al momento della compilazione, il compilatore verifica che gli argomenti supportino le operazioni e gli intervalli spinti dal vostro generico ma che il codice reale sia fatto in fase di runtime.

Problemi correlati