Ich sehe diese Begriffe überall in der Programmierung und ich habe eine vage Vorstellung davon, was sie bedeuten. Eine Suche zeigt mir, dass solche Dinge tatsächlich überall im Stapelüberlauf gefragt wurden. Soweit mir bekannt ist, unterscheidet sich die statische / dynamische Eingabe in Sprachen geringfügig von der starken / schwachen Eingabe, aber was dieser Unterschied ist, entgeht mir. Unterschiedliche Quellen scheinen unterschiedliche Bedeutungen zu verwenden oder die Begriffe sogar austauschbar zu verwenden. Ich kann keinen Ort finden, der über beides spricht und tatsächlich den Unterschied ausdrückt. Was schön wäre, wäre, wenn jemand dies hier für mich und den Rest der Welt klar formulieren könnte.
318
Antworten:
Bei der statischen / dynamischen Typisierung geht es darum, wann Typinformationen erfasst werden (entweder zur Kompilierungszeit oder zur Laufzeit).
Bei der starken / schwachen Typisierung geht es darum, wie streng Typen unterschieden werden (z. B. ob die Sprache versucht, eine implizite Konvertierung von Zeichenfolgen in Zahlen durchzuführen).
Weitere Informationen finden Sie auf der Wiki-Seite .
quelle
"12" + "34"
es gleich wäre"46"
, aber"12" + "34Q"
gleich wäre"1234Q"
[zum Glück könnte man schreiben,"12" & "34"
wenn man Verkettung wollte]. Seltsamerweise speicherten Variablen, die Zahlen enthielten, diese als Gleitkommazahlen mit doppelter Genauigkeit, und die Mathematik für solche Variablen verwendete die Gleitkommawerte ohne String-Munging, aber es gab keine Möglichkeit zu fragen, ob eine Variable eine Zeichenfolge oder eine Zahl war.Sie haben eine Schwachstelle in der Terminologie entdeckt, mit der Amateure über Programmiersprachen sprechen. Verwenden Sie nicht die Begriffe "stark" und "schwach" , da sie keine allgemein anerkannte technische Bedeutung haben. Im Gegensatz dazu bedeutet statische Typisierung , dass Programme vor der Ausführung überprüft werden und ein Programm möglicherweise vor dem Start abgelehnt wird. Dynamische Typisierung bedeutet , dass die Art der Werte werden überprüft während der Ausführung , und ein schlecht getippt Betrieb könnte das Programm zu stoppen verursachen oder sonst ein Fehlersignal zur Laufzeit . Ein Hauptgrund für die statische Typisierung besteht darin, Programme auszuschließen, die solche "dynamischen Typfehler" aufweisen könnten.
Starke Typisierung bedeutet im Allgemeinen, dass das Typensystem keine Lücken aufweist , während schwache Typisierung bedeutet, dass das Typensystem untergraben werden kann (wodurch alle Garantien ungültig werden). Die Begriffe werden häufig falsch verwendet, um statische und dynamische Typisierung zu bezeichnen. Um den Unterschied zu erkennen, denken Sie an C: Die Sprache wird beim Kompilieren typgeprüft (statische Typisierung), aber es gibt viele Lücken. Sie können einen Wert eines beliebigen Typs so gut wie in einen anderen Typ derselben Größe umwandeln - insbesondere können Sie Zeigertypen frei umwandeln. Pascal war eine Sprache, die stark typisiert werden sollte, aber bekanntermaßen eine unvorhergesehene Lücke hatte: ein Variantendatensatz ohne Tag.
Implementierungen stark typisierter Sprachen führen im Laufe der Zeit häufig zu Lücken, sodass ein Teil des Laufzeitsystems in der Hochsprache implementiert werden kann. Zum Beispiel hat Objective Caml eine aufgerufene Funktion,
Obj.magic
die zur Laufzeit einfach das Argument zurückgibt, aber zur Kompilierungszeit einen Wert eines beliebigen Typs in einen beliebigen anderen Typ konvertiert. Mein Lieblingsbeispiel ist Modula-3, dessen Designer ihr Typgusskonstrukt nanntenLOOPHOLE
.Trotzdem können Sie sich nicht darauf verlassen, dass zwei Personen die Wörter "stark" und "schwach" genauso verwenden. Also vermeide sie.
quelle
Einfach ausgedrückt: In einer statisch typisierten Sprache ist der Typ statisch . Wenn Sie also eine Variable auf einen Typ gesetzt haben, können Sie ihn NICHT mehr ändern. Dies liegt daran, dass die Eingabe eher der Variablen als dem Wert zugeordnet ist, auf den sie sich bezieht.
Zum Beispiel in Java:
Während in einer dynamisch typisierten Sprache der Typ dynamisch ist , dh nachdem Sie eine Variable auf einen Typ gesetzt haben, können Sie ihn ändern. Dies liegt daran, dass die Eingabe eher dem Wert als der Variablen zugeordnet ist.
Zum Beispiel in Python:
Andererseits hängt die starke / schwache Eingabe in einer Sprache mit impliziten Typkonvertierungen zusammen (teilweise aus der Antwort von @ Dario):
Zum Beispiel in Python:
während in PHP:
Durch statische Typisierung kann die Typkorrektheit beim Kompilieren überprüft werden. Statisch typisierte Sprachen werden normalerweise kompiliert und dynamisch typisierte Sprachen werden interpretiert. Daher können dynamisch typisierte Sprachen die Eingabe zur Laufzeit überprüfen.
quelle
Schwache Typisierung bedeutet, dass sich der Typ eines Objekts je nach Kontext ändern kann. Beispielsweise kann in einer schwach typisierten Sprache die Zeichenfolge "123" als Nummer 123 behandelt werden, wenn Sie eine weitere Nummer hinzufügen. Beispiele für Sprachen mit schwacher Typisierung sind bash, awk und PHP.
Eine andere Art von schwach typisierter Sprache ist C, bei der die Daten an einer Speicheradresse durch Casting als ein anderer Typ behandelt werden können.
In einer stark typisierten Sprache ändert sich der Typ eines Objekts nicht - ein int ist immer ein int, und der Versuch, es als Zeichenfolge zu verwenden, führt zu einem Fehler. Sowohl Java als auch Python sind stark typisiert.
Der Unterschied zwischen dynamischer und statischer Typisierung besteht darin, dass die Typregeln erzwungen werden. In einer statisch typisierten Sprache muss der Typ jeder Variablen und jedes Parameters in der Quelle deklariert werden und wird zur Kompilierungszeit erzwungen. In einer dynamisch typisierten Sprache werden die Typen nur überprüft, wenn sie zur Laufzeit verwendet werden. Java ist also statisch typisiert und Python ist dynamisch typisiert.
Die Grenzen können jedoch manchmal etwas verschwommen sein. Obwohl Java statisch typisiert ist, verschieben Sie die Typprüfung jedes Mal, wenn Sie Reflection oder eine Umwandlung verwenden (z. B. wenn Sie Container mit Objekten verwenden), auf die Laufzeit.
In ähnlicher Weise werden die am stärksten typisierten Sprachen immer noch automatisch zwischen Ganzzahlen und Gleitkommazahlen konvertiert (und in einigen Sprachen BigInts mit absoluter Genauigkeit).
quelle
f
benötigt argumentx
(fun f(x)
) [**, sodass keine Typen deklariert werden **] und der Funktionskörper istx+1
. Ohne deklarierte Typen wird der Compiler herausfinden, dassx
es sich um ein int handeln muss.- fun f x = x + 1;
val f = fn : int -> int
5 + 'c' // OK
Als ich heute über dieses Thema recherchierte, stieß ich auf diesen großartigen Artikel http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html Es gelöscht eine Menge von bis Dinge für mich und ich dachte, es könnte zu einigen der großartigen Antworten oben beitragen.
Starkes und schwaches Tippen:
Statische und dynamische Typen
Explizite / implizite Typen:
quelle
Aus Scotts Programmiersprache Pragmatik , 3. Auflage Seite 291, haben wir
In einfachen Worten bezieht sich statische / dynamische Typisierung auf die Zeit, zu der die Typprüfung stattfindet: Kompilierungszeit für statische Typisierung und Laufzeit für dynamische Sprachen. Ebenso bezieht sich starke / schwache Typisierung darauf, wie aggressiv eine Sprache bei der Durchsetzung ihres Typsystems ist.
Ich habe versucht, Scotts Beschreibung in ein schönes Diagramm zu übersetzen, das ich unten gepostet habe.
quelle
Ich denke, die anderen Kollegen haben einen guten Job gemacht, besonders. Erklären des Unterschieds zwischen statischer und dynamischer Typisierung. In Bezug auf starkes und schwaches Tippen sollte jedoch gesagt werden, dass es unterschiedliche Auffassungen / Ansichten gibt.
Hier zwei Beispiele:
Einige sagen, dass Haskell stark typisiert ist, da Sie keine Typkonvertierungen vornehmen dürfen .
Andere (z. B. Darios Ansicht) sagen, dass eine Sprache, die es erlaubt, absichtlich implizit von einer Zeichenfolge in eine Zahl umzuwandeln, schwach typisiert ist, aber selbst andere nennen dies nur Ententypisierung.
Beide Aussagen heben nicht die entgegengesetzten Extreme eines Typsystems hervor, sondern völlig unterschiedliche Aspekte. Deshalb schließe ich mich Herrn Ramseys Ansicht an, die Begriffe "stark" und "schwach" nicht zu verwenden, um zwischen Typsystemen zu unterscheiden.
quelle
Statisch v / s dynamisch typisierte Sprachen
Stark v / s schwach typisierte Sprachen
Gute weitere Lesungen
quelle
Bei statisch typisierten Sprachen müssen Sie im Allgemeinen die Variablentypen deklarieren, die dann beim Kompilieren überprüft werden, um Fehler zu reduzieren. Das Wort "statisch" in "statisch typisiert" bezieht sich auf "statische Code-Analyse", bei der der Code vor seiner Ausführung untersucht wird. Obwohl es für eine statisch typisierte Sprache möglich ist, den Typ der Variablen von der rechten Seite eines Ausdrucks oder von tatsächlichen Parametern abzuleiten, erfordern die meisten statisch typisierten Sprachen in der Praxis die explizite Deklaration von Variablentypen.
Dynamisch typisierte Sprachen erfordern im Allgemeinen keine Variablendeklarationen, um Typen zu haben, und sie leiten Variablentypen basierend auf dem Typ ab, der als Ergebnis der Auswertung der rechten Seite jeder Zuweisungsanweisung oder der tatsächlichen Parameter für einen Funktionsaufruf berechnet wurde. Da der Variablen im Laufe ihrer Lebensdauer mehrere Zuweisungen zugewiesen werden können, kann sich ihr Typ im Laufe der Zeit ändern. Aus diesem Grund wird sie als "dynamisch typisiert" bezeichnet. Außerdem muss die Laufzeitumgebung den aktuellen Typ für jede Variable verfolgen, sodass der Typ eher an den Wert als an die Variablendeklaration gebunden ist. Dies kann als RTTI-System (Runtime Type Information) betrachtet werden.
Elemente statisch und dynamisch typisierter Sprachen können kombiniert werden. Beispielsweise unterstützt C # sowohl statisch als auch dynamisch typisierte Variablen, und objektorientierte Sprachen unterstützen im Allgemeinen das Herabsetzen der Typhierarchie. Statisch typisierte Sprachen bieten normalerweise verschiedene Möglichkeiten, um die Typprüfung zu umgehen, z. B. durch Casting, Reflektion und dynamischen Aufruf.
Starke vs. schwache Typisierung bezieht sich auf ein Kontinuum dessen, wie sehr die Sprache versucht, Fehler zu verhindern, weil eine Variable verwendet wird, als wäre es ein Typ, obwohl es sich tatsächlich um einen anderen Typ handelt. Zum Beispiel sind sowohl C als auch Java statisch typisierte Sprachen, Java verwendet jedoch eine viel stärkere Typprüfung als C. Der folgende C-Code kompiliert und führt gerne aus und fügt zur Laufzeit einen zufälligen Wert in die Variable b ein, was höchstwahrscheinlich a verursacht Fehler:
Der entsprechende Java-Code erzeugt einen Kompilierungsfehler, der im Allgemeinen vorzuziehen ist:
quelle