Ist C stark typisiert?

Lesezeit: 10 Minuten

Benutzeravatar von Sydius
Sydius

Zitieren Wikipedia:

Zwei häufig verwendete Sprachen, die viele Arten der impliziten Konvertierung unterstützen, sind C und C++, und es wird manchmal behauptet, dass dies schwach typisierte Sprachen sind. Andere argumentieren jedoch, dass diese Sprachen der Art und Weise, wie Operanden verschiedener Typen gemischt werden können, genügend Beschränkungen auferlegen, sodass die beiden als stark typisierte Sprachen betrachtet werden sollten.

Gibt es eine definitivere Antwort?

  • Für einen C-Programmierer bedeutet starkes Tippen, stärker auf die Tasten zu drücken.

    – Dan Färber

    10. Januar 2009 um 0:28 Uhr

  • C ist auf der schwachen Seite im Typisierungskontinuum. Aber es gibt genug Gegenstände auf beiden Seiten, über die man so oder so streiten kann. Wenn Sie schon dabei sind, können Sie auch fragen (vi oder emacs, netbeans oder eclipse usw.)

    – Cervo

    10. Januar 2009 um 0:35 Uhr

  • Der Stand der Dinge bei Wikipedia war so schlimm, dass ich mich genötigt fühlte, mehrere Wikipedia-Seiten zu bearbeiten. Vielleicht ist es jetzt etwas besser. Vielleicht.

    – Norman Ramsey

    10. Januar 2009 um 2:46 Uhr

  • Betreff: Dans Kommentar (um dem gerecht zu werden) Peter van der Lindens Buch “Expert C Programming” enthält die folgende Zeile: “Bis heute glauben viele C-Programmierer, dass “starkes Tippen nur bedeutet, extra hart auf die Tastatur zu hämmern.”

    – Alexandros Gezerlis

    2. Dezember 2010 um 6:08 Uhr

  • Sehr gute Frage!!!

    – Destruktor

    5. April 2016 um 16:07 Uhr

Benutzeravatar von Norman Ramsey
Norman Ramsey

„Stark typisiert“ und „schwach typisiert“ sind Begriffe, die keine allgemein vereinbarte technische Bedeutung haben. Begriffe, die eine klar definierte Bedeutung haben, sind

  • Dynamisch typisiert bedeutet, dass Typen zur Laufzeit an Werte angehängt werden, und ein Versuch, Werte verschiedener Typen zu mischen, kann einen “Laufzeittypfehler” verursachen. Zum Beispiel, wenn Sie in Scheme versuchen, eins zu true hinzuzufügen, indem Sie schreiben (+ 1 #t) dies führt zu einem Fehler. Der Fehler tritt nur auf, wenn Sie versuchen, den anstößigen Code auszuführen.

  • Statisch typisiert bedeutet, dass Typen zur Kompilierzeit überprüft werden und ein Programm, das keinen statischen Typ hat, vom Compiler zurückgewiesen wird. Zum Beispiel, wenn Sie in ML versuchen, eins zu wahr hinzuzufügen, indem Sie schreiben 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 Menschen bevorzugen unterschiedliche Systeme, teilweise abhängig davon, wie sehr sie Flexibilität schätzen und wie sehr sie sich Sorgen um Laufzeitfehler machen.

Manchmal wird “stark typisiert” lose verwendet, um “statisch typisiert” zu bedeuten, und “schwach typisiert” wird fälschlicherweise 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, dass “es Schlupflöcher im Typsystem gibt”. Perverserweise haben die meisten Sprachen mit statischen Typsystemen Schlupflöcher, während viele Sprachen mit dynamischen Typsystemen keine Schlupflöcher haben.

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

Wenn Sie konkret über Programmiersprachen sprechen wollen, 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 Schlupflöcher hat. Eine Lücke besteht darin, dass Sie jeden Zeigertyp frei in jeden anderen Zeigertyp umwandeln können. Sie können auch eine Lücke zwischen zwei beliebigen Typen Ihrer Wahl erstellen, indem Sie eine C-Vereinigung deklarieren, die zwei Mitglieder hat, einen für jeden der fraglichen Typen.

Mehr über statische und dynamische Typisierung habe ich unter why-interpreted-langs-are-mostly-ducktyped-while-compiled-have-strong-typing geschrieben.

  • Woher haben Sie die Definitionen, die Sie für starke/schwache Typisierung vorschlagen (das Schlupfloch-Ding)?

    – Sydius

    10. Januar 2009 um 19:48 Uhr

  • Warum brauchen Sie eine “Schlupfstelle” in einer dynamischen Tippumgebung?

    – Chris Conway

    10. Januar 2009 um 20:01 Uhr

  • @Sydius: Da ich einen Großteil der letzten 20 Jahre damit verbracht habe, mit Leuten abzuhängen, die Programmiersprachen und Typsysteme entwerfen, bauen und analysieren. Das ist mein bezahlter Job 🙂

    – Norman Ramsey

    11. Januar 2009 um 1:47 Uhr

  • @Chris: Ich habe noch nie eine dynamisch typisierte Sprache mit ‘Schlupfloch’ gesehen. Die übliche Verwendung von loophole besteht darin, mit einem Laufzeitsystem oder Betriebssystem zu arbeiten, z. B. eine Rohadresse zu nehmen und sie in einen Zeiger auf einen wohlerzogenen Sprachwert umzuwandeln. Sie könnten dies in einer dynamischen Umgebung tun, aber mir sind keine Versuche bekannt.

    – Norman Ramsey

    11. Januar 2009 um 1:51 Uhr

  • @NormanRamsey Ich denke, Chris bezog sich mit seiner Frage auf: whereas "weakly typed" means "there are loopholes in the type system

    – Nir Alfasi

    28. Juli 2014 um 6:49 Uhr

Es ist schwierig, jede Sprache in „schwach“ oder „stark“ typisiert zu klassifizieren – es ist eher ein Kontinuum. Aber im Vergleich zu anderen Sprachen ist C ziemlich stark typisiert. Jedes Objekt hat einen Kompilierzeittyp, und der Compiler wird Sie (laut) darüber informieren, wenn Sie etwas mit einem Objekt tun, das Sie aufgrund seines Typs nicht tun können. Sie können beispielsweise keine Funktionen mit den falschen Parametertypen aufrufen, auf nicht vorhandene Struct/Union-Mitglieder zugreifen usw.

Aber es gibt ein paar Schwächen. Eine große Schwäche sind Typumwandlungen – sie sagen im Wesentlichen, dass Sie mit den Objekttypen herumspielen werden und der Compiler ruhig sein sollte (wenn er kann). void* ist auch eine weitere Schwäche – es ist ein allgemeiner Hinweis auf einen unbekannten Typ, und wenn Sie sie verwenden, müssen Sie besonders darauf achten, dass Sie das Richtige tun. Der Compiler kann die meisten Verwendungen von nicht statisch überprüfen void*. void* kann auch ohne Cast in einen Zeiger auf einen beliebigen Typ umgewandelt werden (nur in C, nicht in C++), was eine weitere Schwäche darstellt.

  • Schöne Antwort, obwohl mich “Typecasts … und Compiler ruhig sein sollten” stört. Eine Typumwandlung ist nicht wie das Abschalten einer Warnung, sie ändert tatsächlich die Interpretation des Werts, auf den verwiesen wird.

    – Großer Jeff

    10. Januar 2009 um 20:12 Uhr

  • Sie verwechseln “statisch” und “stark” in Bezug auf das Tippen. Diese beiden Konzepte sind unabhängig voneinander.

    – beugen

    10. Januar 2009 um 21:08 Uhr

  • Dennis Richie (C-Autor) nannte C „stark typisiert und schwach geprüft“

    – Tim Zaman

    2. Juli 2018 um 2:40 Uhr

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

  • Wikipedia ist hier irreführend. C ist stark typisiert, Typen sind sehr gültig und der Compiler wird kotzen, wenn Sie sie falsch verstehen, aber C bietet auch Funktionen, mit denen Sie dies umgehen können. Vergleichen Sie mit Sprachen wie BCPL, die nur einen „Byte“-Typ haben.

    – gbjbaanb

    10. Januar 2009 um 0:41 Uhr

  • Schwach typisiert bedeutet nicht, dass eine Sprache keine Typen hat, es bedeutet nur, dass Typen implizit von einem Typ zum anderen gezwungen werden können. Vergleichen Sie mit Python, einer stark typisierten Sprache, in der Sie Typen explizit mit Funktionsaufrufen konvertieren müssen.

    – Mipadi

    10. Januar 2009 um 5:57 Uhr

  • trägt die Fähigkeit, ein Ding in C zu casten, auch dazu bei, dass es ein schwacher Typ ist.?? Ich habe diesen Zweifel für immer

    – Suraj Jain

    8. Januar 2017 um 13:29 Uhr

Die Literatur ist darüber nicht eindeutig. Ich denke, dass stark typisiert 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 man bestimmte Programme ausführt. Beispielsweise Programme, die versuchen, eine Zeichenfolge von einer Zahl zu subtrahieren. Oder Programme, die durch Null dividieren. Es gibt mehrere 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 zu verhindern, dass Programme kompiliert werden, die zu unspezifischem Verhalten führen. Und es gibt auch Sprachen, die ein nicht spezifiziertes Verhalten haben und kein Typsystem haben, um diese Fehler zur Kompilierungszeit zu verhindern (wenn Sie ein Programm schreiben, das auf ein nicht spezifiziertes Verhalten stößt, könnte es die Raketen starten).

So:

Sprachen, die angeben, was in jedem Fall zur Laufzeit passiert (wie das Hinzufügen einer Zahl zu einer Zeichenfolge), werden als dynamisch typisiert bezeichnet. Sprachen, die die Ausführung von Programmen mit Fehlern zur Kompilierzeit verhindern, sind statisch typisiert. Sprachen, die nicht spezifizieren, was passiert, und die auch kein Typsystem haben, um Fehler zu vermeiden, werden als schwach typisiert bezeichnet.

Ist Java also statisch typisiert? Ja, weil das Typsystem das Subtrahieren einer Zeichenfolge von einer Zahl verbietet. Nein, weil es Ihnen erlaubt, durch Null zu dividieren. Sie könnten die Division durch Null zur Kompilierzeit mit einem Typsystem verhindern. Zum Beispiel, indem Sie einen Zahlentyp erstellen, der nicht Null sein kann (zB NonZeroInt), und nur die Division durch Zahlen dieses Typs zulassen.

Ist C also stark typisiert 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).

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

Ich würde sagen, es fällt eher in die stark typisierte Seite des Kontinuums. aber jemand anderes könnte anderer Meinung sein (auch wenn er falsch liegt).

Wie ist das endgültig?

  • Es war eine etwas ironische Antwort. Aber erläutern Sie die Unrichtigkeit.

    – Michael Burr

    10. Januar 2009 um 16:32 Uhr

  • Javascript ist stark typisiert. Es ist einfach nicht statisch typisiert. Alle Typprüfungen erfolgen zur Laufzeit (dynamisch, nicht statisch), aber sie treten auf und verhindern, dass Sie den Speicher beschädigen (ein Aspekt der starken Typisierung).

    – beugen

    10. Januar 2009 um 21:11 Uhr

  • Nun, wie die sehr gute Antwort von Norm Ramsey zeigt, sind “stark typisiert” und “schwach typisiert” keine besonders gut definierten Begriffe. Da Javascript stark typisiert ist, könnten einige glauben, dass (“4″ / ​​”2”) ein gültiger Javascript-Ausdruck ist, was auf etwas anderes hindeuten könnte.

    – Michael Burr

    10. Januar 2009 um 22:10 Uhr

Benutzeravatar von Cervo
Cervo

C wird als statisch typisiert betrachtet (Sie können eine Variable nicht von int zu float ändern lassen). Sobald eine Variable deklariert ist, bleibt sie auf diese Weise hängen.

Es wird jedoch als schwach typisiert angesehen, da die Typen umgedreht werden können.

Was ist 0? ‘\0’, FALSE, 0.0 usw..

In vielen Sprachen können Sie nicht IF (Variable) sagen, da Bedingungen nur boolesche Werte aus booleschen Ausdrücken annehmen. Diese sind stärker typisiert. Dasselbe gilt für das Wechseln zwischen Zeichen und ganzen Zahlen.

Grundsätzlich hat c zwei einfache Hauptdatentypen, Ganzzahlen und Gleitkommazahlen (obwohl verschiedene Genauigkeiten). Alle anderen Booleans, Enums (nicht einfach, aber es passt) usw. werden als solche implementiert. Gerade Zeichen sind im Grunde ganze Zahlen.

Vergleichen Sie mit anderen Sprachen, wo es String-Typen gibt, Enum-Typen, die nur den definierten Werten zugewiesen werden können, boolesche Typen, wo nur Ausdrücke verwendet werden können, die boolesche Werte oder wahr/falsch erzeugen.

Aber man kann argumentieren, dass C im Vergleich zu Perl stark typisiert ist. Es ist also eines dieser berühmten Argumente (vi vs. emacs, linux vs. 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 werden sagen, dass C schwach typisiert ist, und einige werden sagen, dass C stark typisiert ist. Wenn Sie zu Wikipedia gehen, sagt der C-Eintrag “teilweise schwache Typisierung”. Ich würde sagen, im Vergleich zu Python ist C schwach typisiert. Also Python/C#, C, Perl auf dem Kontinuum.

  • Es war eine etwas ironische Antwort. Aber erläutern Sie die Unrichtigkeit.

    – Michael Burr

    10. Januar 2009 um 16:32 Uhr

  • Javascript ist stark typisiert. Es ist einfach nicht statisch typisiert. Alle Typprüfungen erfolgen zur Laufzeit (dynamisch, nicht statisch), aber sie treten auf und verhindern, dass Sie den Speicher beschädigen (ein Aspekt der starken Typisierung).

    – beugen

    10. Januar 2009 um 21:11 Uhr

  • Nun, wie die sehr gute Antwort von Norm Ramsey zeigt, sind “stark typisiert” und “schwach typisiert” keine besonders gut definierten Begriffe. Da Javascript stark typisiert ist, könnten einige glauben, dass (“4″ / ​​”2”) ein gültiger Javascript-Ausdruck ist, was auf etwas anderes hindeuten könnte.

    – Michael Burr

    10. Januar 2009 um 22:10 Uhr

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 seiner Entwicklung wurde seine Typprüfung verstärkt.

1420450cookie-checkIst C stark typisiert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy