it-swarm.dev

Welche Argumente sprechen für eine schwache Typisierung?

Dies kam in einer Diskussion mit einem Freund zum Vorschein, und es fiel mir schwer, mir gute Argumente auszudenken. Welche Vorteile bringt schwaches Tippen?

41
Fishtoaster

Das Problem bei dieser Art von Diskussion ist einfach, dass die Begriffe "schwache Typisierung" und "starke Typisierung" undefiniert sind, im Gegensatz zu beispielsweise den Begriffen "statische Typisierung", "dynamische Typisierung", "explizite Typisierung", "implizite Typisierung", " Ententypisierung "," strukturelle Typisierung "oder" nominelle Typisierung ". Heck, sogar die Begriffe "Manifest Typing" und "Latent Typing", die noch offene Bereiche der Forschung und Diskussion sind, sind wahrscheinlich besser definiert.

Solange Ihr Freund keine Definition des Begriffs "schwache Typisierung" liefert, die 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 entsteht. Es ist schwer zu sagen, da niemand tatsächlich seine Definitionen liefert, aber ich denke, ich zähle mindestens drei verschiedene, nur auf dieser Seite.

Einige der am häufigsten verwendeten Definitionen sind (und ja, ich weiß , dass so ziemlich keine von ihnen irgendeinen Sinn ergibt, aber das sind die Definitionen, die ich habe gesehene Leute benutzen tatsächlich):

  • schwache Eingabe = unsichere Eingabe/starke Eingabe = sichere Eingabe
  • schwache Eingabe = dynamische Eingabe/starke Eingabe = statische Eingabe
  • schwache Eingabe = Ententypisierung/starke Eingabe = nominelle Eingabe
  • schwache Typisierung = strukturelle Typisierung/starke Typisierung = nominelle Typisierung
  • schwache Eingabe = implizite Eingabe/starke Eingabe = explizite Eingabe
  • schwache Eingabe = latente Eingabe/starke Eingabe = offensichtliche Eingabe
  • schwache Eingabe = keine Eingabe/starke Eingabe = Eingabe
  • schwache Typisierung = implizite Casts/starke Typisierung = nur explizite Casts
  • schwache Typisierung = implizite oder explizite Casts/starke Typisierung = überhaupt keine Casts
  • schwache Typisierung = implizite Konvertierungen/starke Typisierung = nur explizite Konvertierungen
  • schwache Typisierung = implizite oder explizite Konvertierungen/starke Typisierung = überhaupt keine Konvertierungen
  • schwache Typisierung = Interpretation/starke Typisierung = Zusammenstellung
  • schwaches Tippen = langsames/starkes Tippen = schnell
  • schwache Eingabe = Speicherbereinigung/starke Eingabe = manuelle Speicherverwaltung
  • schwache Eingabe = manuelle Speicherverwaltung/starke Eingabe = Speicherbereinigung
  • … und viele andere

Die drei Definitionen, die am häufigsten verwendet werden , sind jedoch

  • schwaches Tippen = deine blöde beschissene Programmiersprache/starkes Tippen = meine super-tolle Programmiersprache
  • schwache Schreibweise = jede andere Programmiersprache/starke Schreibweise = die einzige Programmiersprache, die ich jemals gelernt habe (normalerweise entweder Java, C # oder C++; seltsamerweise scheinen Leute, die zB Haskell oder Scheme als ihre erste und einzige Sprache lernen, nicht zu teilen diese Weltanschauung)
  • schwache Eingabe = jede Sprache, die ich nicht verstehe/starke Eingabe = Java (nach Belieben durch C # oder C++ ersetzen)

Wenn sich nicht alle auf eine Definition der "schwachen Typisierung" einigen , ist es nicht einmal sinnvoll, über die möglichen Vorteile nachzudenken. Vorteile von was? Schlimmer noch, wenn es überhaupt keine Definition gibt , kann jeder seine Definitionen einfach an seine Argumente anpassen, und es ist so gut wie garantiert, dass sich jede Diskussion entwickelt in einen Flammenkrieg.

Ich selbst habe meine eigene Definition im Laufe der Jahre mehrmals geändert und bin jetzt an einem 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 in Shell-Skripten hat, aber wenn ich das gleiche Problem in Bash und PowerShell lösen muss, werde ich schmerzlich daran erinnert, wie falsch ich war.

46
Jörg W Mittag

Denken Sie daran, dass es zwei Hauptkonzepte gibt, die häufig verwechselt werden:

Dynamische Eingabe

Eine Programmiersprache wird als dynamisch typisiert bezeichnet, wenn der Großteil ihrer Typprüfung zur Laufzeit und nicht zur Kompilierungszeit durchgeführt wird. Bei der dynamischen Typisierung haben Werte Typen, Variablen jedoch nicht. Das heißt, eine Variable kann sich auf einen Wert eines beliebigen Typs beziehen.

Die Vorteile hier werden oft nur für "neue" Programmierer abgetan, können aber auch für jeden Programmierer praktisch sein:

if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever

Weniger Code in jedem Fall, in dem Sie sonst einen neuen Wert umwandeln oder zuweisen müssten:

if (data is Array)) {
    i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}

Lose oder schwache Eingabe

Schwache Typisierung bedeutet, dass eine Sprache bei Verwendung implizit Typen konvertiert (oder umwandelt).

Leistungen:

  • Übergeben Sie einen beliebigen Typwert als Parameter an eine Funktion . Nützlich für Rückrufe, flexible APIs und für eine einfachere Implementierung von Schließungen.
  • Implizite boolesche Auswertung . Jeder Typ kann als Boolescher Wert ausgewertet werden. Dies hat auch Nebeneffekte, da ein Teil eines || Bei der Zuweisung ohne Konvertierung in einen Booleschen Wert verwendet werden kann:

    var a = param || defaultValue;
    
  • Wieder 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 gehen, mit dem impliziten Aufruf von .toString(), wenn Objekte mit einem String kombiniert wurden; andernfalls Java = Programmierer würden es den ganzen Tag verfluchen (Protokollanweisungen wären außer Kontrolle geraten).


Beide Definitionen stammen von http://en.wikipedia.org/wiki/Type_system . Es sagte es besser als ich konnte.

25
Nicole

Das Hauptargument für schwache Typisierung ist die Leistung. (Dies dient zur Beantwortung der OP-Frage wie angegeben). Es gibt viele gute Diskussionen über dynamisch vs. statisch, implizit vs. explizit. usw.

C ist die bekannteste schwach typisierte Sprache und führt keine Laufzeit- oder Kompilierungszeitprüfung des Variablentyps durch. Im Wesentlichen können Sie einen char * In einen int * Umwandeln, und die Sprache würde sich nicht darum kümmern. Warum sollten Sie das tun?

Die C-Programmierung ist ziemlich ähnlich wie bei Assembly, daher gibt es Zeiten, in denen Sie sich nur um eine Adresse kümmern. Aus diesem Grund ist es nicht ungewöhnlich, eine void * - Referenz zu besetzen oder zu übergeben. Wenn Sie wissen, wie der Speicher organisiert ist (wieder ein C- und Assembly-Problem), können Sie einige ziemlich coole Berechnungen basierend auf der Adresse im void * Durchführen, um die benötigten Informationen zu erhalten. Auf diese Weise können Sie den Prozess kurzschließen, den Sie beispielsweise in Java) durchlaufen müssten.

Während die Überprüfung des Laufzeit-Typs keinen außergewöhnlichen Aufwand verursacht, reicht es manchmal aus, einen kritischen Abschnitt zu langsam zu machen. Ich denke in diesem Fall hauptsächlich an eingebettete Programmierung und Echtzeitsysteme.

In den meisten Fällen hilft es jedoch häufiger, ein starkes Typsystem zu haben, bei dem entweder die Kompilierungszeit oder die Laufzeit überprüft wird, als es weh tut.

7
Berin Loritsch

Schwache Eingaben sind für Neulinge in der Regel leichter zu verstehen, beispielsweise in Excel, Javascript und VBScript. Sie tauschen auch eine gewisse Entwicklungsgeschwindigkeit gegen mögliche Fehler.

Guter Artikel zu diesem Thema: Starkes Tippen gegen starkes Testen

2
Homde