2017-01-12 2 views
2

Ich habe viele Anekdoten gehört, dass ein großes Problem mit dynamisch typisierten Sprachen ist, dass die Typüberprüfung sehr langsam ist. Warum ist es langsam? Was rät die Informatik, dass die Verwendung von Runtime-Typen, die sich ändern können, große Verlangsamungen der Recheneffizienz verursachen?Warum ist Typprüfung teuer?

Antwort

6

Dynamisch typisierte Sprachen müssen eine Typüberprüfung ausführen, während Code ausgeführt wird. Obwohl sie manchmal kompiliert werden können, müssen sie viele Ecken für eine angemessene Leistung schneiden. Ein großer Nachteil der Überprüfung zur Laufzeit ist, dass der Interpreter, wenn ein Typ nicht gültig ist, nur Ausnahmen auslösen oder die Ausführung stoppen kann.

So versuchen sie oft, Typen zu erzwingen, um Ausnahmen zu verhindern, auch wenn es unerwünscht sein könnte. In Python ist es nicht ungewöhnlich, dass eine einfache Division durch ganze Ganzzahlen bedeutet, dass meine Benutzerausgabe plötzlich mit '2.0' gefüllt ist, weil ich nicht explizit in int zurückgeworfen habe.

Die Rationalität der Informatik ist, dass Typ-Überprüfung ein extrem schwerer Algorithmus ist. Für jede Funktion, die Sie aufrufen, müssen alle beteiligten Typen validiert werden (oder erzwungen werden, was ein anderer Funktionsaufruf sein kann), und die Typinformation muss danach aktualisiert werden. Zur Laufzeit kann man sich nur ein einfaches Typsystem und sehr wenig Optimierung leisten. Ein Compiler im Vergleich kann sogar ein schwaches System ausnutzen, um Ihre ineffizienten Algorithmen zu optimieren.


Es ist sehr üblich, statisch typisierten Sprachen übersetzt werden, und dynamisch typisierten Sprachen interpretiert werden. Wenn eine Sprache für einen Compiler entwickelt wird, ist es ein Kinderspiel, dem Compiler die Verantwortung für die Typprüfung zu geben, damit der Code optimaler wird und die Typisierung zur Laufzeit nicht verwaltet werden muss. Je weniger Sie zur Laufzeit tragen müssen, desto schneller wird der Code ausgeführt.

Letztendlich bedeutet dies, dass Sprachen, die für Interpreter entwickelt wurden, sich das Niveau der Eingabe eines Compilers nicht leisten können. Zusätzlich zu der geringeren Freiheit, Typinformationen zur Optimierung zu nutzen - strike 1 zur Performance -, müssen sie Typinformationen zur Laufzeit tragen und modifizieren - strike 2. Das schwächere Typsystem führt auch viele Arten von Sicherheitsfehlern ein.

Natürlich gibt es auch zahlreiche Fälle, in denen eine schwache Typisierung wünschenswert ist. Dynamische Sprachen übernehmen oft die Rolle des Skripts; Sie sind schnell zu programmieren, einfach zu interpretieren und können schneller als ein Compiler auf neue Plattformen portiert werden! Dies macht sie unschätzbar für das Zusammenkleben sehr unterschiedlicher Systeme. Ein Skript kann mit dem Betriebssystem und vielen Programmen interagieren, um einen täglichen Download aller aktuellen Katzenvideos von Ihrer Lieblings-Website zu planen.

Wie immer empfehle ich Ihnen, eine dynamische Sprache und eine statische Sprache in Ihrem Repertoire zu haben. Es ist von unschätzbarem Wert, Zugang zu den Garantien für starke Typisierung und Zugang zur Leichtigkeit des schwachen Schreibens zu haben. Sei ein Code-Allesfresser :)

+0

Dies ist eine umfassende und durchdachte Antwort. Danke, dass Sie das zusammen gemacht haben, schätzen Sie es! – user3325789