Welche Argumente sprechen für eine schwache Typisierung?

40

Dies kam in einer Diskussion mit einem Freund auf, und ich fand es schwer, mir irgendwelche guten Argumente auszudenken. Welche Vorteile bietet schwaches Tippen?

Fischtoaster
quelle
17
Cooper und Torczons Engineering a Compiler definieren schwache Typisierung als Verwendung eines schlecht designten Typsystems. Das hört sich sicher nicht so an, als würde es jedem nützen.
Corbin
@ Corbin March: Schön. Ich muss das zu meiner Liste hinzufügen.
Jörg W Mittag
5
Das beste Argument kann von Führungskräften aus Unternehmen angeführt werden: Es ermöglicht mir, billige Leute für den Bau meiner Systeme einzustellen
Vector

Antworten:

46

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):

  • schwache Eingabe = unsichere Eingabe / starke Eingabe = sichere Eingabe
  • Schwache Eingabe = Dynamische Eingabe / Starke Eingabe = Statische Eingabe
  • schwache Schreibweise = Entenschreiben / starke Schreibweise = nominelle Schreibweise
  • schwache Typisierung = strukturelle Typisierung / starke Typisierung = nominelle Typisierung
  • schwache Eingabe = implizite Eingabe / starke Eingabe = explizite Eingabe
  • schwache Typisierung = latente Typisierung / starke Typisierung = manifestierte Typisierung
  • 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 Eingabe = implizite Konvertierungen / starke Eingabe = nur explizite Konvertierungen
  • schwache Eingabe = implizite oder explizite Konvertierungen / starke Eingabe = überhaupt keine Konvertierungen
  • schwache Typisierung = Interpretation / starke Typisierung = Kompilierung
  • schwache Eingabe = langsam / starke Eingabe = schnell
  • schwache Eingabe = Speicherbereinigung / starke Eingabe = manuelle Speicherverwaltung
  • schwache Eingabe = manuelle Speicherverwaltung / starke Eingabe = Garbage Collection
  • … und viele andere

Die drei am häufigsten verwendeten Definitionen sind jedoch

  • schwache Eingabe = deine blöde beschissene Programmiersprache / starke Eingabe = meine super-geniale Programmiersprache
  • schwache Typisierung = jede andere Programmiersprache / starke Typisierung = die einzige Programmiersprache, die ich je 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 Typisierung = jede Sprache, die ich nicht verstehe / starke Typisierung = Java (nach Belieben durch C # oder C ++ ersetzen)

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.

Jörg W. Mittag
quelle
5
Ziemlich zynische Antwort! Ich verstehe, woher Sie kommen, aber ich denke, es ist "gut genug", um zu erraten, dass sich jeder, der keine Definition liefert, auf "schwaches und / oder dynamisches Tippen" bezieht, weshalb ich beide in meine Antwort aufgenommen habe. Ich weiß, dass es nicht perfekt ist, aber die meisten Leute scheinen sich bei der Definition von Typsystemen abzustimmen.
Nicole
7
@Renesis: Ich würde es "Realismus" nennen :-) Ich habe genug Diskussionen über Typsysteme gesehen, um zu erkennen, dass die Hälfte der Leute nicht merkt, dass sie über ganz andere Dinge sprechen und die anderen nicht wissen, wovon sie sprechen über alles . Vor ein paar Monaten gab es eine Diskussion über die Kernentwicklungsliste einer Sprache, die ich nicht nennen möchte, über das Hinzufügen eines optionalen Typsystems, um die Leistung zu verbessern. Diese Diskussion dauerte eine Woche und beinhaltete Dutzende von Leuten und Hunderte von Mails. Nicht ein erkannt , dass ein optionales Typ - System per Definition nicht die Leistung verbessern kann. …
Jörg W Mittag
8
+1 für Cynismus! Sie könnten hinzufügen "starke Typisierung = wenn die IDE die Typen meiner Variablen kennt (Intellisense usw.), schwache Typisierung = wenn dies nicht der Fall ist)"
user281377
1
Den besser definierten Namen für Typisierungssysteme fehlt das implizite Werturteil, das schwach und stark ist.
Eva
1
Wunderschön, unterhaltsam und genau. Je mehr ich über Typensysteme gelernt habe, desto mehr wurde mir klar, wie lange ich unter der Illusion gelitten habe, dass eine Sprache sich in einer Weise von der anderen unterscheidet, als es überhaupt nicht der Fall war. Es ist erstaunlich, wie viel Verwirrung dieses Konzept verursacht, und ich denke, es ist wirklich nicht notwendig, wenn wir akzeptieren, dass schwach / stark keine echte Sache ist. Sprechen wir also über etwas, das tatsächlich ist, und vielleicht werden wir etwas lernen.
BrianH
25

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

Dynamische Eingabe

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;
}

Loses oder schwaches Tippen

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

Leistungen:

  • Übergeben Sie einen beliebigen Typwert als Parameter an eine Funktion . Nützlich für Rückrufe, flexible APIs und vereinfacht die Implementierung von Closures.
  • 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.

Nicole
quelle
1
Dynamische Typisierung ist auch dann von Vorteil, wenn in einer statisch getippten Sprache viel Code generiert werden muss. Vergleichen Sie den Umfang der Codegenerierung, der beispielsweise für Entity Framework in C # erforderlich ist, mit ORM-Bibliotheken in dynamisch typisierten Sprachen (PHP, Python usw.). Obwohl einige argumentieren mögen, dass die Vorteile in Bezug auf IDE IntelliSense die Kosten für die gesamte Codegenerierung überwiegen ...
Dean Harding
3
Ihr Kommentar "// no i = ((Array) data) .length oder Array myArr = (Array) data;" hat eigentlich nichts mit dynamischer Typisierung zu tun, da das Array von Daten zur Kompilierungszeit nachweisbar ist. Eine statisch typisierte Sprache könnte Wissen verbreiten, das von instanceof erhalten wurde.
Peter Taylor
@Peter Taylor, ich nehme an, das stimmt in einfachen Fällen. Weißt du, dass jemand das tut? Es hat mit dynamischer Eingabe zu tun 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.
Nicole
@Renesis, ich weiß nicht, nein. Die ML-Sprachfamilie ist jedoch statisch typisiert und verwendet die Typinferenz, sodass Sie den Typ einer Variablen nur sehr selten explizit angeben müssen.
Peter Taylor
1
@ Peter Taylor ist richtig. Viele der Vorteile der dynamischen Eingabe sind in Sprachen mit besseren statischen Eingabesystemen verfügbar, wie z. B. Haskell, Scala oder in einigen Fällen sogar C #. Ich würde sagen, dass der Hauptvorteil der dynamischen Typisierung darin besteht, Dinge zu behandeln, die von Natur aus typenlos sind, wie beispielsweise HTML DOM. Warum schreiben Sie den Knoten ["attr"] anstelle von node.attr? Sie werden ohnehin immer zur Laufzeit aufgelöst.
Matt Olenik
7

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.

Berin Loritsch
quelle
2
Ich verstehe nicht, warum eine stark typisierte Sprache nicht so effizient kompiliert werden kann wie C. Der Compiler sollte jedoch weitaus komplexer sein.
9000
2
C ++ ist ein Beispiel für eine solche Sprache. In C ++ wird die Typprüfung zur Kompilierungszeit und keine zur Laufzeit durchgeführt ... WENN Sie RTTI nicht aktiviert haben.
Berin Loritsch
2
Ich bin nicht sicher, ob ich diesem Leistungsargument zustimme, aber es ist eine interessante Ansicht.
Martin Ba
2

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

Homde
quelle
1
Ich glaube nicht, dass es eine starke Korrespondenz zwischen schwach getippten Sprachen und neuen freundlichen Sprachen gibt. Ruby und Python sind stark typisiert und gelten allgemein als einsteigerfreundlich. C ist schwach getippt und gilt allgemein als Neuling feindlich.
SEPP2K
Nein, nicht die Sprache im Allgemeinen, ich habe nur über das Tippen gesprochen
Homde
2
Dynamisch und stark getippt ist die neulingfreundliche Kombination. Obwohl ich gesehen habe, dass Menschen, die von einer statisch getippten Sprache zu einer dynamisch getippten wechseln, auch wirklich verwirrt sind. Ich habe noch nie jemanden gesehen, der mit dynamisch getippt begann, da die Schulen die meiste Zeit zuerst C oder Java unterrichten.
Sternberg
3
@Mchl: Das hat nichts mit statischer / dynamischer oder starker / schwacher Typisierung zu tun. Bei der Deklaration von Typen geht es um explizite / implizite Typisierung.
Jörg W Mittag
1
Könnte genauso gut sein;) Also bin ich auch von explizit auf implizit getippte Sprache umgestiegen. Korrigieren Sie mich, wenn ich falsch liege. Pascal ist statisch, stark und explizit typisiert, während PHP dynamisch, schwach und implizit typisiert ist, nicht wahr?
Mchl