Dies kam in einer Diskussion mit einem Freund auf, und ich fand es schwer, mir irgendwelche guten Argumente auszudenken. Welche Vorteile bietet schwaches Tippen?
Dies kam in einer Diskussion mit einem Freund auf, und ich fand es schwer, mir irgendwelche guten Argumente auszudenken. Welche Vorteile bietet schwaches Tippen?
Antworten:
Das Problem bei dieser Art von Diskussion ist einfach, dass die Begriffe "schwaches Tippen" und "starkes Tippen" undefiniert sind, im Gegensatz zu beispielsweise den Begriffen "statisches Tippen", "dynamisches Tippen", "explizites Tippen", "implizites Tippen", " duck typing "," strukturelle Typisierung "oder" nominelle Typisierung ". Selbst die Begriffe "Manifest Typing" und "Latent Typing", die noch offene Bereiche der Forschung und Diskussion sind, sind wahrscheinlich besser definiert.
Solange Ihr Freund nicht den Begriff "schwache Typisierung" definiert, der stabil genug ist, um als Grundlage für eine Diskussion zu dienen, ist es nicht einmal sinnvoll, diese Frage zu beantworten.
Abgesehen von Nicks Antwort hat sich leider auch keiner der Antwortenden die Mühe gemacht, ihre Definition anzugeben, und Sie können die Verwirrung sehen, die in einigen Kommentaren auftaucht. Es ist schwer zu sagen, da niemand ihre Definitionen tatsächlich zur Verfügung stellt, aber ich glaube, ich zähle mindestens drei verschiedene auf genau dieser Seite.
Einige der häufiger verwendeten Definitionen sind (und ja, ich weiß , dass so ziemlich keiner von ihnen macht keinen Sinn, aber das sind die Definitionen ich Leute benutzen tatsächlich gesehen haben):
Die drei am häufigsten verwendeten Definitionen sind jedoch
Wenn sich nicht alle auf eine Definition einigen, was "schwaches Tippen" überhaupt ist , macht es nicht einmal Sinn, darüber nachzudenken, was seine Vorteile sein könnten. Vorteile von was? Noch schlimmer ist , wenn es keine Definition ist überhaupt , dann kann jeder verschieben nur ihre Definitionen , ihre Argumente zu passen, und jede Diskussion ist ziemlich viel garantiert devolve in einen Flamewar.
Ich selbst habe meine Definition im Laufe der Jahre mehrmals persönlich geändert und bin jetzt an dem Punkt angelangt, an dem ich die Begriffe nicht mehr für nützlich halte. Früher dachte ich auch, dass schwaches Tippen (in seinen verschiedenen Definitionen) einen Platz im Shell-Scripting hat, aber wenn ich das gleiche Problem in Bash und PowerShell lösen muss, werde ich schmerzlich daran erinnert, wie falsch ich war.
Denken Sie daran, es gibt zwei Hauptkonzepte, die häufig verwechselt werden:
Eine Programmiersprache wird als dynamisch typisiert bezeichnet, wenn der Großteil ihrer Typüberprüfung zur Laufzeit und nicht zur Kompilierungszeit ausgeführt wird. Bei der dynamischen Typisierung haben Werte Typen, Variablen jedoch nicht. Das heißt, eine Variable kann auf einen Wert eines beliebigen Typs verweisen.
Die Vorteile werden hier oft als nur für "neue" Programmierer abgelehnt, können aber auch für jeden Programmierer praktisch sein:
if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever
Weniger Code in allen Fällen, in denen Sie anderenfalls einen neuen Wert übertragen oder zuweisen müssten:
if (data is Array)) {
i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}
Schwache Typisierung bedeutet, dass eine Sprache bei Verwendung implizit Typen konvertiert (oder umsetzt).
Leistungen:
Implizite boolesche Auswertung . Jeder Typ kann als Boolescher Wert ausgewertet werden. Dies hat auch Nebeneffekte, wie zum Beispiel, dass ein Teil von a ||
bei der Zuweisung verwendet werden kann, ohne in einen Booleschen Wert zu konvertieren:
var a = param || defaultValue;
Nochmals weniger Code:
var num = 5;
var str = "Hello";
input.innerHTML = input.value = num;
for (var i=0; i < input.value; i++) { ... }
Sogar Java musste teilweise mit dem impliziten Aufruf gehen, .toString()
wenn Objekte mit a kombiniert wurden String
. Andernfalls würden Java-Programmierer es den ganzen Tag lang verfluchen (Log-Anweisungen wären außer Kontrolle).
Beide Definitionen stammen von http://en.wikipedia.org/wiki/Type_system . Es sagte es besser als ich konnte.
if
, dass die nächste Zeile legal und fehlerfrei ist , egal ob ein Block oder eine andere komplexere (auch Laufzeit- oder dynamische) Logik verwendet wird.
Das Hauptargument für eine schwache Typisierung ist die Leistung. (Hiermit wird die Frage des OP wie angegeben beantwortet.) Es gibt viele gute Diskussionen über dynamische vs. statische, implizite vs. explizite. usw.
C ist die bekannteste schwach typisierte Sprache und führt keine Laufzeitüberprüfung oder Kompilierzeitüberprüfung des Variablentyps durch. Im Wesentlichen können Sie ein char *
zu einem werfen int *
und die Sprache würde sich nicht interessieren. Also warum würdest du das tun?
Die C-Programmierung kommt der Vorgehensweise beim Zusammenbau ziemlich nahe, sodass es Zeiten gibt, in denen Sie sich nur um eine Adresse kümmern. Es ist nicht ungewöhnlich, aus void *
diesem Grund eine Referenz zu schreiben oder zu übergeben . Wenn Sie wissen, wie der Speicher organisiert ist (wieder ein C- und Assembler-Problem), können Sie einige ziemlich coole Berechnungen basierend auf der Adresse im durchführen void *
, um die benötigten Informationen zu erhalten. Auf diese Weise können Sie den Prozess, den Sie beispielsweise in Java durchlaufen müssten, kurzschließen.
Während die Typüberprüfung zur Laufzeit keinen außergewöhnlichen Overhead hat, reicht es manchmal gerade aus, um einen kritischen Abschnitt zu langsam werden zu lassen. Ich denke in diesem Fall hauptsächlich an eingebettete Programmierung und Echtzeitsysteme.
Das heißt, in den meisten Fällen hilft ein starkes Typsystem, das entweder auf Kompilierzeit oder Laufzeit überprüft wird, häufiger als es schmerzt.
Eine schwache Eingabe ist in der Regel für Anfänger einfacher zu erfassen, beispielsweise in Excel, Javascript und VBScript. Sie tauschen auch etwas Entwicklungsgeschwindigkeit gegen potenzielle Fehler.
Guter Artikel zum Thema: Starkes Tippen vs. Starkes Testen