Die Antwort auf Ihre Frage hängt davon ab, um welche C-Sprache es sich handelt.
Die Sprache, die in Dennis Ritchies C-Referenzhandbuch von 1974 beschrieben wurde, war eine einfache Sprache, die den Programmierkomfort höherer Programmiersprachen bot. Von dieser Sprache abgeleitete Dialekte waren ebenfalls eher einfache Programmiersprachen.
Als der C-Standard 1989/1990 veröffentlicht wurde, beschrieb er jedoch nicht die für die Programmierung tatsächlicher Maschinen populäre Low-Level-Sprache, sondern eine höhere Sprache, die sein könnte - aber nicht sein musste. -implementiert in untergeordneten Begriffen.
Wie die Autoren des C-Standards bemerken, war eines der Dinge, die die Sprache nützlich machten, dass viele Implementierungen als Assembler auf hoher Ebene behandelt werden konnten. Da C auch als Alternative zu anderen Hochsprachen verwendet wurde und viele Anwendungen nicht die Fähigkeit erforderten, Dinge zu tun, die Hochsprachen nicht konnten, erlaubten die Autoren des Standards, dass sich Implementierungen willkürlich verhalten wenn Programme versuchten, Konstrukte auf niedriger Ebene zu verwenden. Folglich war die von der C-Norm beschriebene Sprache niemals eine Programmiersprache auf niedriger Ebene.
Überlegen Sie, wie Ritchies Sprache und C89 das Codefragment anzeigen, um diese Unterscheidung zu verstehen:
struct foo { int x,y; float z; } *p;
...
p[3].y+=1;
Auf einer Plattform, auf der "char" 8 Bit, "int" 16 Bit Big-Endian, "float" 32 Bit und Strukturen ohne spezielle Auffüll- oder Ausrichtungsanforderungen sind, beträgt die Größe von "struct foo" 8 Byte.
In Ritchies Sprache würde das Verhalten der letzten Anweisung die in "p" gespeicherte Adresse annehmen, 3 * 8 + 2 [dh 26] Bytes hinzufügen und einen 16-Bit-Wert aus den Bytes an dieser und der nächsten Adresse abrufen Fügen Sie diesem Wert einen hinzu, und schreiben Sie diesen 16-Bit-Wert in dieselben zwei Bytes zurück. Das Verhalten würde so definiert, dass es auf das 26. und 27. Byte folgt, das auf das unter der Adresse p angegebene folgt, ohne Rücksicht darauf, welche Art von Objekt dort gespeichert ist.
In der durch den C-Standard definierten Sprache würde für den Fall, dass * p ein Element eines "struct foo []" identifiziert, auf das mindestens drei vollständigere Elemente dieses Typs folgen, die letzte Anweisung dem Mitglied y von eins hinzufügen das dritte Element nach * p. Unter keinen anderen Umständen würde das Verhalten durch den Standard definiert.
Ritchies Sprache war eine einfache Programmiersprache, da sie es einem Programmierer ermöglichte, Abstraktionen wie Arrays und Strukturen zu verwenden, wenn dies zweckmäßig war, und das Verhalten in Bezug auf das zugrunde liegende Layout von Objekten im Speicher definierte. Im Gegensatz dazu definiert die von C89 und späteren Standards beschriebene Sprache die Dinge im Sinne einer übergeordneten Abstraktion und definiert nur das Verhalten von Code, das damit übereinstimmt. Qualitativ hochwertige Implementierungen, die für die Programmierung auf niedriger Ebene geeignet sind, verhalten sich in mehr Fällen als im Standard vorgeschrieben, aber es gibt kein "offizielles" Dokument, in dem angegeben ist, was eine Implementierung tun muss, um für solche Zwecke geeignet zu sein.
Die von Dennis Ritchie erfundene C-Sprache ist daher eine einfache Sprache und wurde als solche anerkannt. Die vom C-Normungsausschuss erfundene Sprache war jedoch nie eine Sprache mit niedrigem Sprachniveau, da keine Garantien für die Implementierung vorlagen, die über die Vorgaben des Standards hinausgingen.