it-swarm.com.de

Ist C stark getippt?

Zitat Wikipedia :

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 Mischbarkeit von Operanden verschiedener Typen ausreichend einschränken und dass beide Sprachen als stark typisierte Sprachen betrachtet werden sollten.

Gibt es eine endgültigere Antwort?

75
Sydius

"Stark getippt" und "schwach getippt" 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 "Laufzeitfehler" führen. . Wenn Sie beispielsweise in Schema versuchen, eine zu true hinzuzufügen, indem Sie (+ 1 #t) dies wird einen Fehler verursachen. 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, einen Wert zu true hinzuzufügen, indem Sie 1 + true wird das Programm mit einer (wahrscheinlich kryptischen) Fehlermeldung abgewiesen. Sie erhalten immer den Fehler, auch wenn der Code möglicherweise nie ausgeführt wird.

Unterschiedliche Menschen bevorzugen unterschiedliche Systeme, zum Teil, weil sie Wert auf Flexibilität legen und sich Sorgen um Laufzeitfehler machen.

Manchmal wird "stark getippt" lose verwendet, um "statisch getippt" zu bedeuten, und "schwach getippt" wird falsch verwendet, um "dynamisch getippt" zu bedeuten. Eine bessere Verwendung für den Begriff "stark typisiert" ist, dass "das Typensystem nicht umgangen oder unterwandert werden kann", während "schwach typisiert" bedeutet, dass "das Typensystem Lücken aufweist". Perverserweise weisen die meisten Sprachen mit statischen Typsystemen Lücken auf, während viele Sprachen mit dynamischen Typsystemen keine Lücken aufweisen.

Keiner dieser Begriffe ist in irgendeiner Weise mit der Anzahl der in einer Sprache verfügbaren impliziten Konvertierungen verbunden.

Wenn Sie genau über Programmiersprachen sprechen möchten, vermeiden Sie am besten die Begriffe "stark getippt" und "schwach getippt". 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 einen beliebigen Zeigertyp in einen beliebigen anderen Zeigertyp umwandeln können. Sie können auch eine Lücke zwischen zwei Typen Ihrer Wahl schließen, indem Sie eine C-Union deklarieren, die zwei Mitglieder hat, eines für jeden der fraglichen Typen.

Ich habe mehr über statisches und dynamisches Tippen geschrieben unter warum-interpretiert-langs-sind-meistens-ducktyped-beim-kompilieren-haben-starkes-Tippen .

141
Norman Ramsey

Es ist schwierig, jede Sprache in "schwach" oder "stark" zu klassifizieren - es ist eher ein Kontinuum. Aber im Vergleich zu anderen Sprachen ist C ziemlich stark typisiert. Jedes Objekt hat einen Typ zur Kompilierungszeit, und der Compiler teilt Ihnen (laut) mit, ob Sie mit einem Objekt etwas tun, das sein Typ nicht zulässt. Sie können beispielsweise keine Funktionen mit den falschen Parametertypen aufrufen, auf nicht vorhandene Struktur-/Gewerkschaftsmitglieder zugreifen usw.

Aber es gibt ein paar Schwächen. Eine große Schwäche sind Typecasts - sie besagen im Wesentlichen, dass Sie mit den Objekttypen herumalbern werden und der Compiler sollte ruhig sein (wenn es geht). void* Ist auch eine andere Schwäche - es ist ein allgemeiner Hinweis 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 void* Nicht statisch überprüfen. void* Kann auch in einen Zeiger auf einen beliebigen Typ ohne Cast konvertiert werden (nur in C, nicht in C++), was eine weitere Schwäche darstellt.

21
Adam Rosenfield

C wird als schwach typisiert angesehen, da Sie jeden Typ durch eine Umwandlung in einen anderen Typ konvertieren können, ohne dass ein Compilerfehler auftritt. Sie können mehr über das Problem lesen hier .

11
mipadi

Die Literatur ist darüber nicht klar. Ich denke, dass stark getippt nicht Ja/Nein ist, es gibt unterschiedliche Grade an starkem Tippen.

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, einen String von einer Zahl zu subtrahieren. Oder Programme, die sich durch Null teilen. Es gibt verschiedene Möglichkeiten, mit diesen Bedingungen umzugehen. Einige Sprachen haben Regeln für den Umgang mit diesen Fehlern (zum Beispiel 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 einem nicht festgelegten Verhalten führen. Es gibt auch Sprachen mit nicht spezifiziertem Verhalten und ohne ein Typsystem, das diese Fehler beim Kompilieren verhindert (wenn Sie ein Programm schreiben, das auf nicht spezifiziertes Verhalten stößt, werden möglicherweise Raketen gestartet).

So:

Sprachen, die angeben, was in jedem Fall zur Laufzeit geschieht (z. B. das Hinzufügen einer Zahl zu einer Zeichenfolge), werden als dynamisch typisiert bezeichnet. Sprachen, die verhindern, dass Programme mit Fehlern beim Kompilieren ausgeführt werden, sind statisch typisiert. Sprachen, die nicht angeben, was passiert, und die auch kein Typsystem zur Vermeidung von Fehlern haben, werden als schwach typisiert bezeichnet.

Ist also Java statisch typisiert? Ja, weil sein Typsystem das Subtrahieren eines Strings von einer Zahl nicht zulässt. Nein, weil es das Teilen durch Null ermöglicht. Sie können das Teilen durch Null beim Kompilieren mit verhindern B. indem Sie einen Zahlentyp erstellen, der nicht Null sein darf (z. B. NonZeroInt) und nur die Division durch Zahlen dieses Typs zulassen.

Ist C also stark oder schwach typisiert? C ist stark typisiert, da das Typsystem einige Typfehler nicht zulässt. Aber es ist in anderen Fällen schwach geschrieben, wenn nicht definiert ist, was passiert (und das Typensystem Sie nicht schützt).

9
Jules

C ist stärker als Javascript und weniger stark als Ada getippt.

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?

7
Michael Burr

Viele gute Antworten hier. Ich möchte einen wichtigen Punkt von Real World Haskell ansprechen:

Es ist nützlich zu wissen, dass viele Sprachgemeinschaften ihre eigenen Definitionen eines „starken Typs“ haben. Trotzdem werden wir kurz und allgemein über den Begriff der Festigkeit in Typsystemen sprechen.

(snip)

Das Feuerwerk um Typensysteme hat seine Wurzeln im gewöhnlichen Englisch, wo die Leute den Wörtern „schwach“ und „stark“ Wertvorstellungen beimessen: Wir betrachten Stärke normalerweise als besser als Schwäche. Viel mehr Programmierer sprechen einfaches Englisch als akademische Fachsprache, und häufig werfen Akademiker Ziegelsteine ​​auf ein System, das nicht ihren Vorstellungen entspricht. Das Ergebnis ist oft dieser beliebte Internet-Zeitvertreib, ein Flammenkrieg.

Schauen Sie sich also die Antworten zu C und C++ an, aber denken Sie daran, dass "stark" und "schwach" nicht "gut" und "schlecht" sind.

4
slim

C wird als statisch typisiert betrachtet (Sie können keine variable Änderung von int zu float vornehmen). Sobald eine Variable deklariert ist, bleibt sie auf diese Weise hängen.

Es wird jedoch als schwach getippt angesehen, da die Typen Flip-Flops darstellen 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 annehmen. Diese sind stärker typisiert. Gleiches gilt für das Wechseln zwischen Zeichen und ganzen Zahlen.

grundsätzlich hat c zwei einfache Hauptdatentypen, Ganzzahlen und Gleitkommazahlen (obwohl verschiedene Präzisionen). Alle anderen Booleschen Werte, Aufzählungen (nicht einfach, aber es passt) usw. werden als eine davon implementiert. Gerade Zeichen sind im Grunde genommen 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 geschrieben als C. Grundsätzlich kann man so oder so argumentieren. Und Ihre Antworten werden wahrscheinlich in beide Richtungen gehen :) Auch einige Lehrbücher/Webseiten werden sagen, dass C schwach getippt ist, und einige werden sagen, dass C stark getippt ist. Wenn Sie zu Wikipedia gehen, sagt der C-Eintrag "teilweise schwache Typisierung". Ich würde sagen, im Vergleich zu Python C ist schwach typisiert. Also Python/C #, C, Perl auf dem Kontinuum.

4
Cervo

Der Begriff stark typisiert hat keine vereinbarte Definition. Daher ist es unmöglich, Ihre Frage zu beantworten, es sei denn, Sie definieren, was Sie mit "stark getippt" meinen .

Nach meiner Erfahrung werden die Begriffe "stark typisiert" und "schwach typisiert" ausschließlich von Trollen verwendet , da die Trolle sie aufgrund fehlender Definitionen neu definieren können mitten in der Auseinandersetzung, um ihrer Tagesordnung zu entsprechen. Anders als zum Starten von Flammenkriegen sind diese Begriffe so gut wie unbrauchbar.

Vielleicht möchten Sie auch einen Blick auf Was sind die Hauptaspekte einer stark typisierten Sprache? hier auf StackOverflow werfen.

2
Jörg W Mittag

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

C ist keine stark typisierte Sprache, aber im Laufe der Entwicklung wurde die Typprüfung verstärkt.

2
mightyWOZ

Meiner Meinung nach sind C/C++ stark typisiert. Die Arten von Hacks, mit denen Typen konvertiert werden können (void *), sind 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-Programmdateien von Java über JNI aufrufen, aber es macht Java schwach typisiert.

C hat nur Assembler "eingebettet" mit rohen Zeigern und so weiter.

2
mannicken

Es gibt ein Kontinuum mit mehreren parallelen Wegen zwischen "schwach typisiert" und "stark typisiert", zwei Begriffen, die nicht einmal gut definiert sind.

C ist statisch typisiert, indem der Compiler den deklarierten Typ jeder lokalen Variablen und Strukturelemente kennt.

Dynamisch typisierte Sprachen sind möglicherweise immer noch stark typisiert, wenn jedes Objekt einen bestimmten Typ hat, der Compiler diesen Typ jedoch nicht kennt.

1
yfeldblum

c ist schwach getippt, b ist typenlos.

1
plan9assembler

Ich würde sagen, dass C so stark geschrieben ist, wie es Ihr Compiler/Ihre Plattform vorschreibt. Wenn Sie beispielsweise auf einer strengen Plattform aufbauen, wird die Dereferenzierung eines typgesteuerten Zeigers wahrscheinlich zum Erliegen kommen:

void m_free(void **p)
{
        if (*p != NULL) {
                free(*p);
                *p = NULL;
        }
}

....
char *str = strdup("foo");
m_free((void **) &foo);

Wenn Sie den Compiler anweisen, striktes Aliasing zu überspringen, 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 Werfen hinaus, d. H. Das Werfen von int so lange und zeigt wirklich eine der möglichen Tücken der Leere.

Ich würde also sagen, C ist im Grunde genommen streng getippt, aber die verschiedenen Compiler gehen davon aus, dass der Programmierer es am besten weiß und etwas Flexibilität zulässt. Dies hängt wirklich vom Compiler ab, einige würden dieses potenzielle Hoppla nicht wahrnehmen. 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 Ihnen Ihr Compiler erlaubt.

0
Tim Post

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 Klarheit erfordert. Ich würde definitiv sagen, dass Java und andere Sprachen strengere Beschränkungen für implizite Konversationstypen haben.

0
BobbyShaftoe

Es ist schwierig, eine konkrete Antwort zu geben, wenn es keine konkrete Definition von "stark typisiert" gibt. Ich würde sagen, dass C stark darin geschrieben ist, dass jede Variable und jeder Ausdruck einen Typ hat, aber schwach darin geschrieben ist, dass Sie Typen mit Casts ändern und die Darstellung eines Typs als einen anderen neu interpretieren können.

0
Robert Gamble