der Code für interpretierten Sprachen wird jedes Mal, wenn die Zeile erreicht wird neu interpretiert?

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

  •  06-09-2019
  •  | 
  •  

Frage

annimmt, dass kein Bytecode für ein Programm erzeugt wird, wie in Ruby, Perl oder PHP, in diesem Fall ist die Linie 1 unten neu interpretierten Zeilen jedes Mal, wenn die Ausführung Reichweite 1 wieder?

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

das heißt, wenn die Schleife 100.000 Mal ausgeführt wird, dann wird diese Zeile 100.000 Mal neu interpretiert werden?

und wenn ja, hilft die Bytecode Schöpfung nicht nur den ersten Start des er-Programms, sondern auch während der Ausführung? (Da Code muss nicht wieder neu interpretiert werden)

War es hilfreich?

Lösung

Normalerweise wird es in Bytecode umgewandelt werden und dass Byte-Code wird dann ausgeführt werden.

Aber im Fall von PHP zum Beispiel wird der Byte-Code auf jeder Anfrage / Seite Ansicht regeneriert. Sofern Sie einen Byte-Code installieren (oder Opcode, wie es oft im Fall von PHP genannt) Cache, wie XCache, APC oder eaccelerator.

Andere Tipps

Für die letzten Sprachen, einschließlich Perl, wird der Code vorkompilierte bevor sie ausgeführt werden. So sind die meisten der Analysearbeit wird nur einmal durchgeführt wird.

Dies ist nicht der Fall für Schalen, die jede Zeile jedes Mal, wenn sie sie ausführen zu interpretieren.

Wenn der Dolmetscher ist sinnvoll, es würde hoffentlich prüfen, ob $ countArrayMoviesData oder countNewlyAddedMoviesData $ während der Schleife geändert wurden und wenn sie die Summe nicht, dann sind berechnet werden und gehalten werden.

Wenn die Werte innerhalb der Schleife dann alle Wahrscheinlichkeit aktualisiert werden auch der Bytecode würde eine Additionsoperation erfordern zu, nicht so dass es nicht mehr effizient.

Sehr, sehr wenige Dolmetscher werden dies tun. Ein Beispiel ist das uralte, nicht mehr verwendet Hypertalk-Interpreter für Hypercard, wo man tatsächlich den Text des Codes neu schreiben könnte programmatisch (es ist nur ein String!)

Auch Dolmetscher, die Ihren Code analysieren zunächst nicht Byte-Code produzieren, wie es schwer ist, diese Zeile für Zeile zu tun und viel einfacher, alles auf einmal zu tun. Also ein wirklich einfachen Dolmetscher haben grundsätzlich einen Baum, mit einem Knoten für die „where“ Schleife mit zwei Kindern. Ein „kleiner als“ Ausdruck für die bedingten, und einen Block für den Körper der Schleife

Die Antwort auf Ihre Frage, da alle Berater wissen, ist „es kommt.“

Du hast Recht, in einigen Sprachen interpretiert, kann diese Zeile jedes Mal neu interpretiert werden. Ich vermute, die meisten Schalen umgehen grob auf diese Weise.

Die ursprünglichen Versionen von Basic tat es auch auf diese Weise.

Die meisten aktuellen Dolmetscher mindestens tokenize der Sprache, so dass der Text nicht jedes Mal gescannt erneut werden muss. Das heißt, ein BASIC-ish Programm wie

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

wäre es zumindest auf kleine Aufmerksamkeiten für die Schlüsselwörter konvertieren und Adressen für die Variable, so etwas wie

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

wobei jedes Wort in Großbuchstaben in der Übersetzung intern eine einzelne ganze Zahl ist. Auf diese Weise gibt es einen einzigen lexikalische Analyse Pass zu übersetzen, vom Interpreter gefolgt Lage zu sein, nur die Tokenwerte zu interpretieren.

Natürlich, wenn Sie so weit gehen, findet man sich denken: „Gee, warum nicht wirklich Opcodes verwenden?“

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top