è il codice per linguaggi interpretati re-interpretato ogni volta che viene raggiunta la linea?

StackOverflow https://stackoverflow.com/questions/922692

  •  06-09-2019
  •  | 
  •  

Domanda

supponiamo che nessun codice byte viene generato per un programma, come in Ruby, Perl o PHP, in questo caso, è la riga 1 sotto reinterpretata ogni volta che la linea di esecuzione portata nuovamente 1?

while ($indexArrayMoviesData < $countArrayMoviesData + $countNewlyAddedMoviesData) {
  # do something
}

ovvero, se il ciclo viene eseguito 100.000 volte, poi quella linea sarà nuovamente interpretato 100.000 volte?

e in caso affermativo, la creazione bytecode aiuta non solo l'avvio iniziale del programma di lui, ma anche durante l'esecuzione? (Perché il codice non deve essere reinterpretato nuovo)

È stato utile?

Soluzione

In genere, sarà convertito in bytecode e verrà quindi eseguito il codice di byte.

Ma nel caso di PHP per esempio, il codice di byte si rigenera ad ogni richiesta di visualizzazione / pagina. A meno che non si installa un codice di byte (o opcode come viene chiamato spesso in caso di PHP) cache, ad esempio XCache, APC o EAccelerator.

Altri suggerimenti

Per ultimi lingue, tra cui Perl, il codice è precompilato prima di essere giustiziato. Così la maggior parte del lavoro di analisi viene eseguita solo una volta.

Questo non è il caso per le conchiglie, che interpretano ogni riga ogni volta che li eseguono.

Se l'interprete è sensata sarebbe spera verificare se $ countArrayMoviesData o $ countNewlyAddedMoviesData sono stati alterati durante il ciclo e se non fossero allora la somma potrebbe essere calcolati e mantenuti.

Se i valori vengono aggiornati all'interno del loop poi con ogni probabilità anche il bytecode richiederebbe un'operazione Oltre a svolgersi, non rendendo più efficiente.

Molto, molto pochi interpreti farà questo. Un esempio è l'età-vecchio, interprete HyperTalk non più utilizzato per HyperCard dove si potrebbe effettivamente riscrivere il testo del codice programatically (è solo una stringa!)

Anche gli interpreti che non producono bytecode analizzerà il codice prima, in quanto è difficile farlo riga per riga e molto più facile da fare tutto in una volta. Quindi davvero un semplice interprete sarà essenzialmente avere un albero, con un nodo per il "dove" ciclo con due figli:. Uno "minore di" espressione per il condizionale, e un blocco per il corpo del ciclo

La risposta alla tua domanda, come tutti i consulenti sanno, è "dipende".

Hai ragione, in alcuni linguaggi interpretati, che la linea può essere reinterpretato ogni volta. Ho il sospetto che la maggior parte delle conchiglie di gestirlo o meno in questo modo.

Le versioni originali di base anche fatto in questo modo.

La maggior parte delle interpreti attuali almeno tokenize la lingua, in modo che il testo non ha bisogno di essere ri-scansionato ogni volta. Cioè, un programma BASIC-ish come

 00010 LET A=42
 00020 DO WHILE A > 0
 00025    LET A = A - 1
 00030 ENDDO

sarebbe convertirlo per lo meno ai piccoli gettoni per le parole chiave, e gli indirizzi per la variabile, qualcosa come

 LET    $0003, 42
 LABEL  00020 
 LETEST A, 0
 IFTRUEGOTO   00030
 SUB    $0005, $0003, 1
 GOTO   00020
 LABEL  00030

dove ogni parola in maiuscolo nella traduzione è un singolo intero internamente. In questo modo, c'è un unico passaggio analisi lessicale di tradurlo, seguita da l'interprete essere in grado di interpretare solo i valori simbolici.

Naturalmente, una volta che si va così lontano, ti ritrovi a pensare "Accidenti, perché non utilizzare codici operativi reali?"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top