Was ist der Unterschied zwischen statisch typisiert und dynamisch typisierte Sprachen?
Höre ich eine Menge, die neue Programmier-Sprachen sind dynamisch typisierte, aber was bedeutet es eigentlich, wenn wir sagen, eine Sprache ist dynamisch typisierte vs. statisch typisiert?
InformationsquelleAutor der Frage Rachel | 2009-10-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statisch typisierte Sprachen
Eine Sprache ist statisch typisiert, wenn der Typ einer Variablen zur Kompilierzeit bekannt ist. Für einige Sprachen dies bedeutet, dass Sie als Programmierer muss angeben, welchen Typ die einzelnen Variablen ist (z.B.: Java, C, C++); andere Sprachen bieten irgendeine form von Typ-Inferenzwird die Fähigkeit des Typ-Systems, Rückschlüsse auf die Art einer variable (z.B.: OCaml, Haskell, Scala, Kotlin)
Der Hauptvorteil ist hier, dass alle Arten von Prüfung erfolgt durch den compiler, und daher viele triviale Fehler sind gefangen in einem sehr frühen Stadium.
Dynamisch typisierte Sprachen
Einer Sprache ist dynamisch typisiert, wenn der Typ verbunden ist mit der run-time-Werte, und nicht benannte Variablen/Felder/usw. Dies bedeutet, dass Sie als Programmierer schreiben, ein wenig schneller, da Sie nicht angeben, Arten jeder Zeit (es sei denn Sie verwenden eine statisch typisierte Sprache mit Typ-Inferenz).
Beispiel: Perl -, Ruby -, Python -
Meisten scripting-Sprachen haben dieses feature, da es keine compiler eine statische Typprüfung sowieso, aber Sie können finden sich auf der Suche nach einem Fehler, der aufgrund der interpreter falsch interpretiert den Typ einer Variablen. Zum Glück, Skripte tendenziell zu klein sein, damit bugs haben nicht so viele Orte zu verstecken.
Meisten dynamisch typisierte Sprachen können Sie bieten geben Informationen, aber nicht erforderlich. Eine Sprache, die zurzeit entwickelt werden, Rackernimmt einen hybrid-Ansatz ermöglicht dynamische Typisierung innerhalb der Funktionen, sondern die Durchsetzung der statischen Typisierung wird für die Funktion Unterschrift.
InformationsquelleAutor der Antwort NomeN
Statisch typisierten Programmiersprachen führen die Typüberprüfung (der Prozess der überprüfung und Durchsetzung der constraints von Typen) zur compile-Zeit im Gegensatz zu run-time.
Dynamisch typisierte Programmiersprachen führen die Typüberprüfung zur Laufzeit im Gegensatz zur Compile-Zeit.
InformationsquelleAutor der Antwort Christopher Tokar
Hier ist ein Beispiel kontrastierenden wie Python (dynamisch typisiert) und Gehen (statisch typisiert) Griff eine Art Fehler:
Python macht die Typüberprüfung zur Laufzeit, und daher:
Läuft einwandfrei, und erzeugt die erwartete Ausgabe
Hi
. Fehler werden nur erhoben, wenn Sie die problematische Zeile ist der hit:Produziert
weil die entsprechende Zeile tatsächlich ausgeführt wird.
Gehen auf der anderen Seite hat Typprüfung zur compile-Zeit:
Die oben nicht kompilieren, mit folgender Fehlermeldung:
InformationsquelleAutor der Antwort Akavall
Einfach gesagt ist es so: in einem statisch typisierten Sprache Variablen-Typen sind statischeD. H. sobald Sie eine variable zu einem Typ, Sie können es nicht ändern. Das ist, weil die Eingabe ist im Zusammenhang mit der variable statt dem Wert, den es sich bezieht.
Zum Beispiel in Java:
Wo auf der anderen Seite: in einem dynamisch typisierte Sprache Variablen-Typen sind dynamischeD. H. nachdem Sie eine variable eines Typs, KÖNNEN Sie es ändern. Das ist, weil die Eingabe ist im Zusammenhang mit dem Wert, den es meint eher, als die variable selbst.
Zum Beispiel in Python:
So, am besten ist es, glaube von Variablen in dynamisch typisierten Sprachen wie nur generische Zeiger eingegebenen Werte.
Zusammenfassend Typ beschreibt (oder sollte beschrieben) die Variablen, die in der Sprache eher als die Sprache selbst. Es könnte besser gewesen sein als eine Sprache mit statisch typisierten Variablen versus eine Sprache mit dynamisch typisierten Variablen IMHO.
Statisch typisierte Sprachen sind in der Regel Programmiersprachen, die kompiliert werden, damit der Compiler überprüfen Sie die Typen (die durchaus Sinn machen, richtig? als Typen dürfen nicht verändert werden später zur Laufzeit).
Dynamisch typisierte Sprachen sind in der Regel interpretiert, so Typprüfung (wenn überhaupt) geschieht zur Laufzeit, wenn Sie benutzt werden. Das bringt natürlich einige performance Kosten, und ist einer der Gründe, dynamische Sprachen (z.B. python, ruby, php) werden nicht skaliert so gut, wie die eingegeben Werte (java, c#, etc.). Aus einer anderen Perspektive, statisch typisierte Sprachen haben mehr von einem start-up-Kosten: Sie macht in der Regel mehr code schreiben, schwieriger code. Aber das zahlt sich später aus.
Die gute Sache ist, beide Seiten sind Kreditaufnahme features von der anderen Seite. Typisierte Sprachen sind Integration dynamischer Funktionen, z.B. in den markenlosen und den dynamischen Bibliotheken, die in c# und dynamische Sprachen, einschließlich mehr Typprüfung, z.B., type annotations in python, oder HACK-Variante von PHP, die in der Regel nicht der Kern der Sprache-und nutzbar, auf Nachfrage.
Wenn es um die Auswahl der Technologie, keine Seite hat eine intrinsische überlegenheit über die anderen. Es ist nur eine Frage der Einstellung, ob Sie mehr Kontrolle haben möchten, um mit zu beginnen oder Flexibilität. wählen Sie einfach das richtige Werkzeug für den job, und stellen Sie sicher, zu überprüfen, was verfügbar ist in Bezug auf die des anderen, bevor man einen Schalter.
InformationsquelleAutor der Antwort mehmet
http://en.wikipedia.org/wiki/Type_system
InformationsquelleAutor der Antwort Jacob
Die Terminologie "dynamisch typisiert" ist leider irreführend. Alle Sprachen sind statisch typisiert, die Typen der Eigenschaften von Ausdrücken (nicht von Werten, wie einige denken). Jedoch, einige Sprachen besitzen nur einen Typ. Diese werden als uni-typisierte Sprachen. Ein Beispiel für eine solche Sprache ist der nicht typisierte lambda-Kalkül.
In der nicht typisierte lambda-Kalkül, werden alle Begriffe lambda-terms, und die einzige operation, die ausgeführt werden kann nach einem Begriff ist die Anwendung, um einen anderen Begriff. Somit sind alle Operationen, die immer zu einer unendlichen Rekursion oder ein lambda-term, aber niemals signalisieren einen Fehler.
Allerdings waren wir zu erweitern, zu der nicht typisierte lambda-Kalkül mit primitiven zahlen und arithmetischen Operationen, dann könnten wir durchführen unsinnige Operationen, wie das hinzufügen von zwei lambda-terms zusammen:
(λx.x) + (λy.y)
. Man könnte argumentieren, dass die einzige vernünftige Sache zu tun ist, um das signal zu einem Fehler, wenn dies geschieht, aber in der Lage sein, dies zu tun, jeden Wert zu versehen, die mit einem Indikator, der angibt, ob der Ausdruck ist ein lambda-Ausdruck oder eine Zahl. Der Additions-operator wird dann prüfen, dass in der Tat beide Argumente markiert sind als zahlen, und wenn Sie nicht sind, signalisieren einen Fehler. Beachten Sie, dass diese tags sind nicht Typen, weil die Arten sind Eigenschaften von Programmen, nicht von Werten produziert, die von diesen Programmen.Uni-typisierte Sprache, die dies tut, wird als dynamisch typisiert.
Sprachen wie JavaScript, Python und Ruby sind alle uni-typisiert. Wieder, die
typeof
- operator in JavaScript und dietype
Funktion in Python haben irreführenden Namen; Sie kehren die tags, die im Zusammenhang mit der Operanden, nicht Ihre Typen. Ebensodynamic_cast
in C++ undinstanceof
in Java tun nicht tun Typ überprüft.InformationsquelleAutor der Antwort rightfold
Statisch typisierte Sprachen Typ-check zur compile-Zeit und der Typ kann sich NICHT ändern. (Don ' T get cute mit Typ-casting-Kommentare, eine neue variable/Referenz wird erstellt).
Dynamisch typisierte Sprachen Typ-check zur Laufzeit und der Typ einer Variablen KANN zur Laufzeit geändert werden.
InformationsquelleAutor der Antwort RESTfulGeoffrey
Süße und einfache Definitionen, aber passend die Notwendigkeit:
Statisch typisierte Sprachen bindet der Typ einer variable für die gesamte Geltungsbereich (Seg: SCALA)
Dynamisch typisierte Sprachen bind, der Typ, der tatsächliche Wert verwiesen wird, die durch eine variable.
InformationsquelleAutor der Antwort user3627021
Kompiliert vs. Interpretiert
", Wenn source-code übersetzt wird"
Eingabe
"Wenn Arten überprüft werden"
5 + '3'
ist ein Beispiel für eine Art Fehler in stark typisierte Sprachen wie Go und Python, weil Sie nicht zulassen, für "Art Zwang" -> die Fähigkeit, einen Wert zu ändern, geben Sie in bestimmten Kontexten, wie das Zusammenführen von zwei Arten. Schwach typisierte Sprachen, wie JavaScript, wird nicht werfen eine Art Fehler (Ergebnisse in'53'
).Den Definitionen von "Static & Zusammengestellt" und "Dynamik & Interpretiert" sind sich ziemlich ähnlich...aber denken Sie daran, es ist "als Arten überprüft werden" vs. "wenn source-code übersetzt wird".
Erhalten Sie die gleichen Fehler, unabhängig davon, ob die Sprache kompiliert oder interpretiert! Sie müssen trennen Sie diese Bedingungen konzeptionell.
Python-Beispiel
Dynamisch, Interpretiert
Weil Python interpretierte und dynamisch typisierte, es nur übersetzt und Typ-Prüfungen-code ausgeführt wird. Die
else
block wird nie ausgeführt, so5 + '3'
ist nicht einmal angeschaut!Was ist, wenn es war statisch typisiert?
Einen Typ-Fehler geworfen werden, bevor der code auch ausgeführt wird. Es noch führt Typ-überprüfung vor der Laufzeit-auch wenn es interpretiert wird.
Was ist, wenn es kompiliert wurde?
Den
else
block übersetzt werden würde/angeschaut, bevor der run-time, aber, weil es dynamisch typisierte, es würde nicht einen Fehler auslösen! Dynamisch typisierte Sprachen, die nicht check-Typen bis zur Ausführung, und diese Zeile wird nie ausgeführt.Gehen Beispiel
Statisch Kompiliert
Die Typen sind überprüft vor der Ausführung (statisch) und geben Sie Fehler sofort gefangen! Die Typen würden noch überprüft werden, bevor der run-time, wenn es interpretiert wird, mit dem gleichen Ergebnis. Wenn es war dynamisch, es würde nicht werfen Fehler, obwohl der code wäre schaute sich während der Kompilierung.
Leistung
Einer kompilierten Sprache wird, haben eine bessere performance zur Laufzeit, ob es statisch typisiert (vs. dynamisch); Kenntnisse der Arten ermöglicht machine code-Optimierung.
Statisch typisierte Sprachen haben eine bessere performance zur Laufzeit intrinsisch durch nicht brauchen, um check-Typen dynamisch während der Ausführung (es prüft vor der Ausführung).
Ähnlich, kompilierte Sprachen sind schneller zur Laufzeit als code wurde bereits übersetzt, anstatt dass "interpret"/, übersetzen Sie es auf der fliege.
Beachten Sie, dass sowohl kompiliert und statisch typisierte Sprachen haben eine Verzögerung vor der Ausführung für die übersetzung und Typüberprüfung, beziehungsweise.
Mehr Unterschiede
Statische Typisierung fängt Fehler frühzeitig, statt Sie zu finden, die während der Ausführung (besonders nützlich für lange Programme). Es ist mehr "strenge", die es nicht erlauben für Typ-Fehler irgendwo in Ihrem Programm, und oft verhindert, dass Variablen aus den sich verändernden Arten, die außerdem einen Schutz gegen unbeabsichtigten Fehlern.
Dynamische Eingabe ist flexibler, was einige schätzen. Es in der Regel ermöglicht, Variablen zu ändern, was dazu führen kann, unerwartete Fehler.
InformationsquelleAutor der Antwort JBallin
InformationsquelleAutor der Antwort Chudong
Starke Typisierung wahrscheinlich bedeutet, dass Variablen, die einem genau definierten Typ sind, und dass es strenge Regeln zum kombinieren von Variablen unterschiedlicher Typen in Ausdrücken. Zum Beispiel, wenn A eine ganze Zahl und B ist ein float, dann die strenge Regel über A+B sein könnte, ist Ein cast zu float und das Ergebnis als float. Wenn A eine ganze Zahl und B ist eine Zeichenkette, so wird die strenge Regel könnte sein, dass A+B nicht gültig ist.
Statische Typisierung bedeutet wahrscheinlich, dass die Arten zugeordnet sind, bei der Kompilierung (oder dessen äquivalent für die nicht-kompilierte Sprachen) und können nicht geändert werden während der Ausführung des Programms.
Beachten Sie, dass diese Klassifizierungen nicht gegenseitig ausschließen, ja, ich würde erwarten, dass Sie gemeinsam auftreten, Häufig. Viele stark-typisierten Sprachen sind auch statisch typisiert.
Und beachten Sie, dass, wenn ich das Wort "wahrscheinlich" es ist, weil es keine allgemein anerkannte Definition dieser Begriffe. Wie Sie bereits gesehen haben von die Antworten so weit.
Einfach gesagt ist es so: in einem statisch typisierten Sprache der Typ ist statischeD. H. sobald Sie eine variable zu einem Typ, Sie können es NICHT ändern. Das ist, weil die Eingabe ist im Zusammenhang mit der variable statt dem Wert, den es sich bezieht.
Zum Beispiel in Java:
In der Erwägung, dass in einer dynamisch typisierte Sprache der Typ ist dynamischeD. H. nachdem Sie eine variable eines Typs, KÖNNEN Sie es ändern. Das ist, weil die Eingabe ist im Zusammenhang mit dem Wert anstatt der Variablen.
Zum Beispiel in Python:
Auf der anderen Seite, die starke/schwache Typisierung in einer Sprache ist mit impliziten Typkonvertierungen (teilweise übernommen von @Darios Antwort):
Zum Beispiel in Python:
in der Erwägung, dass in PHP:
Statische Typisierung erlaubt die Prüfung Typ-Korrektheit bei der Kompilierung. Statisch typisierte Sprachen sind in der Regel kompiliert und dynamisch typisierte Sprachen interpretiert werden. Daher dynamicly typisierte Sprachen können überprüfen Sie die Eingabe zur Laufzeit.
InformationsquelleAutor der Antwort Md. Sajedul Karim
Statisch typisierte Sprachen: jede variable und jeder Ausdruck ist bereits zur Kompilierzeit bekannt ist.
(int a; a kann nur Ganzzahl-Werte zur Laufzeit)
Zum Beispiel: C, C++, Java
Dynamisch typisierte Sprachen: varialbes empfangen können unterschiedliche Werte zur Laufzeit, und es geben definiert ist, zur Laufzeit.
(var a; a kann jede Art von Werten zur Laufzeit)
Zum Beispiel: Ruby, Python.
InformationsquelleAutor der Antwort Raman Gupta
Statisch typisierten Sprachen wie C++, Java und Dynamisch typisierten Sprachen wie Python unterscheiden sich nur in Bezug auf die Ausführung der den Typ der Variablen.
Statisch typisierten Sprachen mit statischen Datentyp für die variable, hier die Daten Typ überprüft beim kompilieren so ist das Debuggen viel einfacher...in der Erwägung, dass Dynamisch typisierte Sprachen nicht das gleiche tun, der Daten-Typ-geprüft wird die Ausführung des Programms und damit die Fehlersuche ist etwas schwierig.
Außerdem haben Sie einen sehr kleinen Unterschied und kann im Zusammenhang mit stark typisierte und schwach typisierte Sprachen. Eine stark typisierte Sprache, die nicht zulässt, dass Sie mit einem Typ wie die anderen zB. C und C++ ...in der Erwägung, dass schwach typisierte Sprachen, die erlauben zB.python
InformationsquelleAutor der Antwort Akash sharma
dynamisch typisierte Sprache hilft schnell Prototyp-Algorithmus Konzepte, ohne den overhead von etwa denken, was für Typen von Variablen, die benutzt werden müssen (das ist eine Notwendigkeit in statisch typisierten language).
InformationsquelleAutor der Antwort Pavan Kanajar
In einem statisch typisierten Sprachejede variable gebunden ist, sowohl
1.zu einer Art (zur compile-Zeit, durch eine Erklärung)
2.um ein Objekt.
Die Bindung an ein Objekt ist optional — wenn Sie einen Namen nicht an ein Objekt gebunden, der name sagt null sein.
In einem dynamisch typisierte Sprache, jede variable ist (es sei denn es ist null) gebunden nur an ein Objekt.
Namen gebunden sind Objekte, die zum Zeitpunkt der Ausführung durch Abtretung, zu Aussagen, und es ist möglich, binden einen Namen an Objekte unterschiedlicher Typen, die während der Ausführung des Programms.
InformationsquelleAutor der Antwort Danysh Mushtaq
Statische Typisierung:
Die Sprachen wie Java und Scala statisch typisiert ist.
Werden die Variablen definiert und initialisiert, bevor Sie verwendet werden in einem code.
für ex. int x; x = 10;
System.aus.println(x);
Dynamische Typisierung:
Perl ist eine dynamisch typisierte Sprache.
Variablen müssen nicht initialisiert werden, bevor Sie im code verwendet.
y=10; verwenden Sie diese variable, in die später Teil des Codes
InformationsquelleAutor der Antwort Prakhyat