Bedeutet das eine auch das andere?
Antworten
Zu viele Anzeigen?Data Coercion bedeutet nicht unbedingt schwach typisiert, da es sich manchmal um syntaktischen Zucker handelt:
Das obige Beispiel der schwachen Typisierung von Java aufgrund von
String s = "abc" + 123;
Ist nicht schwach typisiert Beispiel, weil seine wirklich tun:
String s = "abc" + new Integer(123).toString()
Der Datenzwang ist auch nicht schwach typisiert, wenn Sie ein neues Objekt konstruieren. Java ist ein sehr schlechtes Beispiel für schwache Typisierung (und jede Sprache, die über eine gute Reflexion verfügt, ist höchstwahrscheinlich nicht schwach typisiert). Denn die Laufzeit der Sprache weiß immer, was der Typ ist (die Ausnahme könnten native Typen sein).
Das ist anders als bei C. C ist eines der besten Beispiele für schwache Typisierung. Die Laufzeit hat keine Ahnung, ob 4 Bytes eine Ganzzahl, eine Struktur, ein Zeiger oder 4 Zeichen sind.
Die Laufzeit der Sprache definiert wirklich, ob es schwach typisiert ist oder nicht, ansonsten ist es wirklich nur eine Meinung.
EDIT : Nach weiterem Nachdenken ist dies nicht unbedingt richtig, da die Laufzeit nicht alle Typen im Laufzeitsystem verifiziert haben muss, um ein Strongly Typed System zu sein. Haskell und ML haben eine so vollständige statische Analyse, dass sie möglicherweise Typinformationen in der Laufzeit weglassen können.
Das eine impliziert nicht das andere. Damit eine Sprache statisch typisiert bedeutet, dass die Typen aller Variablen zur Kompilierzeit bekannt sind oder abgeleitet werden.
A stark typisierte Sprache erlaubt es nicht, einen Typ als einen anderen zu verwenden. C ist eine schwach typisierte Sprache und ist ein gutes Beispiel dafür, was stark typisierte Sprachen nicht zulassen. In C können Sie ein Datenelement des falschen Typs übergeben, ohne dass es zu einer Beschwerde kommt. In stark typisierten Sprachen geht das nicht.
Starke Typisierung bedeutet wahrscheinlich, dass Variablen einen wohldefinierten Typ haben und dass es strenge Regeln für die Kombination von Variablen unterschiedlichen Typs in Ausdrücken gibt. Wenn z. B. A eine ganze Zahl und B ein Fließkomma ist, könnte die strenge Regel für A+B lauten, dass A in ein Fließkomma umgewandelt und das Ergebnis als Fließkomma zurückgegeben wird. Wenn A eine ganze Zahl und B eine Zeichenkette ist, könnte die strikte Regel lauten, dass A+B nicht gültig ist.
Statische Typisierung bedeutet wahrscheinlich, dass Typen zur Kompilierzeit zugewiesen werden (oder das Äquivalent für nicht kompilierte Sprachen) und sich während der Programmausführung nicht ändern können.
Beachten Sie, dass sich diese Klassifizierungen nicht gegenseitig ausschließen, ich würde sogar erwarten, dass sie häufig zusammen auftreten. Viele stark typisierte Sprachen sind auch statisch typisiert.
Und wenn ich das Wort "wahrscheinlich" verwende, dann deshalb, weil es keine allgemein anerkannten Definitionen für diese Begriffe gibt. Wie Sie bereits aus den bisherigen Antworten ersehen haben.
Imho ist es besser, diese Definitionen ganz zu vermeiden, nicht nur gibt es keine vereinbarte Definition der Begriffe, Definitionen, die es gibt, neigen dazu, sich auf technische Aspekte zu konzentrieren, z. B. sind Operationen mit gemischten Typen erlaubt und wenn nicht, gibt es ein Schlupfloch, das die Einschränkungen umgeht, wie z. B. die Arbeit mit Zeigern.
Stattdessen, und ich betone nochmals, dass es sich um eine Meinung handelt, sollte man sich auf die Frage konzentrieren: Macht das Typsystem meine Anwendung zuverlässiger? Eine Frage, die anwendungsspezifisch ist.
Zum Beispiel: Wenn meine Anwendung eine Variable namens Beschleunigung Wenn die Art und Weise, wie die Variable deklariert und verwendet wird, die Zuweisung des Wertes zulässt, dann ist klar "Montag" a Beschleunigung Das ist ein Problem, denn eine Beschleunigung kann eindeutig kein Wochentag (und keine Zeichenkette) sein.
Ein anderes Beispiel: In Ada kann man definieren: subtype Month_Day ist Ganzzahl im Bereich 1..31; , Der Typ Monat_Tag ist schwach in dem Sinne, dass es kein eigenständiger Typ von Integer ist (weil es ein Subtyp ist), aber es ist auf den Bereich 1..31 beschränkt. Im Gegensatz dazu: Typ Month_Day ist eine neue Ganzzahl; erzeugt einen eindeutigen Typ, der insofern stark ist, als er nicht ohne explizites Casting mit ganzen Zahlen gemischt werden kann - aber er ist nicht eingeschränkt und kann den Wert -17 erhalten, was sinnlos ist. Technisch gesehen ist er also stärker, aber weniger zuverlässig. Natürlich kann man auch deklarieren Typ Month_Day ist neu Ganzzahliger Bereich 1..31; um einen eindeutigen und eingeschränkten Typ zu schaffen.
- See previous answers
- Weitere Antworten anzeigen