381 Stimmen

Statisch/Dynamisch vs. stark/schwach

Ich sehe diese Begriffe in der Programmierung überall herumschwirren und habe eine vage Vorstellung davon, was sie bedeuten. Eine Suche zeigt mir, dass solche Dinge in der Tat überall auf Stack Overflow gefragt wurden. Soweit ich weiß, unterscheidet sich die statische/dynamische Typisierung in Sprachen geringfügig von der starken/schwachen Typisierung, aber was der Unterschied ist, entzieht sich mir. Verschiedene Quellen scheinen unterschiedliche Bedeutungen zu verwenden oder die Begriffe sogar austauschbar zu verwenden. Ich kann nirgends eine Quelle finden, die über beide Begriffe spricht und den Unterschied deutlich macht. Es wäre schön, wenn jemand dies hier für mich und den Rest der Welt klar formulieren könnte.

515voto

Dario Punkte 47246
  • Statische/Dynamische Typisierung geht es um wenn Typinformationen werden erfasst (entweder zur Kompilierzeit oder zur Laufzeit)

  • Starke/schwache Typisierung geht es um wie streng Typen unterschieden werden (z. B. ob die Sprache versucht, eine implizite Umwandlung von Zeichenketten in Zahlen vorzunehmen).

Siehe die wiki-Seite für ausführlichere Informationen.

239voto

Norman Ramsey Punkte 193087

Sie haben eine Schwachstelle in der Terminologie entdeckt, die Amateure verwenden, um über Programmiersprachen zu sprechen. Verwenden Sie nicht die Begriffe "stark" und "schwach" beim Tippen weil sie keine allgemein anerkannte technische Bedeutung haben. Im Gegensatz dazu, statische Typisierung bedeutet, dass die Programme vor der Ausführung geprüft und ein Programm kann abgelehnt werden, bevor es startet. Dynamische Schreibweise bedeutet, dass die Arten von Werte geprüft werden während Ausführung und eine schlecht getippte Operation kann dazu führen, dass das Programm anhält oder anderweitig einen Fehler zur Laufzeit melden . Ein Hauptgrund für die statische Typisierung ist es, Programme auszuschließen, die solche "dynamischen Typfehler" haben könnten.

Starkes Tippen bedeutet im Allgemeinen, dass es keine Schlupflöcher im Typensystem, während schwache Schreibweise bedeutet, dass das Typsystem unterlaufen werden kann (wodurch alle Garantien hinfällig werden). Die Begriffe werden oft fälschlicherweise für die statische und dynamische Typisierung verwendet. Um den Unterschied zu erkennen, denken Sie an C: Die Sprache wird bei der Kompilierung typgeprüft (statische Typisierung), aber es gibt viele Schlupflöcher; Sie können so ziemlich jeden Wert eines Typs in einen anderen Typ der gleichen Größe umwandeln - insbesondere können Sie Zeigertypen frei umwandeln. Pascal war eine Sprache, die stark typisiert sein sollte, aber bekanntlich ein unvorhergesehenes Schlupfloch hatte: einen Variantensatz ohne Tag.

Implementierungen von stark typisierten Sprachen erhalten im Laufe der Zeit oft Schlupflöcher, in der Regel, damit ein Teil des Laufzeitsystems in der Hochsprache implementiert werden kann. Zum Beispiel hat Objective Caml eine Funktion namens Obj.magic die zur Laufzeit einfach ihr Argument zurückgibt, aber zur Kompilierzeit einen Wert beliebigen Typs in einen Wert beliebigen anderen Typs umwandelt. Mein Lieblingsbeispiel ist Modula-3, dessen Entwickler das Konstrukt der Typenzuweisung als LOOPHOLE .

Allerdings kann man sich nicht darauf verlassen, dass zwei Menschen die Worte "stark" und "schwach" auf genau dieselbe Weise verwenden. Vermeiden Sie sie also.

100voto

mehmet Punkte 6723

Einfach ausgedrückt: In einem statisch typisierte Sprache der Typ ist statisch d. h., wenn Sie eine Variable einmal auf einen Typ festgelegt haben, können Sie sie NICHT mehr ändern. Das liegt daran, dass die Typisierung mit der Variablen und nicht mit dem Wert verbunden ist, auf den sie sich bezieht.

Zum Beispiel in Java:

String str = "Hello";  //statically typed as string
str = 5;               //would throw an error since java is statically typed

Während in einem dynamisch typisierte Sprache der Typ ist dynamisch d.h. nachdem Sie eine Variable auf einen Typ gesetzt haben, können Sie sie ändern. Das liegt daran, dass die Typisierung mit dem Wert und nicht mit der Variablen verbunden ist.

Zum Beispiel in Python:

str = "Hello" # it is a string
str = 5       # now it is an integer; perfectly OK

Auf der anderen Seite ist die stark/schwach tippen in einer Sprache mit impliziten Typkonvertierungen zu tun hat (teilweise aus @Darios Antwort übernommen):

Zum Beispiel in Python:

str = 5 + "hello" 
# would throw an error since it does not want to cast one type to the other implicitly. 

während in PHP:

$str = 5 + "hello"; // equals 5 because "hello" is implicitly casted to 0 
// PHP is weakly typed, thus is a very forgiving language.

Die statische Typisierung ermöglicht die Überprüfung der Typkorrektheit zur Kompilierzeit. Statisch typisierte Sprachen werden in der Regel kompiliert, während dynamisch typisierte Sprachen interpretiert werden. Daher können dynamisch typisierte Sprachen die Typisierung zur Laufzeit überprüfen.

23voto

Dave Kirby Punkte 24272

Schwache Typisierung bedeutet, dass sich der Typ eines Objekts je nach Kontext ändern kann. In einer Sprache mit schwacher Typisierung kann zum Beispiel die Zeichenkette "123" als die Zahl 123 behandelt werden, wenn man ihr eine andere Zahl hinzufügt. Beispiele für Sprachen mit schwacher Typisierung sind bash, awk und PHP.

Eine andere Art von schwach typisierter Sprache ist C, wo 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, ihn als String zu verwenden, führt zu einem Fehler. Sowohl Java als auch Python sind stark typisiert.

Der Unterschied zwischen dynamischer und statischer Typisierung besteht darin, wann die Typregeln durchgesetzt werden. In einer statisch typisierten Sprache muss der Typ jeder Variablen und jedes Parameters im Quelltext deklariert werden und wird zur Kompilierungszeit durchgesetzt. 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.

Allerdings können die Grenzen manchmal etwas unscharf sein. So ist Java zwar statisch typisiert, aber jedes Mal, wenn Sie Reflection oder einen Cast verwenden (z. B. bei der Verwendung von Objekt-Containern), verschieben Sie die Typüberprüfung auf die Laufzeit.

Auch die meisten stark typisierten Sprachen konvertieren automatisch zwischen Ganzzahlen und Fließkommazahlen (und in einigen Sprachen auch BigInts mit beliebiger Genauigkeit).

17voto

gonz Punkte 4966

Bei meinen Recherchen zu diesem Thema bin ich heute auf diesen tollen Artikel gestoßen http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html Es hat mir viel Klarheit verschafft und ich dachte, es könnte zu einigen der großartigen Antworten oben beitragen.

Starke und schwache Typisierung:

Die wohl gebräuchlichste Art der Klassifizierung von Typsystemen ist "stark" oder "schwach". Das ist bedauerlich, denn diese Begriffe haben fast keine überhaupt keine Bedeutung haben. Es ist in begrenztem Umfang möglich, zwei Sprachen mit Sprachen mit sehr ähnlichen Schriftsystemen zu vergleichen und die eine als das stärkere dieser beiden Systeme. Darüber hinaus haben die Wörter keine Bedeutung. gar nichts.

Statische und dynamische Typen

Dies ist fast der einzige gemeinsame Kl die eine wirkliche Bedeutung hat. In der Tat wird ihre Bedeutung häufig unterschätzt [...] Dynamische und statische Typsysteme sind zwei völlig verschiedene Dinge, deren Ziele sich zufällig teilweise überschneiden.

A Quellcode untersucht und Bezeichnungen (sogenannte "Typen") für Teile der Syntax zuordnet und diese dann verwendet, um etwas über das Verhalten des Programms abzuleiten Verhalten abzuleiten. Ein dynamisches Typsystem ist ein Mechanismus, mit dem ein Compiler Code generiert, um die Art der Daten zu verfolgen (zufälligerweise auch "Typ" genannt), die das Programm verwendet. Die Verwendung des gleichen Wortes "Typ" in jedem dieser beiden Systeme ist natürlich nicht ganz zufällig; dennoch ist es am besten zu verstehen, dass es eine Art schwache historische Bedeutung. Große Verwirrung entsteht bei dem Versuch, eine Weltbild zu finden, in dem "Typ" in beiden Systemen wirklich dasselbe bedeutet Systemen dasselbe bedeutet. Das tut er nicht.

Explizite/Implizite Typen:

Wenn diese Begriffe verwendet werden, beziehen sie sich auf das Ausmaß, in dem ein Compiler über die statischen Typen von Teilen eines Programms nachdenkt. Alle Programmiersprachen verfügen über irgendeine Form der Argumentation über Typen. Einige haben mehr als andere. ML und Haskell haben implizite Typen, d.h. keine (oder nur sehr wenige, abhängig von der Sprache und den verwendeten Erweiterungen) Typendeklarationen Deklarationen erforderlich sind. Java und Ada haben sehr explizite Typen, und man muss ständig die Typen von Dingen deklarieren. Alle der oben genannten Sprachen haben (relativ, im Vergleich zu C und C++, zum Beispiel) starke statische Typ Systeme.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X