der Code für interpretierten Sprachen wird jedes Mal, wenn die Zeile erreicht wird neu interpretiert?
-
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)
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?“