Frage

Ich sehe diese Begriffe Runde um alle über dem Platz in der Programmierung und ich habe eine vage Vorstellung von dem, was Sie bedeuten.Eine Suche zeigt mir, dass solche Dinge wurden gebeten, alle über stack-overflow-in der Tat.So weit ich bin mir bewusst, Statische/Dynamische Typisierung in Programmiersprachen ist subtil anders zu Starke/Schwache Typisierung aber was, der Unterschied ist, entzieht sich mir.Andere Quellen scheinen unterschiedliche Bedeutungen oder sogar verwenden die Begriffe Synonym.Ich kann nicht finden, irgendwo, dass die Gespräche über die beiden und tatsächlich nennt die Differenz.Was schön wäre ist, wenn jemand könnte bitte Zauber dieses aus hier deutlich für mich und den rest der Welt.

War es hilfreich?

Lösung

  • statisch / dynamisch Typing ist über , wenn Typinformationen erfasst (entweder bei der Kompilierung oder zur Laufzeit)

  • Stark / Schwach Typing ist über , wie streng Typen unterscheiden (zB ob die Sprache versucht eine implizite Konvertierung von Strings in Zahlen zu tun).

Sehen Sie die wiki-Seite für weitere Informationen.

Andere Tipps

Sie haben ein Faible in der Terminologie entdeckt, dass Amateure zu reden verwenden über Programmiersprachen. Verwenden Sie nicht die Begriffe „stark“ und „schwach“ Typisierung , weil sie nicht über ein universell auf technische Bedeutung vereinbart. Im Gegensatz dazu statische Typisierung bedeutet, dass Programme sind überprüft, bevor ausgeführt wird, und ein Programm könnte abgelehnt werden, bevor es beginnt. Dynamische Typisierung bedeutet, dass die Arten von Werte geprüft während Ausführung , und ein schlecht getippt Betrieb könnte das Programm führen zum Stillstand oder sonst Signal zur Laufzeit eines Fehlers . Ein Hauptgrund für statische Typisierung ist Programme auszuschließen, dass solche „dynamischen Typ Fehler“ haben könnte.

Starke Typisierung im Allgemeinen bedeutet, dass es keine Lücken in der Art System, während schwache Typisierung , um das Typsystem bedeutet, kann unterminiert werden (Ungültigkeits irgendwelche Garantien). Die Begriffe werden oft fälschlicherweise auf mittlere statische und dynamische Typisierung verwendet. Um den Unterschied, denken Sie an C zu sehen: die Sprache Typ-geprüft ist bei der Kompilierung (statische Typisierung), aber es gibt viele Lücken; Sie können so ziemlich einen Wert eines beliebigen Typs in einem anderen Typ von gleicher Größe --- insbesondere gegossen, können Sie Zeigertypen frei werfen. Pascal war eine Sprache, die stark typisiert werden sollte, aber bekanntlich hatte eine unvorhergesehene Lücke. Eine Variante Datensatz ohne Tag

Implementationen von stark typisierten Sprachen oft acquire Lücken im Laufe der Zeit, in der Regel so, dass ein Teil des Laufzeitsystems kann in der Hochsprache implementiert werden. Zum Beispiel hat das Ziel Caml eine Funktion Obj.magic genannt, die den Laufzeiteffekt einfach Rückkehr sein Arguments, aber zum Zeitpunkt der Kompilierung wandelt sie einen Wert von jeder Art zu einem eines anderen Typ. Mein Lieblingsbeispiel ist Modula-3, deren Designer aufgerufen, ihre Art Guss Konstrukt LOOPHOLE.

Having said that, Sie sich nicht auf zwei Personen zählen die Worte „stark“ und „schwach“ mit in genau der gleichen Weise. So vermeiden sie.

Es wird einfach so: in einem statisch typisierte Sprache der Typ statisch , was bedeutet, wenn Sie eine Variable auf einen Typ festgelegt, können Sie es nicht ändern. Das ist, weil die Eingabe mit der Variablen verbunden ist, eher als der Wert, den es 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 dynamische , was bedeutet, wenn Sie eine Variable auf einen Typ festgelegt, können Sie es ändern. Das ist, weil die Eingabe mit dem Wert zugeordnet ist, anstatt die Variablen.

Zum Beispiel in Python:

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

Auf der anderen Seite, die stark / schwach Typisierung in einer Sprache zu impliziten Typumwandlungen verwendet ist (teilweise genommen von @ Dario Antwort):

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.

Statische Typisierung ermöglicht die Richtigkeit der Typen bei der Kompilierung zu überprüfen. Statisch typisierte Sprachen sind in der Regel erstellt und dynamisch typisierten Sprachen interpretiert werden. Daher dynamicly typisierten Sprachen können zur Laufzeit überprüfen Tippen.

Schwache Typisierung bedeutet, dass der Typ eines Objekts kann je nach Kontext ändern. Zum Beispiel in einer schwach typisierte Sprache der Zeichenfolge „123“ als die Nummer 123 behandelt werden, wenn Sie eine andere Nummer hinzufügen. Beispiele für Sprachen mit schwacher Typisierung sind bash, awk und PHP.

Eine andere Art von schwach typisierte Sprache ist C, wobei die Daten an einer Speicheradresse kann als eine andere Art von Gießen behandelt werden.

In einer stark typisierte Sprache der Typ eines Objekts nicht ändert - ein int ist immer ein int und versucht, es als eine Zeichenfolge zu verwenden, zu einem Fehler führen. Sowohl Java und Python sind stark typisiert.

Der Unterschied zwischen dynamischer und statischer Typisierung ist, wenn die Typregeln durchgesetzt werden. In einer statisch typisierten Sprache muss der Typ jeden Variablen und Parameter in der Quelle deklariert werden und wird bei der Kompilierung durchgesetzt. In einer dynamisch typisierte Sprache werden die Typen nur überprüft, wenn sie zur Laufzeit verwendet werden. So Java ist statisch typisiert und Python ist dynamisch typisiert.

Allerdings können die Grenzen ein wenig verschwommen manchmal sein. Zum Beispiel, obwohl Java statisch typisiert ist, verwenden Sie jedes Mal, wenn Reflexion oder eine Besetzung (z.B. bei der Verwendung von Containern von Gegenständen) sie Ihnen die Typprüfung zur Laufzeit sind aufzuschieben.

Auch die meisten stark typisierten Sprachen werden noch automatisch konvertieren zwischen ganzen Zahlen und Schwimmer (und in einigen Sprachen abitrary Präzision BigInts).

Heute zu diesem Thema forscht ich über diesen großen Artikel kam http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html Es gelöscht eine Menge Dinge für mich und ich dachte, es kann über einige der großen Antworten hinzuzufügen.

Starke Typisierung:

  

Die wohl gängigste Methode Typsysteme klassifiziert werden, ist „stark“   oder „schwach“. Dies ist bedauerlich, da diese Worte fast nicht haben   überhaupt bedeutet. Es ist in begrenztem Umfang möglich, zwei vergleichen   Sprachen mit sehr ähnlichen Systemen des Typs und designierte ein als mit   desto stärker ist dieser beiden Systeme. Darüber hinaus bedeuten die Worte nichts   überhaupt.

Statische und dynamische Typen

  

Das ist fast die einzige gemeinsame Klassifikation der Typsysteme   das hat wirkliche Bedeutung. Wie in der Tat ist es die Bedeutung   häufig unterschätzt [...] Dynamische und statische Typsysteme sind   zwei völlig verschiedene Dinge, deren Ziele passieren teilweise zu   Überlappung.

     

A vom statischen Typ-System ist ein Mechanismus, mit dem eine Compiler Sucht   Quellcode und Abtretungs Labels Stücke des ( „Typen“ genannt)   Syntax und dann nutzt sie etwas über das im Programm zu schließen   Verhalten. Ein dynamischer Typ-System ist ein Mechanismus, mit dem ein Compiler   erzeugt Codespur von der Art von Daten zu halten (zufälligerweise auch   seine „type“), die von dem Programm aufgerufen. Die Verwendung des gleichen Wortes   „Type“ in jeder dieser beiden Systeme ist natürlich nicht wirklich ganz   zufällig; aber es ist am besten als eine Art schwach mit   Historische Bedeutung. Große Verwirrung ergibt sich aus versuchen, eine finden   Weltanschauung, in der „Typ“ wirklich bedeutet, das gleiche in beiden   Systeme. Es funktioniert nicht.

Explicit / Implizit Arten:

  

Wenn diese Begriffe verwendet werden, werden sie in dem Maße beziehen sich auf dem ein   Compiler Grund, sich über die statischen Typen von Teilen eines Programms. Alle   Programmiersprachen haben irgendeine Form über die Arten der Argumentation. Etwas   haben mehr als andere. ML und Haskell haben implizite Typen, dass keine   (Oder nur sehr wenige, in Abhängigkeit davon, die Sprache und Erweiterungen in Verwendung) Typ   Erklärungen sind erforderlich. Java und Ada haben sehr explizite Typen und   man erklärt immer wieder die Art von Dingen. Alle oben von der haben   (Relativ im Vergleich zu C und C ++, zum Beispiel) stark statischer Typ   Systeme.

Von Scotts Programmiersprache Pragmatik , 3. Auflage Seite 291, haben wir

  

Die Typprüfung ist der Prozess der Sicherstellung, dass ein Programm das gehorcht   Sprache des Typkompatibilitätsregeln. Eine Verletzung der Regeln ist bekannt,   als eine Art Zusammenstoß. Eine Sprache wird gesagt, dass stark typisierte , wenn es   in einer Art und Weise verbietet, dass die Sprache, die Umsetzung, die durchsetzen kann   Anwendung einer Operation auf jedes Objekt, das nicht beabsichtigt ist,   unterstützen, die Operation. Eine Sprache wird gesagt, zu statisch typisierten , wenn   es ist stark typisiert und Typprüfung kann bei der Kompilierung durchgeführt werden   Zeit. Im engeren Sinne des Wortes, sind einige Sprachen statisch   eingegeben haben. In der Praxis angewandte Termis oft zu Sprachen, in denen   die meisten Typprüfung kann bei der Kompilierung durchgeführt werden, und der Rest kann   zur Laufzeit durchgeführt werden.

     

Ein paar Beispiele: Ada ist stark typisiert, und zum größten Teil   statisch typisiert (bestimmte Art Einschränkungen müssen zur Lauf geprüft werden   Zeit). Eine Pascal-Implementierung kann auch die meisten seiner Typprüfung tun   bei der Kompilierung, wenn die Sprache nicht ganz stark typisiert:   unmarkierte Variante Aufzeichnungen (in Abschnitt 7.3.4 diskutiert) sind ihre   nur Schlupfloch. C89 ist deutlich stärker typisiert als sein   Vorgänger Dialekte, aber deutlich weniger nach wie vor stark typisierte als   Pascal. Seine Lücken gehören Gewerkschaften, subroutineswith variable Zahlen   von Parametern, und der Interoperabilität von Zeigern und Arrays (sein   in Abschnitt 7.7.1) diskutiert. Implementationen von C selten überprüfen   alles zur Laufzeit.

     

Dynamisch (Laufzeit) Typprüfung ist eine Form der späten Bindung, und neigt dazu,   wird in Sprachen gefunden, die anderen Probleme bis zur Laufzeitverzögerung   Gut. Lisp und Smalltalk sind dynamisch (wenn auch stark) eingegeben haben. Die meisten   Skriptsprachen werden auch dynamisch typisierte; einige (zum Beispiel Python und   Rubin) sind stark typisiert. Sprachen mit dynamischen Scoping sind in der Regel   dynamisch typisierte (oder gar nicht eingegeben): wenn der Compiler kann nicht   identifiziert das Objekt, der ein Name bezieht, kann sich in der Regel nicht bestimmen   die Art des Objekts entweder.

So in einfachen Worten, statische / dynamische Typisierung bezieht sich auf die Zeit, wenn die Typprüfung stattfindet: die Kompilierung für statische Typisierung und Laufzeit für dynamische Sprachen. Ebenso stark / schwach Typisierung bezieht sich, wie aggressive eine Sprache ist ihre Art System bei der Durchsetzung.

Ich habe versucht, Scotts Beschreibung in ein schönes Diagramm zu übersetzen, die ich weiter unten geschrieben habe.

Ich denke, die anderen Kollegen esp einen guten Job gemacht. Erklären Sie den Unterschied zwischen statischer und dynamischer Typisierung. Aber soweit Starke Typisierung betrifft, so sollte man sagen, dass es unterschiedliche Auffassungen / Ansichten.

Hier zwei Beispiele:

  • Einige sagen, dass Haskell stark typisiert ist, weil es nicht erlaubt zu machen jeder Typkonvertierungen.

  • Andere (z Dario Ansicht) sagen, eine Sprache, die von String-Nummer absichtlich implizit konvertieren zu schwach typisiert ist, sondern auch andere nennen diese nur Ente eingeben.

Beide Aussagen markieren nicht die entgegengesetzten Extremen eines Typ-System, aber ganz andere Aspekte. Also ich Mr. Ramsey Sicht nicht verwenden die Begriffe „stark“ und „schwach“ zu unterscheiden zwischen Typ-Systemen verbinden.

Statisch v/s dynamisch typisierte Sprachen

  • Statisch typisierte Sprachen sind jene, in denen die Typprüfung erfolgt zur compile-Zeit, so bedeutet dies auch, dass in statisch typisierten Sprachen, jede variable hat einen Typ und es ändert sich nicht im Verlauf. Nun, im Gegensatz, dynamisch typisierte Sprachen sind jene, in denen die Typprüfung erfolgt zur Laufzeit, und es gibt keine Typüberprüfung zur Kompilierzeit, so bedeutet dies auch, dass in dynamisch typisierten Sprachen kann es sein, ein im Zusammenhang mit einer Variablen, und wenn ein Typ zugeordnet ist, dann könnte es ein generischer Typ wie "var" in JS, die gut für beide ein string und number.
    • “Implementierungen von dynamisch-Typ-geprüft Sprachen in der Regel verbinden jede runtime-Objekt mit einem Typ-tag (d.h., ein Verweis auf einen Typ), die mit seinen Informationen.Diese Laufzeit-Typinformationen (RTTI) kann auch verwendet werden, um die Implementierung dynamischer Versand, späte Bindung, unten Gießen, Reflexion, und ähnliche Funktionen."
  • Auch wenn die Sprache statisch typisiert, dennoch könnte es haben einige dynamisch typisierte Funktion, was im Grunde bedeutet, dass irgendeine Art von Typüberprüfung zur Laufzeit als gut.Dies ist hilfreich für casting von Typen.
    • “Eine Reihe von nützlichen und gemeinsamen Programmiersprache Funktionen nicht geprüft werden kann statisch, wie unten Gießen.So viele Sprachen haben sowohl statische und dynamische Typ-überprüfung;der statische Typ-checker überprüft, was es kann, und dynamische Prüfungen überprüfen Sie den rest."
  • “Einige Sprachen ermöglichen das schreiben von code ist nicht Typ-sicher.Zum Beispiel, in C-Programmierer können frei werfen einen Wert zwischen zwei Typen, die haben die gleiche Größe."
  • Vorteil von "statisch" typisierte Sprachen sind:
    • Da die meisten Typ-überprüfung wird durchgeführt zur compile-Zeit, so Dolmetscher oder Laufzeit können run bei voller Geschwindigkeit, ohne sich Gedanken über den Typen.
    • Es führt zu einer geringeren Anzahl von runtime-Ausnahme oder Fehler in Bezug auf Typ, weil die meisten der Typ-überprüfung erfolgt bei der Kompilierung.
  • Vorteil von "dynamisch typisierte Sprachen sind:
    • Sie könnten helfen, sehr schnell prototyping, da Entwickler brauchen nicht zu verstehen, die Art system, so, dev kann Locker Variablen erstellen und ausführen, und dies führt zu sehr schnellen prototyping.
  • Liste der statisch und dynamisch typisierte Sprachen:
    • Statisch:
      • Java
      • C (C ist eine statisch typisierte Sprache, aber weniger "stark" typisiert als im Vergleich zu Java, da es ermöglicht, mehr implizite Konvertierungen)
      • C++
      • C#
    • Dynamisch:
      • PERL
      • PHP
      • Python
      • JavaScript
      • Ruby
  • Typ-Prüfung ist ein wichtiges Sicherheits-feature. Angenommen, es gibt keine Typüberprüfung, und eine Methode nimmt ein Objekt vom Typ "Konto", die eine Methode namens als "creditAccount(BankAccountDetails)", die nun zur Laufzeit, wenn es ist keine Typ-überprüfung, dann kann ich übergeben Sie ein Objekt meiner eigenen Klasse die gleiche Methode, die "creditAccount(BankAccountDetails)" und es wird ausgeführt, wenn man bedenkt, wir reden über Objekt-orientierten Sprache, weil OOP unterstützt "Polymorphismus" und hier, was wir diskutieren, ist nichts als "Polymorphismus".Also, im Grunde einer Objekt-orientierten Sprache (was im Grunde bedeutet, es unterstützt die "Polymorphie"), die nicht haben eine starke Typprüfung kann zu Sicherheitsproblemen führen.

Stark v/s schwach typisierte Sprachen

  • Stark typisierte Sprachen sind jene, in denen implizite Konvertierungen sind nicht erlaubt, wenn es ist der Verlust von Präzision.Zum Beispiel in Java, können Sie werfen ein "int" zu lange", denn es gibt keinen Verlust an Präzision, aber Sie können nicht "implizit" cast "long int", da es sonst zu einem Verlust von Präzision.Im Gegensatz dazu, in schwach typisierten Sprachen, implizite Konvertierungen sind zulässig, sogar wenn es ist der Verlust von Präzision.
  • Ich denke, dynamisch typisierten Sprache kann auch eine stark typisierte Sprache, wenn "zur Laufzeit", die es nicht erlauben, implizite Konvertierungen aus, in denen es Verlust der Genauigkeit.

Gute weitere Messwerte

Statisch typisierte Sprachen im Allgemeinen erforderlich, dass Sie die Typen von Variablen zu deklarieren, die dann bei der Kompilierung geprüft Fehler zu reduzieren. Das Wort „statisch“ in „statisch typisierte“ bezieht sich auf „statische Codeanalyse“, das ist der Prozess, den Code zu untersuchen, bevor sie ausgeführt wird. Obwohl es möglich ist, für eine statisch typisierte Sprache, die Art der Variablen auf der rechten Seite eines Ausdrucks oder tatsächlichen Parameter in der Praxis die meisten statisch typisierten Sprachen erfordern Variablentypen schließen explizit deklariert werden.

Dynamisch typisierte Sprachen im Allgemeinen erfordern keine Variablendeklarationen Typen haben, und sie schließen Variablentypen basierend auf dem Typ als Ergebnis berechnet von der rechten Seite jeder Zuweisungsanweisung oder den aktuellen Parameter zu einem Funktionsaufruf auswertet. Da die Variable kann mehrere Zuweisungen über seine Lebensdauer gegeben wird, kann seine Art im Laufe der Zeit ändern, und deshalb ist es „dynamisch typisiert“ genannt wird. Außerdem muss die Laufzeitumgebung Spur des aktuellen Typs für jede Variable halten, so dass der Typ auf den Wert gebunden ist und nicht mit der Variablendeklaration. Dies kann eine Laufzeittypinformationen (RTTI) System berücksichtigt werden.

Elemente von statisch und dynamisch typisierten Sprachen können kombiniert werden. Zum Beispiel können sowohl C # unterstützt statisch und dynamisch typisierten Variablen und objektorientierten Sprachen unterstützen allgemein abwärts Gießen der Typenhierarchie. Statisch typisierte Sprachen bieten in der Regel verschiedene Möglichkeiten, um Bypass-Typprüfung, beispielsweise durch Gießen, Reflexion und dynamischen Aufruf verwendet wird.

Starke gegen Schwache Typisierung bezieht sich auf ein Kontinuum, wie sehr die Sprache versucht Fehler wegen mit einer Variablen zu verhindern, als ob es eine Art waren, wenn es in der Tat ist eine andere Art. Zum Beispiel sowohl C und Java sind Sprachen statisch typisierte, aber Java verwendet viel stärker Typprüfung als C. Das tut folgenden C-Code ist, glücklich zu kompilieren und ausführen, und wird einen zufälligen Wert in die Variable b zur Laufzeit setzen, sehr wahrscheinlich eine Verursachung Fehler:

char *a = "123";
int b = (int)a;

Das Äquivalent von Java-Code wird einen Compiler-Fehler erzeugen, die in der Regel vorzuziehen ist:

String a = "123"
int b = (int)a;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top