Differenze tra i collegamenti profondi e superficiali per l'ambito statico

0

Sono auto-apprendimento del Pragmatic Language Programming di Michael L. Scott. La seguente citazione spiega come il binding profondo e il binding superficiale sono diversi in presenza di scope statico:

program binding_example(input, output);

procedure A(I : integer; procedure P);

    procedure B;
    begin
        writeln(I);
    end;

begin (* A *)
    if I > 1 then
        P
    else
        A(2, B);
end;

procedure C; begin end;

begin (* main *)
    A(1, C);
end.

Figure 3.15 contains a Pascal program that illustrates the impact of deep binding rules in the presence of static scoping. When B is called via formal parameter P, two instances of I exist. Because the closure for P was created in the initial invocation of A, B uses that invocation’s instance of I in its writeln statement, and the output is a 1.

With shallow binding it would print a 2.

  1. In primo luogo sono nuovo di Pascal. È corretto che nel programma, lì sono quattro parti separate:

    • la definizione della procedura A , che definisce solo la procedura B

    • un blocco denominato A

    • la definizione della procedura C

    • un blocco denominato main ?

    Durante l'esecuzione del programma,

    • è il blocco main prima eseguito e poi il blocco A ?

    • Perché dice che "Quando B viene chiamato tramite il parametro formale P, esistono due istanze di I"?

  2. Ora per capire la differenza tra attacchi profondi e superficiali in presenza di scope statico

    • Perché in presenza di scope statiche e rilegature profonde, il programma stampa 1 ?

    • Perché in presenza di oscillazione statica e rilegatura poco profonda, il programma stampa 2 ?

Grazie.

    
posta Tim 24.09.2016 - 02:04
fonte

1 risposta

1

Firstly I am new to Pascal. Is it correct that in the program, there are four separate parts...

Il costrutto generale è quello di un'entità con (a) definizioni annidate e, (b) un corpo.

Quindi A & C sono nidificati in (programma) binding_example , e, B è nidificato in (procedura) A .

When executing the program, is the block main first executed and then the block A?

Ordina, ma non esattamente. Il flusso di controllo viene inizialmente trasferito alla prima riga del corpo del programma. Poiché tale riga di codice richiama A , il corpo del programma viene sospeso, una copia di A viene attivata con i parametri rilevanti dall'istruzione body body, e il flusso del controllo viene trasferito alla prima riga di A s body e con quella nuova attivazione.

Why does it say that "When B is called via formal parameter P, two instances of I exist"?

Perché A è una funzione ricorsiva. Si invoca come puoi vedere nel corpo di A . Quindi, se segui la logica e il flusso del controllo, ci saranno due copie di A attivate in un punto nell'esecuzione del programma. Poiché A definisce I , se ci sono due A s, allora ci sono due I s.

Innanzitutto, i binding funzionano in un modo solo qui. La menzione dei binding superficiali, in questo esempio, sono solo ipotetici.

Il che vuol dire che l'autore sta dicendo che se la lingua ha funzionato in modo diverso, beh, avrebbe funzionato in modo diverso ...

(Personalmente, non sono un grande fan di alternative ipotetiche come materiale per i tutorial - le trovo spesso poco pensate.)

Poiché l'autore non sta spiegando completamente come funzionerebbe questo linguaggio ipotetico e diverso, è meglio prendere il punto dell'autore che i deep binding finiscono per scegliere la prima attivazione di A , poiché questo è l'ambiente che evoca il parametro attuale B .

Why in the presence of static scoping and deep binding, does the program print 1?

Perché quando A viene attivato per la prima volta, in un certo senso crea un B a cui ora è possibile fare riferimento (senza A non abbiamo un B da utilizzare). Ora, A sceglie di fare riferimento al suo B , e, quel B conosce il suo A , e quindi circa A 's I , che detiene, 1 , dopo tutto. Ora A è invocato in modo ricorsivo, il che crea una seconda attivazione di A , con il proprio I , il cui valore è 2 . Ora quel secondo A richiama P , che è il primo A s B , quindi viene stampato 1 .

Why in the presence of static scoping and shallow binding, does the program print 2?

Come ho già detto, questo è solo un caso ipotetico, e non lo considero completamente cotta perché il testo delle procedure non avrebbe senso in quanto tale e dovrebbe anche cambiare per soddisfare questo ipotetico pascal che invece aveva superficialità attacchi.

    
risposta data 24.09.2016 - 03:00
fonte

Leggi altre domande sui tag