Ich höre viel, dass neue Programmiersprachen dynamisch typisiert werden, aber was bedeutet es eigentlich, wenn wir sagen, dass eine Sprache dynamisch oder statisch typisiert ist?
945
Ich höre viel, dass neue Programmiersprachen dynamisch typisiert werden, aber was bedeutet es eigentlich, wenn wir sagen, dass eine Sprache dynamisch oder statisch typisiert ist?
Antworten:
Statisch typisierte Sprachen
Eine Sprache wird statisch typisiert, wenn der Typ einer Variablen zur Kompilierungszeit bekannt ist. Für einige Sprachen bedeutet dies, dass Sie als Programmierer angeben müssen, um welchen Typ es sich bei jeder Variablen handelt (z. B. Java, C, C ++). Andere Sprachen bieten eine Form der Typinferenz , die Fähigkeit des Typsystems, den Typ einer Variablen abzuleiten (z. B. OCaml, Haskell, Scala, Kotlin).
Der Hauptvorteil hierbei ist, dass alle Arten von Überprüfungen vom Compiler durchgeführt werden können und daher viele triviale Fehler sehr früh erkannt werden.
Beispiele: C, C ++, Java, Rust, Go, Scala
Dynamisch getippte Sprachen
Eine Sprache wird dynamisch typisiert, wenn der Typ Laufzeitwerten zugeordnet ist und keine benannten Variablen / Felder / etc. Dies bedeutet, dass Sie als Programmierer etwas schneller schreiben können, da Sie nicht jedes Mal Typen angeben müssen (es sei denn, Sie verwenden eine statisch typisierte Sprache mit Typinferenz ).
Beispiele: Perl, Ruby, Python, PHP, JavaScript
Die meisten Skriptsprachen verfügen über diese Funktion, da ohnehin kein Compiler für die statische Typprüfung vorhanden ist. Möglicherweise suchen Sie jedoch nach einem Fehler, der darauf zurückzuführen ist, dass der Interpreter den Typ einer Variablen falsch interpretiert. Glücklicherweise sind Skripte in der Regel klein, sodass Fehler nicht so viele Orte zum Verstecken haben.
In den meisten dynamisch typisierten Sprachen können Sie Typinformationen bereitstellen, benötigen diese jedoch nicht. Eine Sprache, die derzeit entwickelt wird, Rascal , verfolgt einen hybriden Ansatz, der eine dynamische Typisierung innerhalb von Funktionen ermöglicht, aber eine statische Typisierung für die Funktionssignatur erzwingt.
quelle
Statisch typisierte Programmiersprachen tun Typprüfung (dh den Prozess der Überprüfung und die Zwänge der Typen Durchsetzung) bei der Kompilierung Zeit im Gegensatz zu Zeit laufen .
Dynamisch typisierte Programmiersprachen führen zur Laufzeit eine Typprüfung durch und nicht zur Kompilierungszeit .
Beispiele für statisch typisierte Sprachen sind: - Java, C, C ++
Beispiele für dynamisch typisierte Sprachen sind: - Perl, Ruby, Python, PHP, JavaScript
quelle
Hier ist ein Beispiel, das gegenüberstellt, wie Python (dynamisch typisiert) und Go (statisch typisiert) einen Typfehler behandeln:
Python führt zur Laufzeit eine Typprüfung durch und daher:
Läuft einwandfrei und erzeugt die erwartete Ausgabe
Hi
. Der Fehler wird nur ausgelöst, wenn die problematische Linie getroffen wird:Produziert
weil die entsprechende Zeile tatsächlich ausgeführt wurde.
Go hingegen führt zur Kompilierungszeit eine Typprüfung durch:
Das oben Gesagte wird mit folgendem Fehler nicht kompiliert:
quelle
runhaskell
zum Beispiel mit interpretiert werden .Einfach ausgedrückt: In einer statisch typisierten Sprache sind die Variablentypen statisch . Wenn Sie also eine Variable auf einen Typ festgelegt haben, können Sie sie 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:
Wo andererseits: In einer dynamisch typisierten Sprache sind die Variablentypen dynamisch , dh nachdem Sie eine Variable auf einen Typ festgelegt haben, können Sie sie ändern. Dies liegt daran, dass die Eingabe eher dem angenommenen Wert als der Variablen selbst zugeordnet ist.
Zum Beispiel in Python:
Daher ist es am besten, sich Variablen in dynamisch typisierten Sprachen als generische Zeiger auf typisierte Werte vorzustellen.
Um es zusammenzufassen, Typ beschreibt (oder sollte beschrieben haben) , um die Variablen in der Sprache eher als die Sprache selbst. Es könnte besser als verwendet wurde , eine Sprache mit statisch typisierten Variablen im Vergleich zu einer Sprache mit dynamisch typisierten Variablen IMHO.
Statisch typisierte Sprachen sind in der Regel kompilierte Sprachen. Daher überprüfen die Compiler die Typen (sinnvoll, da Typen später zur Laufzeit nicht mehr geändert werden dürfen).
Dynamisch typisierte Sprachen werden im Allgemeinen interpretiert, sodass die Typprüfung (falls vorhanden) zur Laufzeit erfolgt, wenn sie verwendet werden. Dies bringt natürlich einige Leistungskosten mit sich und ist einer der Gründe, warum dynamische Sprachen (z. B. Python, Ruby, PHP) nicht so gut skaliert werden wie die eingegebenen (Java, C # usw.). Aus einer anderen Perspektive haben statisch typisierte Sprachen höhere Startkosten: Sie schreiben normalerweise mehr Code, härteren Code. Aber das zahlt sich später aus.
Das Gute ist, dass beide Seiten Features von der anderen Seite ausleihen. Typisierte Sprachen enthalten dynamischere Funktionen, z. B. Generika und dynamische Bibliotheken in c #, und dynamische Sprachen enthalten mehr Typprüfungen, z. B. Typanmerkungen in Python oder die HACK-Variante von PHP, die normalerweise nicht zum Kern der Sprache gehören und auf der sie verwendet werden können Nachfrage.
Bei der Auswahl der Technologie hat keine Seite eine intrinsische Überlegenheit gegenüber der anderen. Es ist nur eine Frage der Präferenz, ob Sie zunächst mehr Kontrolle oder Flexibilität wünschen. Wählen Sie einfach das richtige Werkzeug für den Job aus und prüfen Sie, was im Gegenteil verfügbar ist, bevor Sie einen Wechsel in Betracht ziehen.
quelle
http://en.wikipedia.org/wiki/Type_system
quelle
myObject[remoteDataName]
. Dann gibt es keine Möglichkeit zu wissen, welche Eigenschaft ausgewählt wird oder ob es sich überhaupt um eine gültige Eigenschaft handelt.Die Terminologie "dynamisch typisiert" ist leider irreführend. Alle Sprachen sind statisch typisiert, und Typen sind Eigenschaften von Ausdrücken (nicht von Werten, wie manche denken). Einige Sprachen haben jedoch nur einen Typ. Diese werden als uni-typisierte Sprachen bezeichnet. Ein Beispiel für eine solche Sprache ist der untypisierte Lambda-Kalkül.
In der untypisierten Lambda-Rechnung sind alle Terme Lambda-Terme, und die einzige Operation, die für einen Term ausgeführt werden kann, besteht darin, ihn auf einen anderen Term anzuwenden. Daher führen alle Operationen immer entweder zu einer unendlichen Rekursion oder zu einem Lambda-Term, signalisieren jedoch niemals einen Fehler.
Wenn wir jedoch den untypisierten Lambda-Kalkül mit primitiven Zahlen und arithmetischen Operationen erweitern würden, könnten wir unsinnige Operationen ausführen, indem wir zwei Lambda-Terme addieren :
(λx.x) + (λy.y)
. Man könnte argumentieren, dass das einzig Vernünftige darin besteht, einen Fehler zu signalisieren, wenn dies geschieht. Um dies jedoch tun zu können, muss jeder Wert mit einem Indikator versehen werden, der angibt, ob der Begriff ein Lambda-Begriff oder eine Zahl ist. Der Additionsoperator prüft dann, ob tatsächlich beide Argumente als Zahlen gekennzeichnet sind, und signalisiert einen Fehler, wenn dies nicht der Fall ist. Beachten Sie, dass diese Tags keine Typen sind, da Typen Eigenschaften von Programmen sind, nicht von Werten, die von diesen Programmen erzeugt werden.Eine einheitliche Sprache, die dies tut, wird als dynamisch typisiert bezeichnet.
Sprachen wie JavaScript, Python und Ruby sind alle einheitlich. Auch hier haben der
typeof
Operator in JavaScript und dietype
Funktion in Python irreführende Namen. Sie geben die den Operanden zugeordneten Tags zurück, nicht ihre Typen. In ähnlicher Weisedynamic_cast
in C ++ undinstanceof
in Java tut nicht tun Typprüfungen.quelle
Zusammengestellt vs. interpretiert
"Wenn der Quellcode übersetzt wird"
Tippen
"Wenn Typen überprüft werden"
5 + '3'
ist ein Beispiel für einen Typfehler in stark typisierten Sprachen wie Go und Python, da sie keinen "Typzwang" zulassen -> die Fähigkeit eines Werts, den Typ in bestimmten Kontexten zu ändern, z. B. beim Zusammenführen zweier Typen. Schwach typisierte Sprachen wie JavaScript lösen keinen Tippfehler aus (führt zu'53'
).Die Definitionen von "Static & Compiled" und "Dynamic & Interpreted" sind ziemlich ähnlich ... aber denken Sie daran, es ist "wenn Typen überprüft werden" vs. "wenn Quellcode übersetzt wird".
Sie erhalten die gleichen Typfehler, unabhängig davon, ob die Sprache kompiliert oder interpretiert wird ! Sie müssen diese Begriffe konzeptionell trennen.
Python-Beispiel
Dynamisch, interpretiert
Da Python sowohl interpretiert als auch dynamisch typisiert wird, übersetzt und überprüft es nur den Code, für den es ausgeführt wird. Der
else
Block wird nie ausgeführt, wird also5 + '3'
nie angeschaut!Was ist, wenn es statisch getippt wurde?
Ein Typfehler wird ausgelöst, bevor der Code überhaupt ausgeführt wird. Es führt weiterhin eine Typprüfung vor der Laufzeit durch, obwohl es interpretiert wird.
Was ist, wenn es kompiliert wurde?
Der
else
Block würde vor der Laufzeit übersetzt / betrachtet, aber da er dynamisch eingegeben wird, würde er keinen Fehler auslösen! Dynamisch typisierte Sprachen prüfen Typen erst nach der Ausführung, und diese Zeile wird nie ausgeführt.Gehen Sie Beispiel
Statisch, kompiliert
Die Typen werden vor dem Ausführen überprüft (statisch) und der Typfehler wird sofort abgefangen! Die Typen würden noch vor der Laufzeit überprüft, wenn sie interpretiert würden, mit dem gleichen Ergebnis. Wenn es dynamisch wäre, würde es keine Fehler auslösen, obwohl der Code während der Kompilierung betrachtet würde.
Performance
Eine kompilierte Sprache hat zur Laufzeit eine bessere Leistung, wenn sie statisch (im Vergleich zu dynamisch) typisiert ist. Die Kenntnis der Typen ermöglicht die Optimierung des Maschinencodes.
Statisch typisierte Sprachen weisen zur Laufzeit eine bessere Leistung auf, da die Typen während der Ausführung nicht dynamisch überprüft werden müssen (dies wird vor der Ausführung überprüft).
In ähnlicher Weise sind kompilierte Sprachen zur Laufzeit schneller, da der Code bereits übersetzt wurde, anstatt ihn im laufenden Betrieb "interpretieren" / übersetzen zu müssen.
Beachten Sie, dass sowohl kompilierte als auch statisch typisierte Sprachen eine Verzögerung haben, bevor sie zur Übersetzung bzw. Typprüfung ausgeführt werden.
Weitere Unterschiede
Durch statische Typisierung werden Fehler frühzeitig erkannt, anstatt sie während der Ausführung zu finden (besonders nützlich für lange Programme). Es ist "strenger", da es keine Typfehler in Ihrem Programm zulässt und häufig verhindert, dass Variablen Typen ändern, was sich weiter gegen unbeabsichtigte Fehler schützt.
Dynamisches Tippen ist flexibler, was einige zu schätzen wissen. In der Regel können Variablen den Typ ändern, was zu unerwarteten Fehlern führen kann.
quelle
Statisch typisierte Sprachen : Jede Variable und jeder Ausdruck ist bereits zur Kompilierungszeit bekannt.
(
int a;
a kann zur Laufzeit nur ganzzahlige Werte annehmen)Beispiele: C, C ++, Java
Dynamisch typisierte Sprachen : Variablen können zur Laufzeit unterschiedliche Werte erhalten und ihr Typ wird zur Laufzeit definiert.
(
var a;
a kann zur Laufzeit beliebige Werte annehmen)Beispiele: Ruby, Python.
quelle
Statisch typisierte Sprachen werden beim Kompilieren auf Typ überprüft, und der Typ kann sich NICHT ändern. (Werden Sie nicht süß mit Typ-Casting-Kommentaren, eine neue Variable / Referenz wird erstellt).
Dynamisch typisierte Sprachen - Typprüfung zur Laufzeit und Typ einer Variablen können zur Laufzeit geändert werden.
quelle
Süße und einfache Definitionen, aber passend zum Bedarf: Statisch typisierte Sprachen binden den Typ für den gesamten Bereich an eine Variable (Seg: SCALA). Dynamisch typisierte Sprachen binden den Typ an den tatsächlichen Wert, auf den eine Variable verweist.
quelle
quelle
Statisch typisierte Sprachen wie C ++, Java und dynamisch typisierte Sprachen wie Python unterscheiden sich nur hinsichtlich der Ausführung des Variablentyps. Statisch typisierte Sprachen haben einen statischen Datentyp für die Variable. Hier wird der Datentyp beim Kompilieren überprüft, sodass das Debuggen viel einfacher ist. Während dynamisch typisierte Sprachen nicht dasselbe tun, wird der Datentyp überprüft, der das Programm ausführt, und damit der Das Debuggen ist etwas schwierig.
Darüber hinaus haben sie einen sehr kleinen Unterschied und können mit stark typisierten und schwach typisierten Sprachen in Verbindung gebracht werden. Eine stark typisierte Sprache erlaubt es Ihnen nicht, einen Typ als einen anderen zu verwenden, z. C und C ++ ... während schwach typisierte Sprachen zB Python erlauben
quelle
Statisch typisiert
Die Typen werden vor der Laufzeit überprüft, damit Fehler früher erkannt werden können.
Beispiele = c ++
Dynamisch getippt
Die Typen werden während der Ausführung überprüft.
Beispiele = Python
quelle
Statisch typisierte Sprachen (der Compiler löst Methodenaufrufe auf und kompiliert Referenzen):
Dynamisch getippte Sprachen (Entscheidungen im laufenden Programm):
quelle
Dynamisch typisierte Sprache hilft dabei, Algorithmuskonzepte schnell zu prototypisieren, ohne darüber nachdenken zu müssen, welche Variablentypen verwendet werden müssen (was in statisch typisierten Sprachen erforderlich ist ).
quelle
Statische Typisierung: Die Sprachen wie Java und Scala sind statisch typisiert.
Die Variablen müssen definiert und initialisiert werden, bevor sie in einem Code verwendet werden.
zum Beispiel. int x; x = 10;
System.out.println (x);
Dynamische Typisierung: Perl ist eine dynamisch typisierte Sprache.
Variablen müssen nicht initialisiert werden, bevor sie im Code verwendet werden.
y = 10; Verwenden Sie diese Variable im späteren Teil des Codes
quelle
$
), array (@
) und hash (%
). Der Typ einer Variablen in Perl ist zur Kompilierungszeit bekannt und bleibt für den Rest der Variablenlebensdauer gleich.