In dynamischen Sprachen wie JavaScript oder Python wird der Typ einer Variablen zur Laufzeit festgelegt. Dies ist ein Grund, warum sie langsamer sind als typisierte Sprachen wie Java.
Wie wird die Typprüfung durchgeführt? Was ist der wesentliche Grund, warum dieser Prozess langsam ist?
Antworten:
Die Frage ist verwirrend.
Es wird davon ausgegangen, dass die Typprüfung langsam ist, was nicht unbedingt der Fall ist.
Die Frage scheint auch den Prozess des Typversands mit der Typprüfung zu verwechseln , und es handelt sich um zwei verschiedene Dinge. Einer ist ein Prozess, der zur Laufzeit ausgeführt wird, der andere ein Prozess zur Kompilierungszeit. Ich vermute, die Frage ist wirklich nach Typ Versand.
Es ist der Typversand, der zur Laufzeit Overhead verursachen kann, da die Berechnung Zeit mit Anweisungen verbringt, die dynamisch entscheiden, welche Aktion basierend auf den zur Laufzeit angezeigten Wertetypen ausgeführt werden soll. Wenn ich beispielsweise in einer dynamischen Sprache "+" auf zwei Dinge anwende, kann dies numerische Addition oder Verkettung von Zeichenfolgen bedeuten. Daher muss ich Zeit damit verbringen, zu prüfen, was zur Hand ist, um zu entscheiden, was zu tun ist. Es gibt Bewertungsstrategien, mit denen die Kosten für den dynamischen Versand gesenkt werden können. (zB JITs verfolgen)
Informationen zur Typprüfung in JavaScript finden Sie unter: http://www.cs.brown.edu/~sk/Publications/Papers/Published/gsk-flow-typing-theory/ . Für einen allgemeineren Überblick über die Funktionsweise von Typprüfern werden die Algorithmen in einem Standardlehrbuch für Programmiersprachen behandelt. Zum Beispiel http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/
quelle
Im Grunde genommen verweist in untypisierten Sprachen jeder Verweis auf ein Objekt, das sowohl den Typ als auch den Wert enthält. Zeigt beispielsweise
var a = 3
auf eine Instanz, die den Wert 3 und den Typ int enthält. Wenn Sie dies tuna = "bla"
, wird der Verweis auf eine Instanz aktualisiert, die die Zeichenfolge "bla" und die Typzeichenfolge enthält. Das alte Objekt wird verworfen.Dies ist langsam, da jedes Mal, wenn eine Operation (z. B.
a + b
) für diesen Basistyp ausgeführt werden muss , die Laufzeit zuerst die Objekte dereferenzieren, prüfen muss, ob ihr Typ kompatibel ist, die Operation ausführen und ein neues Objekt erstellen muss.Im Gegensatz dazu werden
a + b
in C ++ oder Java zur Kompilierungszeit überprüft , ob die Typen gültig und kompatibel sind. Dann werden a und b als unmittelbare Werte (keine Referenzen) gespeichert, und das Hinzufügen ist eine einfache Prozessoroperation für diese Werte.Das ist natürlich alles sehr theoretisch. In der Praxis kann dieser Prozess stark optimiert werden, um den größten Teil des Overheads zu vermeiden, und dynamisch typisierte Sprachen können sehr schnell werden.
quelle
Jeder Wert wird zusammen mit seinem Typ gespeichert, den man zuerst überprüfen muss. Auch Konvertierungen sagen, von Zeichenfolge zu Nummer gehen per Inspektion, im laufenden Betrieb.
quelle