Was ist der Unterschied zwischen einer stark typisierte Sprache und einer statisch typisierte Sprache?

StackOverflow https://stackoverflow.com/questions/2690544

Frage

Auch bedeutet das eine das andere?

War es hilfreich?

Lösung

  

Was ist der Unterschied zwischen einer stark typisierte Sprache und einer statisch typisierte Sprache?

Eine statisch typisierte Sprache hat ein Typ-System, das bei der Kompilierung durch die Umsetzung (a Compiler oder Interpreter) überprüft wird. Die Typprüfung lehnt einige Programme und Programme, die die Prüfung in der Regel kommen mit einigen Garantien passieren; beispielsweise an der Compiler garantiert nicht Integer-Arithmetik Anweisungen auf Gleitkommazahlen zu verwenden.

Es gibt keine wirkliche Einigkeit darüber, was „stark typisierte“ bezeichnet, obwohl die am weitesten verbreitete Definition in der Fachliteratur ist, dass in einer „stark typisierte“ Sprache, es für den Programmierer zu arbeiten rund um die Beschränkungen nicht möglich ist, verhängten das Typsystem. Dieser Begriff wird fast immer verwendet, um statisch typisierten Sprachen zu beschreiben.

Statische vs dynamische

Das Gegenteil von statisch typisiert wird als „dynamisch typisiert“, was bedeutet, dass

  1. Werte zur Laufzeit verwendet werden in Typen eingeteilt.
  2. Es gibt Einschränkungen, wie diese Werte verwendet werden können.
  3. Wenn diese Beschränkungen verletzt werden, wird die Verletzung als (dynamisch) Typ Fehler gemeldet.

Zum Beispiel Lua , eine dynamisch typisierte Sprache, hat einen String-Typen, einen Nummerntyp, und einen Booleschen Typen , unter anderen. In Lua gehört jeder Wert zu genau ein Typ, aber dies ist keine Voraussetzung für alle dynamisch typisierten Sprachen. In Lua ist es zulässig, zwei Strings verketten, aber es ist nicht zulässig, einen String und einen Booleschen zu verketten.

Starke vs schwach

Das Gegenteil von „stark typisierte“ wird als „schwach typisiert“, was bedeutet, dass Sie die Art System umgehen können. C ist notorisch schwach typisiert weil jeder Zeigertyp ist umwandelbar in jeden anderen Zeigertyp einfach durch Gießen. Pascal war beabsichtigt, stark typisierte zu werden, aber ein Versehen in der Entwurf (unmarkiert Variante Datensätze) eingeführt, um eine Lücke in das Typsystem, so technisch ist es schwach typisiert. Beispiele für wirklich stark typisierte Sprachen umfassen CLU, Standard ML und Haskell. Standard ML hat in der Tat erfahren haben mehr Revisionen Lücken im Typsystem zu entfernen, die entdeckt wurden, nachdem die Sprache weit verbreitet wurde.

Was wirklich los hier?

Insgesamt ist es erweist sich als nicht so nützlich zu „stark“ und „schwach“ zu sprechen. Ob ein Typ-System eine Lücke hat, ist weniger wichtig als die genaue Anzahl und die Art der Lücken, wie wahrscheinlich sie sind in der Praxis zu kommen, und was sind die Folgen eine Lücke ausnutzen. In der Praxis ist es am besten, die Begriffe "stark" und "schwach" insgesamt , da

zu vermeiden
  • Amateure oft conflate sie mit "statisch" und "dynamisch".

  • Anscheinend „schwache Typisierung“ wird von einigen Personen zu reden über die relative prevalance oder Abwesenheit von impliziten Konvertierungen verwendet.

  • Profis können nicht genau darüber einig, was die Begriffe bedeuten.

  • Insgesamt sind Sie unwahrscheinlich, Ihr Publikum zu informieren oder zu erleuchten.

Die traurige Wahrheit ist, dass, wenn es darum geht, Systeme zu geben, „stark“ und „schwach“ nicht über eine universell auf technische Bedeutung vereinbart. Wenn Sie die relative Stärke des Typs diskutieren wollen Systeme, ist es besser, genau zu diskutieren, was Garantien sind und nicht vorgesehen sind. Zum Beispiel ist eine gute Frage zu stellen dies: „ist jeder Wert eines bestimmten Typs (oder Klasse) garantierte erstellt wurde, von einer vom Typ des einzelnen Konstrukteure nennen?“ In C ist die Antwort nein. In CLU, F # und Haskell ist es ja. Für C ++ Ich bin nicht sicher, ich würde gerne wissen.

Im Gegensatz dazu statische Typisierung bedeutet, dass Programme ü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 werden während Ausführung und einem schlechttypisierte Betrieb könnte das Programm zu stoppen verursachen oder sonst einen Fehler während der Laufzeit signalisieren. Ein Hauptgrund für statische Typisierung ist Programme auszuschließen, dass solche „dynamischen Typ Fehler“ haben könnte.

  

Hat man impliziert die andere?

Auf einer pedantischen Ebene, nein, weil das Wort „stark“ nicht wirklich etwas bedeuten. Aber in der Praxis, die Menschen fast immer tun, eines von zwei Dingen:

  • Sie (fälschlicherweise) Gebrauch „stark“ und „schwach“ bedeutet „statisch“ und „dynamisch“, in welchem ??Fall sie (fälschlicherweise) werden als „stark typisierte“ und „statisch typisierte“ austauschbar verwendet.

  • Sie nutzen „stark“ und „schwach“ Eigenschaften von statischen Typ Systeme zu vergleichen. Es ist sehr selten jemand die Rede von einem „starken“ oder „schwach“ dynamischem Typsystem zu hören. Mit Ausnahme von FORTH, die nicht wirklich jede Art von einem Typ-System haben, kann ich nicht denken Sie an eine dynamisch typisierte Sprache, wo das Typsystem unterminiert werden kann. Eine Art von Definition, werden diese Kontrollen in die Ausführungsmaschine bulit, und jeder Betrieb für geistige Gesundheit wird geprüft, bevor ausgeführt wird.

So oder so, wenn eine Person ruft eine Sprache „stark typisierte“, ist diese Person sehr wahrscheinlich ist, um eine statisch typisierte Sprache zu sprechen.

Andere Tipps

Dies ist oft falsch verstanden, so lassen Sie es mich aufklären.

statisch / dynamisch Typing

Statische Typisierung ist, wo der Typ ist gebunden an den Variable . Typen werden bei der Kompilierung geprüft.

Dynamische Typisierung ist, wo der Typ ist gebunden an den Wert . Typen werden zur Laufzeit überprüft werden.

So in Java zum Beispiel:

String s = "abcd";

s wird "für immer" ein String sein. Während seiner Laufzeit kann es zu unterschiedlichen Strings Punkt (seit s eine Referenz in Java ist). Es kann einen null Wert hat, aber es wird nie zu einem Integer oder List beziehen. Das ist statische Typisierung.

In PHP:

$s = "abcd";          // $s is a string
$s = 123;             // $s is now an integer
$s = array(1, 2, 3);  // $s is now an array
$s = new DOMDocument; // $s is an instance of the DOMDocument class

Das ist dynamische Typisierung.

Stark / Schwach Typing

(Edit Alarm!)

Starke Typisierung ist eine Phrase, ohne weit nach Bedeutung vereinbart. Die meisten Programmierer, die diesen Begriff mittleren etwas anderes als statische Typisierung Gebrauch verwenden, um sie zu implizieren, dass es eine Art Disziplin, die vom Compiler erzwungen wird. Zum Beispiel hat CLU ein starkes Typ-System, das nicht Client-Code erlaubt einen Wert von abstrakter Art zu schaffen, mit Ausnahme von den Konstrukteuren von der Art zur Verfügung gestellt werden. C hat ein etwas starkes Typ-System, aber es kann zu einem gewissen Grad „unterminiert“ werden, weil ein Programm kann immer einen Wert von einem Zeigertyp auf einen Wert eines anderen Zeigertypen umgewandelt. So zum Beispiel in C können Sie einen Wert von malloc() zurücknehmen und warf es fröhlich zu FILE*, und der Compiler wird nicht versuchen, Sie-oder sogar zu stoppen Sie warnen, dass Sie etwas vertrackt tun.

(Die ursprüngliche Antwort sagte etwas von einem Wert „nicht Typ zur Laufzeit zu ändern.“ Ich habe viele Sprachdesigner und Compiler Schriftsteller bekannt und haben nicht eine bekannt, die über Werte ändern Typ zur Laufzeit gesprochen, außer vielleicht einige sehr weit fortgeschritten Forschung in Systemen des Typs, wo dies als „starke Update-Problem“ bezeichnet.)

Schwache Typisierung bedeutet, dass die Compiler eine Typisierung discpline erzwingen, oder vielleicht, dass die Durchsetzung leicht unterlaufen werden kann.

Das Original dieser Antwort verschmelzt schwache Typisierung mit impliziter Konvertierung (manchmal auch als „implizite Förderung“ genannt). Zum Beispiel in Java:

String s = "abc" + 123; // "abc123";

Dieser Code ist ein Beispiel für implizite Förderung: 123 implizit in eine Zeichenfolge konvertiert, bevor sie mit "abc" verkettet werden. Es kann der Java-Compiler schreibt wie dieser Code argumentiert werden:

String s = "abc" + new Integer(123).toString();

Betrachten wir ein klassisches PHP "beginnt mit" Problem:

if (strpos('abcdef', 'abc') == false) {
  // not found
}

Der Fehler ist hier, dass strpos() gibt den Index des Spiels, wobei 0 0 in boolean false gezwungen und damit die Bedingung ist tatsächlich wahr. Die Lösung ist === statt == zu verwenden implizite Konvertierung zu vermeiden.

Dieses Beispiel zeigt, wie eine Kombination aus impliziter Konvertierung und dynamischer Typisierung Programmierer der Irre führen kann.

Vergleichen Sie das Ruby:

val = "abc" + 123

, die da in Ruby ein Laufzeitfehler ist die Objekt 123 nicht implizit konvertiert, nur weil es geschieht zu einem + Methode übergeben werden. In Ruby muss der Programmierer die Umwandlung explizit machen:

val = "abc" + 123.to_s

PHP und Ruby Vergleich ist eine gute hier Abbildung. Beide sind dynamisch typisierten Sprachen, aber PHP hat viele implizite Konvertierungen und Ruby (vielleicht überraschend, wenn Sie nicht vertraut mit ihm) nicht.

statisch / dynamisch vs Stark / Schwach

Der Punkt hier ist, dass die statische / dynamische Achse ist unabhängig von der stark / schwach Achse. Die Leute verwechseln sie vermutlich teilweise, weil starke vs schwacher Typisierung nicht nur weniger klar definiert ist, gibt es keinen wirklichen Konsens über genau das, was durch starke und schwache gemeint ist. Aus diesem Grunde stark / schwach Typisierung ist viel mehr ein Schatten of grau statt schwarz oder weiß.

So Ihre Frage zu beantworten:. Eine andere Art und Weise, dies zu betrachten, dass die meist ist richtig zu sagen, dass statische Typisierung Kompilierung-Typ Sicherheit und starke Typisierung ist Laufzeittyp Sicherheit

Der Grund dafür ist, dass Variablen in einer statisch typisierten Sprache einen Typen hat, die deklariert werden müssen und kann bei der Kompilierung überprüft werden. Eine stark typisierte Sprache hat Werte, die einen Typen zur Laufzeit haben, und es ist schwierig für den Programmierer des Typsystem ohne dynamische Kontrolle zu unterlaufen.

Aber es ist wichtig zu verstehen, dass eine Sprache statisch sein kann / Stark, statisch / Schwach, Dynamisch / Starke oder Dynamisch / schwach.

Beide sind Pole auf zwei verschiedenen Achsen:

  • stark typisierte vs. schwach typisierten
  • statisch typisierte vs. dynamisch typisierten

stark typisierte Mittel, ein nicht automatisch von einem Typ in einen anderen überführt werden. Schwach typisiert ist das Gegenteil: Perl eine Zeichenfolge wie "123" in einem numerischen Kontext verwenden kann, indem sie automatisch in die int 123 konvertieren. Eine stark typisierte Sprache wie Python wird dies nicht tun.

Statisch typisiert Mittel, die Compiler-Figuren aus der Art der einzelnen Variablen bei der Kompilierung. Dynamisch nur typisierte Sprachen, welche Arten von Variablen zur Laufzeit herauszufinden.

Stark Mittel getippt, dass es Einschränkungen zwischen Konvertierungen zwischen verschiedenen Arten. Statisch Mittel getippt, dass die Arten nicht dynamisch sind - Sie können den Typ einer Variablen ändern, nachdem es erstellt wurde.

Daten Coercion nicht notwendigerweise schwach typisierte bedeuten, weil manchmal seinen syntacical Zucker:

Das obige Beispiel von Java wegen schwach getippt

String s = "abc" + 123;

Ist das nicht schwach typisierten Beispiel, weil seine wirklich tun:

String s = "abc" + new Integer(123).toString()

Daten Zwang ist auch nicht schwach typisierte, wenn Sie ein neues Objekt errichten. Java ist ein sehr schlechtes Beispiel für schwach typisiert (und in jeder Sprache, die gute Reflexion hat höchstwahrscheinlich nicht schwach eingegeben werden). Da die Laufzeit der Sprache immer weiß, was der Typ ist (die Ausnahme könnte native Typen sein).

Dies ist im Gegensatz zu C. C die eines der besten Beispiele für schwach typisierten ist. Die Laufzeit keine Ahnung hat, wenn 4 Bytes eine ganze Zahl ist, eine Struktur, ein Zeiger oder ein 4-Zeichen.

Die Laufzeit der Sprache definiert wirklich, ob seine schwach sein wirklich nur Meinung anders eingegeben hat.

EDIT: Nach weiterem dachte, das ist nicht unbedingt wahr, wie die Laufzeit nicht haben, hat alle die im Laufzeitsystem verdinglichten Typen ein stark typisierten System. Haskell und ML haben eine solche vollständige statische Analyse, dass sie können potenzielle ommit Typinformationen aus der Laufzeit.

Eine nicht bedeutet, das andere. Für eine Sprache sein, statisch getippt bedeutet dies, dass die Typen aller Variablen sind bekannt oder zum Zeitpunkt der Kompilierung abgeleitet.

stark typisierte Sprache erlaubt Ihnen nicht, eine Art als eine andere zu verwenden. C ist eine schwach typisierte Sprache und ist ein gutes Beispiel dafür, was stark typisierten Sprachen nicht zulassen. In C können Sie ein Datenelement des falschen Typs übergeben, und es wird sich nicht beschweren. In stark typisierte Sprachen, die Sie nicht können.

Starke Typisierung bedeutet wahrscheinlich, dass Variablen hat eine gut definierte Art und dass es strenge Regeln über Variablen verschiedenen Typen in Ausdrücken kombinieren. wenn A ist zum Beispiel eine ganze Zahl ist und B ein Schwimmer, dann ist die strenge Regel über A + B könnte sein, dass eine Umwandlung in einen Schwimmer ist und das Ergebnis als Schwimmer zurückgeführt. Wenn A eine ganze Zahl und B ist eine Zeichenfolge, dann ist die strenge Regel könnte sein, dass A + B nicht gültig ist.

Statische Typisierung bedeutet wahrscheinlich, dass Typen werden bei der Kompilierung zugewiesen (oder dessen Äquivalent für nicht-kompilierten Sprachen) und kann nicht während der Programmausführung ändern.

Beachten Sie, dass diese Klassifikationen nicht gegenseitig ausschließen, in der Tat würde ich erwarten, dass sie häufig zusammen auftreten. Viele stark typisierte Sprachen sind auch statisch typisiert.

Und beachten Sie, dass, wenn ich das Wort ‚wahrscheinlich‘ es ist, weil es keine allgemein Definitionen dieser Begriffe akzeptiert. Wie Sie vielleicht schon aus den Antworten gesehen haben, werden so weit.

  

Die Antwort ist bereits oben angegeben. Der Versuch, zwischen starken vs Woche und statische vs dynamischem Konzept zu unterscheiden.

Was typisiert ist stark VS schwach typisierte?

stark typisierte: Wird nicht automatisch von einem Typ in einem anderen

umgewandelt werden

Gehen oder Python wie stark typisierte Sprachen „2“ + 8 wird eine Art Fehler aus, weil sie für „Art Zwang“ nicht zulassen.

Schwach (lose) typisierten: Wird automatisch auf einen anderen Typ umgewandelt werden: Schwach typisierten Sprachen wie JavaScript oder Perl nicht einen Fehler aus, und in diesem Fall javascript ‚28‘ Ergebnisse wird und Perl wird 10 zur Folge hat.

Perl Beispiel:

my $a = "2" + 8;
print $a,"\n";

Speichern, um es main.pl und laufen perl main.pl und Sie werden Ausgang 10 erhalten.

Was ist Static VS dyamic Typ?

In der Programmierung progammer statische Typisierung definieren und dynamische Typisierung in Bezug auf den Punkt, an dem die Variablentypen überprüft werden. Statisch typisierte Sprachen sind solche, bei denen die Typprüfung zur Übersetzungszeit durchgeführt wird, während dynamische typisierte Sprachen sind solche, bei denen die Typüberprüfung zur Laufzeit durchgeführt wird.

  • Static: Typen überprüft, bevor die Laufzeit
  • Dynamisch: Typen on the fly geprüft, während der Ausführung

Was ist das bedeutet?

Gehen Sie prüfen eingegeben hat, bevor die Laufzeit (statische Prüfung). Dieser Mittelwert nicht nur übersetzt und Typprüfungen Code es ausgeführt wird, aber es wird scannen durch den gesamten Code und Typ Fehler würde geworfen werden, bevor der Code selbst ausgeführt wird. Zum Beispiel:

package main

import "fmt"

func foo(a int) {
    if (a > 0) {
        fmt.Println("I am feeling lucky (maybe).")
    } else {
        fmt.Println("2" + 8)
    }
}

func main() {
    foo(2)
}

Speichern Sie diese Datei in main.go und führen Sie es, Sie Kompilation entsprechende Fehlermeldung für diese.

go run main.go
# command-line-arguments
./main.go:9:25: cannot convert "2" (type untyped string) to type int
./main.go:9:25: invalid operation: "2" + 8 (mismatched types string and int)

Aber dieser Fall ist für Python nicht gültig. Zum Beispiel folgenden Codeblock für die erst foo ausführen wird (2) -Aufruf und wird für die zweit foo (0) Aufruf fehl. Es ist, weil Python dynamisch typisiert ist, übersetzt sie nur und typüberprüft Code es die Ausführung auf. Der andere Block führt nie für foo (2), so „2“ + 8 wird nicht einmal an und für foo sieht (0) nennt es wird versuchen, diesen Block auszuführen und fehlgeschlagen.

def foo(a):
    if a > 0:
        print 'I am feeling lucky.'
    else:
        print "2" + 8
foo(2)
foo(0)

Sie werden folgende Ausgabe

python main.py
I am feeling lucky.
Traceback (most recent call last):
  File "pyth.py", line 7, in <module>
    foo(0)
  File "pyth.py", line 5, in foo
    print "2" + 8
TypeError: cannot concatenate 'str' and 'int' objects
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top