Relazione tra collegamenti statici e dinamici e ambiti?

0

Da link

name binding is the association of entities (data and/or code) with identifiers.[1] An identifier bound to an object is said to reference that object.

Binding is intimately connected with scoping, as scope determines which names bind to which objects – at which locations in the program code (lexically) and in which one of the possible execution paths (temporally).

  1. Qual è la differenza tra l'associazione del nome e l'ambito?

    È corretto che

    • nome vincolante serve per creare una nuova associazione tra un nome e un'entità,
    • l'ambito è scoprire quale entità è stato associato a un nome usato da qualche parte in un programma?
  2. Ci sono relazioni tra i collegamenti statici e dinamici e statici e ambiti dinamici?

    Per un nome,

    • il suo legame e il suo scope sono sempre sia dinamici sia statici? Se no, sono per lo più?

    • Per l'associazione e l'ambito, se uno è statico o dinamico, l'altro è statico o dinamico?

Grazie.

P.S. Ho provato a cercare il nome vincolante nei miei libri, ma non li ho trovati. Forse la terminologia è diversa nei libri.

    
posta Tim 24.09.2016 - 06:37
fonte

1 risposta

3

Le citate definizioni di "entità" e "oggetto" sono ambigue, dobbiamo essere più precisi. Un nome è associato a una posizione di archiviazione che a sua volta contiene un valore . Il valore è i dati. (Trovo un po 'strano dire che il valore potrebbe anche essere "codice", ma forse si riferisce a se il valore è una funzione, che è possibile.)

Scoping è il modo in cui i nomi sono associati alle posizioni di archiviazione. Un nome come x può riferirsi a diverse posizioni di memorizzazione in diverse parti del programma, ma all'interno di un singolo ambito, lo stesso nome fa sempre riferimento alla stessa posizione di archiviazione.

function f() {
   int x = 17; // one storage location
}
function g() {
   string x = "Hello"; // a different storage location than the other x
}

Ma il valore di una singola posizione di memoria può cambiare all'interno di un ambito (almeno nelle lingue che supportano l'assegnazione distruttiva, che è la maggior parte delle lingue tradizionali).

function f() {
  int x = 17;
  x = 42; // the same storage location is assigned a new value
}

Scopo statico significa che gli ambiti possono essere determinati semplicemente osservando la struttura del codice. L'ambito dinamico indica che l'ambito dipende da quali chiamate di funzione, il che significa che l'associazione tra i nomi e la posizione di archiviazione viene determinata in fase di runtime.

La maggior parte delle lingue tradizionali supporta solo l'ambito statico. Credo che Common Lisp supporti sia l'ambito statico che dinamico, nel qual caso ogni nome è definito in modo dinamico o statico.

Il binding dinamico (noto anche come late binding) può significare cose diverse, ma in questo contesto probabilmente si riferisce al fatto se il percorso di archiviazione per un nome si trova in fase di compilazione o in fase di esecuzione.

Le variabili con ambito dinamico devono per definizione anche essere legate in ritardo, dal momento che possono fare riferimento a diverse posizioni di memoria durante l'esecuzione. Ma le variabili con scope statico possono essere o vincolate staticamente (come in C, Java) o in ritardo (come Pyton, JavaScript).

In un linguaggio funzionale puro (come Haskell) le variabili non possono cambiare il loro valore. Ciò è concettualmente più semplice poiché si può pensare a un nome come direttamente associato a un valore in un ambito. Lo stesso vale per le costanti nei linguaggi imperativi: in un linguaggio imperativo legato staticamente, il compilatore può saltare generando posizioni di memoria per le costanti e sostituisce invece tutti i riferimenti al nome della costante con il valore stesso.

    
risposta data 24.09.2016 - 09:11
fonte

Leggi altre domande sui tag