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
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 :)
- 1. Warum ist die Typprüfung in Templates strenger?
- 2. (Warum) Ist Reflection in .Net so teuer?
- 3. Warum ist NHibernate AutoFlush so teuer?
- 4. Teuer, System.Numerics.VectorX zu wickeln - warum?
- 5. Wie teuer ist ST_GeomFromText
- 6. Wie teuer ist Typschluss?
- 7. Ist NSTimer teuer?
- 8. Warum ist der Java-Methodenaufruf hier so teuer?
- 9. QBild zu QPixmap ist teuer
- 10. Warum wird eine Ladenladeschranke als teuer angesehen?
- 11. Typprüfung Probleme
- 12. Typprüfung mit react v15.5. React.PropTypes ist veraltet
- 13. Typprüfung und Generika
- 14. CPU teuer Javascript
- 15. Wie "teuer" ist Oracle Enterprise Manager?
- 16. Ist das Erstellen eines com.rits.cloning.Cloner teuer? Alle
- 17. Ist die Abhängigkeitsinjektion in Angular 2+ teuer?
- 18. Ist es teuer, Datenbankverbindungen offen zu halten?
- 19. Django Modellvererbung und Typprüfung
- 20. Template Typprüfung C++
- 21. php array eindeutiger Typprüfung
- 22. Kotlin Methode generische Typprüfung
- 23. Python: Typprüfung Dekorateur
- 24. Typprüfung funktioniert nicht mit JSON.parse()?
- 25. Warum wird die Typprüfung in PHP "Hinting" statt "Checking" genannt?
- 26. Python: Für die Typprüfung werden Rundimporte benötigt
- 27. Wie teuer sind Fäden?
- 28. Ist die Verwendung von Attributen in .NET (C#) teuer?
- 29. TypeTree nach Typprüfung neu geschrieben
- 30. Typprüfung in Angular 2 Vorlagen
Dies ist eine umfassende und durchdachte Antwort. Danke, dass Sie das zusammen gemacht haben, schätzen Sie es! – user3325789