Warum wurden Arrays mit variabler Länge in C 2011 optional gemacht?


12

Als VLAs in C 1999 eingeführt wurden, fand ich, dass dies eine große Neuerung für die Sprache war. Nachdem ich jedoch erfahren habe, dass es in C 2011 optional ist, frage ich mich, was zu seiner Statusänderung geführt hat und ob es bedeutet, dass die Funktion tatsächlich veraltet ist. Wenn ja, gibt es einen entsprechenden Begriff für die automatische Verwaltung von Daten mit dynamischer Größe, der diese ersetzen soll?

Ich habe versucht, das C 2011-Grunddokument zu finden, aber es scheint noch nicht veröffentlicht zu sein.


Fehlende Adoption?
Ryan Reich

@ RyanReich: Wahrscheinlich, aber warum der Widerstand von den Anbietern?
jxh

Antworten:


8

Ich habe Legenden gehört, die von "es sollte optional sein, da einige kleine Compiler in der Lage sein sollten, ohne VLAs C11-kompatibel zu sein" bis zu "es war ein Fehler an erster Stelle" reichen. Ich habe jedoch nie eine wahre und eindeutige Antwort auf diese Frage erhalten. Letztendlich glaube ich nicht, dass jemand wirklich einen hat, da der Grund (vorausgesetzt - und hoffentlich - es gibt einen) nie bekannt gegeben wurde (soweit meine alten Recherchen gingen).


Aus Kapitel 4 (Seite 13) von Rationale for International Standard - Programmiersprachen - C 5.10 (2003)

Durch die Definition konformer Implementierungen in Bezug auf die von ihnen akzeptierten Programme öffnet der Standard im Rahmen einer konformen Implementierung die Tür für eine breite Klasse von Erweiterungen. Durch die Definition von sowohl konformen gehosteten als auch konformen freistehenden Implementierungen erkennt der Standard die Verwendung von C zum Schreiben von Programmen wie Betriebssystemen und ROM-basierten Anwendungen sowie konventionelleren gehosteten Anwendungen. Über dieses zweistufige Schema hinaus wird für C keine zusätzliche Teilmenge definiert, da der C89-Ausschuss der Ansicht ist, dass zu viele Stufen die Wirksamkeit eines Standards stark beeinträchtigen .

Betonung meiner. Beachten Sie, dass diese Entscheidung ihrer eigenen Begründung zuwiderläuft. Noch eine andere Sache optional gemacht. Jetzt bekommst du entweder __STDC_NO_VLA__VLA oder Support. Es ist eine sehr seltsame Entscheidung.


@ jxh Hab das nicht mal gesehen. Vielen Dank, dass Sie darauf hingewiesen haben, dass der Wortlaut jetzt klarer und weniger mehrdeutig ist. Ich habe Motiv in einigen Zusammenhängen als Synonym für Motiv und Ziel gesehen, aber ich glaube, dass es nur in künstlerischen Szenarien üblich ist.
Bernardo Sulzbach

Das Problem bei einem Zwei-Ebenen-Schema besteht darin, dass es viele nützliche Funktionen und Garantien gibt, die zwar weit verbreitet, aber nicht allgemein unterstützt werden, und mit denen einige Arten von Programmen möglicherweise wesentlich effizienter geschrieben werden können, als dies ansonsten möglich wäre. Das Fehlen standardisierter Mittel zum Testen der Verfügbarkeit solcher Funktionen macht es für einen erheblichen Teil der praktischen Programme in vielen Bereichen erforderlich, Garantien in Anspruch zu nehmen, die über die im Standard enthaltenen hinausgehen, und erschwert die Ermittlung Gewissheit, ob eine bestimmte ...
Supercat

... Programm wird mit einer bestimmten Implementierung arbeiten. Durch die Definition einer größeren Anzahl optionaler Funktionen und Garantien, die Implementierungen entweder unterstützen oder ablehnen können (indem sie die Kompilierung ablehnen), kann auf einfache Weise überprüft werden, ob ein Programm, das seine Anforderungen ordnungsgemäß spezifiziert, auf einer Plattform ordnungsgemäß funktioniert: try um es zu bauen. Wenn es baut, wird es funktionieren. Wenn nicht, wird es offensichtlich nicht. Erhöhen des Anteils von Programmen, für die garantiert werden kann, dass ein erfolgreicher Build einen erfolgreichen Betrieb garantiert ...
supercat

... scheint weitaus wertvoller zu sein, als nur die Anzahl der Compiler zu maximieren, die den winzigen Bruchteil von Programmen verarbeiten können, die nicht von Funktionen und Garantien profitieren, die über die Anforderungen des Standards hinausgehen.
Supercat

4

Soweit ich aus den Dokumenten des öffentlichen Ausschusses (insbesondere N1395 ) ermitteln kann, bestand einer der Hauptgründe für die Optionierung von VLAs (zusammen mit komplexer Arithmetik und Threading) darin, die Erstellung konformer C-Compiler für kleine eingebettete Prozessoren zu ermöglichen.

Der Trend ging dahin, dass die Compiler-Anbieter, die auf Embedded-Systeme abzielen, auf dem C90-Standard blieben, da die großen Funktionen eingeführt wurden, nach denen ihre Kunden nicht fragten.


In vielen Fällen wurden "gefragt, ausgelassen zu haben". Wenn Sie sich die Änderung des RAM-Speicherbedarfs ansehen, wenn Sie diese Funktionen aktivieren, wird deutlich, warum manche Benutzer diese nicht möchten. Es kann die Kosten des Prozessors verdoppeln, was der teuerste Teil des Systems sein kann.
Ich bin

1
@JerryCoffin: Ja, aber der Code wird nur generiert, wenn sizeof () tatsächlich für das Array verwendet wird. Der Compiler muss die Informationen nachverfolgen, damit der richtige Code generiert werden kann. Diese Informationen müssen jedoch nicht in die speicherinterne Darstellung der VLA eingebettet werden.
jxh

2
@jxh: Wie ursprünglich vorgesehen, verwendeten freistehende und gehostete Implementierungen dieselbe Kernsprache. Die Unterschiede beschränkten sich auf die Bibliothek. Bei VLAs gibt es einen Unterschied in der Sprache selbst, der (zumindest für einige Anbieter) für kleinere eingebettete Systeme nicht geeignet war. Bezüglich der Einbettung der Größe gilt: Nein, dies ist wahrscheinlich nie unbedingt erforderlich, kann aber der einfachste Weg sein (z. B. können durch einige Byte Speicherplatz für die Größe viele Byte Code für die Berechnung vermieden werden).
Jerry Coffin

1
@supercat: Ich kann die Logik der Cherry-Picking-C-Bibliotheksfunktionalität nachvollziehen, aber für jemanden, der versucht, plattformübergreifenden C-Code zu schreiben, scheint es ausgesprochen wenig hilfreich, Sprachfunktionen "optional" zu machen. Es verwendete zu sein , dass C die offensichtliche Wahl für Nähe von Metallsystemen war die Programmierung , die leicht zu einem anderen Compiler und andere Hardware - Plattform neu ausgerichtet werden. Nun ist es nicht so offensichtlich.
jxh

1
@supercat: Das Bombardieren des Stapels ist nicht nur VLA vorbehalten. Ungewöhnlich große automatische Objekte oder ein uneingeschränkter Funktionsaufrufstapel weisen ähnliche Probleme auf. Wenn der Standard ein Mittel zur Erkennung von Fehlern für diese Fälle definiert, funktioniert dies wahrscheinlich auch für VLA. Optional ist es nur schwieriger zu argumentieren, dass neue C-Funktionen in neuem C-Code in neuen Projekten verwendet werden, die für die Arbeit auf mehreren Plattformen mit Compilern mehrerer Hersteller erforderlich sind.
jxh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.