2013-09-28 19 views
11

Questo è un po 'di follow-up a this question.Perché la località viene determinata al momento della compilazione?

  1. Perché la località è determinata al momento della compilazione e non al momento dell'esecuzione? E 'puramente per le prestazioni?
  2. Ci sono linguaggi che cercano le loro variabili al momento dell'esecuzione? Cioè ogni volta che si accede a una variabile, questa variabile viene prima ricercata nell'ambito locale e quindi la ricerca viene sottoposta a escalation attraverso tutti gli ambiti che la racchiudono?
  3. Come gestiscono le lingue ECMA?

Per mettere domanda 2 in altre parole: Ci sono lingue in cui il codice seguente (nella sintassi necessaria) funziona:

def f(): print ('f') 

def g(): 
    f() 
    f = 42 

g() 
+0

cosa dovrebbe fare il codice? –

+0

Stampa 'f' senza generare' variabile locale non legata 'o qualcosa lungo questa linea. – Hyperboreus

risposta

5

Questo comportamento è chiamato scoping lessicale. Quello che descrivi in ​​# 2 è chiamato scope dinamico, sebbene la descrizione verbale sia fuorviante (tu dici "racchiudere gli ambiti" dove "chiamare le funzioni" o "record di attivazione" sarebbe più accurato).

Praticamente ogni linguaggio in uso comune utilizza lo scope lessicale, non solo Python. Ciò include C# e ECMAScript/JavaScript (con il blocco eval e with), che presumo sia ciò che intendi per "lingue ECMA". Ci sono state lingue e alcune sono ancora in uso. Emacs Lisp è uno e Perl offre sia lo scope lessicale che dinamico.

Il razionale per scoping lessicale non è solo per le prestazioni (full scoping lessicale comprese chiusure realtà ha una prestazione low, vedere i problemi funcarg), è per semplicità e affidabilità. Mentre può essere sorprendente quando si apprende per la prima volta la lingua, le regole sono in realtà molto semplici, quindi un programmatore esperto può immediatamente capire a quale uso si riferisce un identificatore. Si possono capire le funzioni da soli, poiché l'esecuzione non è influenzata da chi chiama queste funzioni e come hanno deciso di denominare le loro variabili.

+0

Grazie per la risposta. Con "lingue ECMA" intendevo fare riferimento a tutte le implementazioni conformi a ECMA-262 (ISO/IEC 16262): JavaScript, JScript, QtScript, ecc ... – Hyperboreus

Problemi correlati