Um Wikipedia zu zitieren :
Zwei häufig verwendete Sprachen, die viele Arten der impliziten Konvertierung unterstützen, sind C und C ++, und es wird manchmal behauptet, dass es sich um schwach typisierte Sprachen handelt. Andere argumentieren jedoch, dass diese Sprachen die Art und Weise, wie Operanden unterschiedlicher Typen gemischt werden können, ausreichend einschränken und dass beide Sprachen als stark typisierte Sprachen angesehen werden sollten.
Gibt es eine endgültigere Antwort?
c
strong-typing
weakly-typed
Sydius
quelle
quelle
Antworten:
"Stark typisiert" und "schwach typisiert" sind Begriffe, die keine allgemein anerkannte technische Bedeutung haben. Begriffe, die eine genau definierte Bedeutung haben, sind
Dynamisch typisiert bedeutet, dass Typen zur Laufzeit an Werte angehängt werden und der Versuch, Werte verschiedener Typen zu mischen, kann zu einem "Laufzeit-Typfehler" führen. Wenn Sie beispielsweise in Schema versuchen, durch Schreiben
(+ 1 #t)
einen Wert zu true hinzuzufügen, führt dies zu einem Fehler. Der Fehler tritt nur auf, wenn Sie versuchen, den fehlerhaften Code auszuführen.Statisch typisiert bedeutet, dass Typen zur Kompilierungszeit überprüft werden und ein Programm ohne statischen Typ vom Compiler abgelehnt wird. Wenn Sie beispielsweise in ML versuchen, durch Schreiben einen Wert zu true hinzuzufügen
1 + true
, wird das Programm mit einer (wahrscheinlich kryptischen) Fehlermeldung abgelehnt. Sie erhalten immer den Fehler, auch wenn der Code möglicherweise nie ausgeführt wird.Unterschiedliche Personen bevorzugen unterschiedliche Systeme, je nachdem, wie sehr sie Flexibilität schätzen und wie sehr sie sich um Laufzeitfehler sorgen.
Manchmal wird "stark typisiert" lose verwendet, um "statisch typisiert" zu bedeuten, und "schwach typisiert" wird falsch verwendet, um "dynamisch typisiert" zu bedeuten. Eine bessere Verwendung für den Begriff "stark typisiert" ist, dass "Sie das Typsystem nicht umgehen oder untergraben können", während "schwach typisiert" bedeutet "es gibt Lücken im Typensystem". Perverserweise haben die meisten Sprachen mit statischen Typsystemen Lücken, während viele Sprachen mit dynamischen Typsystemen keine Lücken haben.
Keiner dieser Begriffe hängt in irgendeiner Weise mit der Anzahl der impliziten Konvertierungen zusammen, die in einer Sprache verfügbar sind.
Wenn Sie genau über Programmiersprachen sprechen möchten, vermeiden Sie am besten die Begriffe "stark typisiert" und "schwach typisiert". Ich würde sagen, dass C eine Sprache ist, die statisch typisiert ist, aber viele Lücken aufweist. Eine Lücke besteht darin, dass Sie jeden Zeigertyp frei in einen anderen Zeigertyp umwandeln können. Sie können auch eine Lücke zwischen zwei beliebigen Typen Ihrer Wahl erstellen, indem Sie eine C-Union mit zwei Mitgliedern deklarieren, eines für jeden der betreffenden Typen.
Ich habe mehr über statisches und dynamisches Tippen geschrieben, warum-interpretiert-langs-meistens-ducktyped-während-kompiliert-haben-stark-tippen .
quelle
whereas "weakly typed" means "there are loopholes in the type system
Es ist schwer, jede Sprache in "schwach" oder "stark" zu klassifizieren - es ist eher ein Kontinuum. Im Vergleich zu anderen Sprachen ist C jedoch ziemlich stark typisiert. Jedes Objekt hat einen Typ zur Kompilierungszeit, und der Compiler teilt Ihnen (laut) mit, ob Sie etwas mit einem Objekt tun, das sein Typ nicht zulässt. Beispielsweise können Sie keine Funktionen mit den falschen Parametertypen aufrufen, auf nicht vorhandene Struktur- / Gewerkschaftsmitglieder zugreifen usw.
Es gibt jedoch einige Schwächen. Eine große Schwäche sind Typecasts - sie sagen im Wesentlichen, dass Sie mit den Objekttypen herumspielen werden, und der Compiler sollte leise sein (wenn es geht).
void*
ist auch eine weitere Schwäche - es ist ein generischer Zeiger auf einen unbekannten Typ, und wenn Sie sie verwenden, müssen Sie besonders vorsichtig sein, dass Sie das Richtige tun. Der Compiler kann die meisten Verwendungen von nicht statisch überprüfenvoid*
.void*
kann auch in einen Zeiger auf einen beliebigen Typ ohne Umwandlung konvertiert werden (nur in C, nicht in C ++), was eine weitere Schwäche darstellt.quelle
Die Literatur ist darüber nicht klar. Ich denke, dass stark getippt nicht Ja / Nein ist, es gibt unterschiedliche Grade starker Typisierung.
Eine Programmiersprache hat eine Spezifikation, wie sie Programme ausführt. Manchmal ist es nicht klar, wie mit bestimmten Programmen ausgeführt werden soll. Zum Beispiel Programme, die versuchen, eine Zeichenfolge von einer Zahl zu subtrahieren. Oder Programme, die durch Null teilen. Es gibt verschiedene Möglichkeiten, mit diesen Bedingungen umzugehen. Einige Sprachen haben Regeln für den Umgang mit diesen Fehlern (z. B. lösen sie eine Ausnahme aus). Andere Sprachen haben einfach keine Regeln, um mit diesen Situationen umzugehen. Diese Sprachen verfügen im Allgemeinen über Typsysteme, um das Kompilieren von Programmen zu verhindern, die zu nicht angegebenem Verhalten führen. Es gibt auch Sprachen mit nicht spezifiziertem Verhalten und ohne Typsystem, um diese Fehler beim Kompilieren zu verhindern (wenn Sie ein Programm schreiben, das auf nicht spezifiziertes Verhalten trifft, werden möglicherweise die Raketen gestartet).
So:
Sprachen, die in jedem Fall angeben, was zur Laufzeit geschieht (z. B. Hinzufügen einer Zahl zu einer Zeichenfolge), werden als dynamisch typisiert bezeichnet. Sprachen, die verhindern, dass Programme zur Kompilierungszeit fehlerhaft ausgeführt werden, werden statisch typisiert. Sprachen, die nicht angeben, was passiert, und auch kein Typsystem zur Vermeidung von Fehlern haben, werden als schwach typisiert bezeichnet.
Ist Java also statisch typisiert? Ja, da das Typsystem das Subtrahieren einer Zeichenfolge von einer Zahl nicht zulässt. Nein, weil Sie damit durch Null teilen können. Sie können die Kompilierung durch Null zur Kompilierungszeit mit einem Typsystem verhindern. Zum Beispiel durch Erstellen eines Zahlentyps, der nicht Null sein kann (z. B. NonZeroInt) und nur durch Zahlen mit diesem Typ dividieren darf.
Ist C also stark oder schwach typisiert? C ist stark typisiert, da das Typsystem einige Typfehler nicht zulässt. In anderen Fällen ist es jedoch schwach typisiert, wenn nicht definiert ist, was passiert (und das Typsystem Sie nicht schützt).
quelle
int
Wert einen Wert von den Benutzer- oder Befehlszeilenargumenten oder einer Datei erhält, kann der Compiler nichts tun, um zu verhindern, dass dies eine Null ist!C wird als schwach typisiert angesehen, da Sie jeden Typ durch einen Cast ohne Compilerfehler in einen anderen Typ konvertieren können. Weitere Informationen zu diesem Problem finden Sie hier .
quelle
C ist stärker typisiert als Javascript und weniger stark typisiert als Ada.
Ich würde sagen, es fällt mehr in die stark typisierte Seite des Kontinuums. aber jemand anderes könnte anderer Meinung sein (auch wenn er sich irrt).
Wie ist das endgültig?
quelle
C wird als statisch typisiert betrachtet (Sie können keine Variablenänderung von int zu float vornehmen). Sobald eine Variable deklariert ist, bleibt sie auf diese Weise hängen.
Es wird jedoch als schwach typisiert angesehen, da die Typen Flip-Flops sein können.
Was ist 0? '\ 0', FALSE, 0.0, etc ..
In vielen Sprachen kann man nicht IF (Variable) sagen, da Bedingungen nur boolesche Werte aus booleschen Ausdrücken übernehmen. Diese sind stärker typisiert. Gleiches gilt für das Wechseln zwischen Zeichen und Ganzzahlen.
Grundsätzlich hat c zwei einfache Hauptdatentypen, Ganzzahlen und Gleitkommazahlen (obwohl verschiedene Präzisionen). Alles andere Boolesche Werte, Aufzählungen (nicht einfach, aber es passt) usw. werden als eine davon implementiert. Sogar Zeichen sind im Grunde ganze Zahlen.
Vergleichen Sie mit anderen Sprachen, in denen es Zeichenfolgentypen gibt, Aufzählungstypen, die nur den definierten Werten zugewiesen werden können, Boolesche Typen, in denen nur Ausdrücke verwendet werden können, die Boolesche Werte oder true / false generieren.
Aber Sie können argumentieren, dass im Vergleich zu Perl C stark typisiert ist. Es ist also eines dieser berühmten Argumente (vi gegen Emacs, Linux gegen Windows usw.). C # ist stärker typisiert als C. Grundsätzlich kann man so oder so argumentieren. Und Ihre Antworten werden wahrscheinlich in beide Richtungen gehen :) Auch einige Lehrbücher / Webseiten sagen, dass C schwach getippt ist, und einige sagen, dass C stark getippt ist. Wenn Sie zu Wikipedia gehen, sagt der C-Eintrag "teilweise schwache Eingabe". Ich würde sagen, im Vergleich zu Python C ist schwach typisiert. Also Python / C #, C, Perl auf dem Kontinuum.
quelle
Viele gute Antworten hier. Ich möchte einen wichtigen Punkt aus Real World Haskell ansprechen :
(schnipsen)
Schauen Sie sich also die Antworten zu C und C ++ an, aber denken Sie daran, dass "stark" und "schwach" nicht "gut" und "schlecht" zugeordnet sind.
quelle
Meiner Meinung nach sind C / C ++ stark typisiert. Die Art der Hacks, mit denen Typen konvertiert werden können (void *), ist aufgrund der Nähe von C zur Maschine vorhanden. Mit anderen Worten, Sie können Assembler-Befehle von Pascal aus aufrufen und Zeiger bearbeiten, und Pascal wird immer noch als stark typisierte Sprache angesehen. Sie können Assembler- und C-ausführbare Dateien von Java über JNI aufrufen, aber Java wird dadurch nicht schwach typisiert.
In C ist nur ein Assembler mit Rohzeigern und dergleichen "eingebettet".
quelle
Der stark typisierte Begriff hat keine vereinbarte Definition. Daher ist es unmöglich, Ihre Frage zu beantworten, es sei denn, Sie definieren, was Sie unter "stark typisiert" verstehen .
Nach meiner Erfahrung werden die Begriffe "stark typisiert" und "schwach typisiert" ausschließlich von Trollen verwendet, da die Trolle aufgrund ihrer fehlenden Definitionen sie in der Mitte des Arguments neu definieren können, um sie ihrer Agenda anzupassen. Anders als beim Starten von Flamewars sind diese Begriffe so gut wie nutzlos.
Vielleicht möchten Sie auch einen Blick auf Was sind die Schlüsselaspekte einer stark typisierten Sprache? hier auf StackOverflow.
quelle
Laut Dennis Ritchie ( Schöpfer von C ) und Brian Kernighan ist C keine stark typisierte Sprache. Die folgenden Zeilen stammen aus dem Buch Die Programmiersprache C Seite 3 Absatz 5
quelle
Es gibt ein Kontinuum mit mehreren parallelen Wegen zwischen "schwach typisiert" und "stark typisiert", zwei Begriffe, die nicht einmal genau definiert sind.
C ist statisch typisiert, da der Compiler den deklarierten Typ jeder lokalen Variablen und jedes Strukturelement kennt .
Dynamisch typisierte Sprachen sind möglicherweise immer noch stark typisiert, wenn jedes Objekt einen bestimmten Typ hat, der Compiler diesen Typ jedoch nicht kennen kann.
quelle
Was ist der Grund für Ihre Anfrage? Der Grund, den ich frage, ist, dass dies ein kleiner Unterschied ist und Ihre spezielle Verwendung von "stark typisiert" möglicherweise mehr oder weniger geklärt werden muss. Ich würde definitiv sagen, dass Java und andere Sprachen strengere Einschränkungen für implizite Typkonversationen haben.
quelle
Es ist schwierig, eine konkrete Antwort zu geben, wenn es keine konkrete Definition von "stark typisiert" gibt. Ich würde sagen, dass C stark typisiert ist, da jede Variable und jeder Ausdruck einen Typ hat, aber schwach typisiert, so dass Sie Typen mithilfe von Casts ändern und die Darstellung eines Typs als einen anderen interpretieren können.
quelle
Ich würde sagen, dass C so stark typisiert ist, wie es Ihr Compiler / Ihre Plattform vorschreibt. Wenn Sie beispielsweise auf einer strengen Plattform aufbauen, wird die Dereferenzierung eines Zeigers vom Typ punned wahrscheinlich unterbrochen:
Wenn Sie dem Compiler nun sagen, dass er striktes Aliasing überspringen soll, ist dies kein Problem, aber nicht sehr portabel. In diesem Sinne ist es möglich, die Grenzen der Sprache zu überschreiten, aber wahrscheinlich nicht die beste Idee. Das geht einen Schritt über das typische Casting hinaus, dh das Casting int so lange und zeigt wirklich eine der möglichen Fallstricke der Leere.
Ich würde also sagen, dass C grundsätzlich streng typisiert ist, aber die verschiedenen Compiler setzen voraus, dass der Programmierer es am besten weiß und eine gewisse Flexibilität zulässt. Dies hängt wirklich vom Compiler ab, einige würden dieses potenzielle Hoppla nicht aufgreifen. In diesem Sinne spielt der Compiler der Wahl wirklich eine Rolle bei der Beantwortung der Frage. Was richtig ist, unterscheidet sich oft von dem, was Ihr Compiler Ihnen ermöglicht, damit durchzukommen.
quelle
c ist schwach typisiert, b ist typlos.
quelle
Nicht stark getippt.
Überlegen Sie, was der folgende Funktionsprototyp über die Datentypen der Argumente aussagt:
Nichts. Daher schlage ich vor, dass hier keine starke Eingabe erfolgt.
quelle
Ich würde sagen, es sind starke Typen, da jeder Ausdruck einen Typ hat, der nicht von seinem Wert abhängt. ei kann es vor der Laufzeit bekannt sein.
OTOH Ich bin mir nicht sicher, ob das die richtige Beschreibung von stark getippt ist. Die einzige stärkere Behauptung, die ich als Grund für eine Sprache sehen kann, wäre die Gewissheit, dass Sie das Typsystem zur Laufzeit nicht durch Neuinterpretation von Typumwandlungen, Gewerkschaften, Aufrufen in andere Sprachen, Zeiger, Assemblersprache usw. untergraben können. Sprachen wie diese existieren, sind aber so verkrüppelt, dass sie für Programmierer außerhalb von hoher Sicherheit und Wissenschaft nicht von großem Interesse zu sein scheinen. Wie jemand
nonZeroInt
betont hat, braucht man Typen wie und so weiter , um das wirklich richtig zu machen . Yuck.quelle