Dlaczego tablice o zmiennej długości stały się opcjonalne w C 2011?

12

Kiedy VLA zostały wprowadzone w C 1999, pomyślałem, że to świetna innowacja dla języka. Jednak dowiedziawszy się, że stało się ono opcjonalne w C 2011, zastanawiam się, co doprowadziło do jego zmiany statusu i czy to oznacza, że ​​ta funkcja jest rzeczywiście przestarzała. Jeśli tak, to czy istnieje równoważne pojęcie automatycznego zarządzania danymi o dynamicznych rozmiarach, które rozważa się w celu ich zastąpienia?

Próbowałem znaleźć dokument uzasadniający dla C 2011, ale wydaje się, że nie został jeszcze opublikowany.

jxh
źródło
Brak adopcji?
Ryan Reich,
@RyanReich: Prawdopodobnie, ale dlaczego opór ze strony dostawców?
jxh

Odpowiedzi:

8

Słyszałem legendy od „powinno być opcjonalne, ponieważ niektóre małe kompilatory powinny być zgodne z C11 bez VLA” do „to był błąd na pierwszym miejscu”. Jednak nigdy nie mam na to jednoznacznej i konkretnej odpowiedzi. Ostatecznie nie sądzę, aby ktokolwiek naprawdę miał taki, ponieważ przyczyna (zakładając - i mam nadzieję - że istnieje) nigdy nie została ujawniona (tak dalece, jak poszły moje stare wyszukiwania).


Z rozdziału 4 (strona 13) uzasadnienia standardu międzynarodowego - języki programowania - C 5.10 (2003)

Poprzez zdefiniowanie zgodnych implementacji w kategoriach programów, które akceptują, Standard pozostawia otwarte drzwi dla szerokiej klasy rozszerzeń w ramach zgodnej implementacji. Poprzez zdefiniowanie zarówno zgodnych hostowanych, jak i zgodnych implementacji wolnostojących, Standard rozpoznaje użycie C do pisania takich programów, jak systemy operacyjne i aplikacje oparte na pamięci ROM, a także bardziej konwencjonalne hostowane aplikacje. Poza tym dwupoziomowym schematem nie zdefiniowano żadnego dodatkowego podzbioru dla C, ponieważ Komitet C89 był przekonany, że zbyt wiele poziomów osłabia skuteczność normy .

Podkreśl moje. Zauważ, że decyzja ta jest sprzeczna z ich uzasadnieniem. Jeszcze jedna rzecz stała się opcjonalna. Teraz możesz uzyskać __STDC_NO_VLA__wsparcie VLA. To bardzo dziwna decyzja.

Bernardo Sulzbach
źródło
@jxh Nawet tego nie widziałem. Dziękujemy za zwrócenie uwagi, że zostało zmienione na jaśniejsze i mniej dwuznaczne sformułowania. Widziałem motyw jako synonim motywu i celu w niektórych kontekstach, ale wierzę, że jest to powszechne tylko w scenariuszach artystycznych.
Bernardo Sulzbach,
Problem z posiadaniem tylko dwupoziomowego schematu polega na tym, że istnieje wiele przydatnych funkcji i gwarancji, które są szeroko, ale nie dość powszechnie obsługiwane, i które mogą pozwolić na pisanie niektórych rodzajów programów znacznie wydajniej, niż byłoby to możliwe. Brak jakichkolwiek standardowych metod testowania dostępności takich funkcji powoduje, że znaczna część, jeśli nie większość praktycznych programów w wielu dziedzinach wymaga korzystania z gwarancji wykraczających poza te zawarte w Normie, i utrudnia określenie tego za pomocą pewność, czy jakiś konkretny ...
supercat 21.04.16
... program będzie działał z każdym konkretnym wdrożeniem. Zdefiniowanie większej liczby opcjonalnych funkcji i gwarancji, które implementacje mogą obsługiwać lub odrzucać (poprzez odrzucenie kompilacji), umożliwiłyby łatwy i łatwy standardowy sposób testowania, czy program, który poprawnie określa swoje wymagania, będzie działał poprawnie na platformie: spróbuj zbudować to. Jeśli się zbuduje, będzie działać. Jeśli nie, to oczywiście nie będzie. Zwiększenie
odsetka
... wydawałoby się o wiele bardziej wartościowe niż zwykłe maksymalizowanie liczby kompilatorów, które mogą obsłużyć niewielką część programów, które nie skorzystałyby z funkcji i gwarancji wykraczających poza to, czego wymaga Standard.
supercat 21.04.16
4

O ile mogę stwierdzić na podstawie dokumentów komitetu publicznego (w szczególności N1395 ), jednym z głównych powodów, dla których VLA (wraz ze złożoną arytmetyką i wątkami) była opcjonalna, było umożliwienie tworzenia zgodnych kompilatorów C dla małych osadzonych procesorów.

Trend polegał na tym, że dostawcy kompilatorów, którzy celują w systemy wbudowane, utrzymywali standard C90, z powodu wprowadzenia tych dużych funkcji, o które ich klienci nie prosili.

Bart van Ingen Schenau
źródło
W wielu przypadkach „prosili o pominięcie”. Gdy spojrzysz na zmianę pamięci RAM po włączeniu tych funkcji, staje się oczywiste, dlaczego niektórzy ludzie ich nie chcą. Może podwoić koszt procesora, który może być najdroższą częścią systemu.
od
1
@JerryCoffin: Tak, ale kod jest generowany tylko wtedy, gdy sizeof () jest rzeczywiście używany w tablicy. Kompilator musi śledzić informacje, aby mógł wygenerować prawidłowy kod, ale informacje te nie muszą być osadzone w reprezentacji pamięci VLA w pamięci.
jxh
2
@jxh: Jak pierwotnie przewidywano, implementacje wolnostojące i hostowane korzystały z tego samego języka podstawowego. Różnice ograniczono do biblioteki. W przypadku VLA istnieje różnica w samym języku, która (przynajmniej niektórzy dostawcy uważali) nie była tak naprawdę odpowiednia dla mniejszych systemów wbudowanych. Jeśli chodzi o osadzanie rozmiaru: nie, prawdopodobnie nigdy nie jest to absolutnie konieczne, ale może być najłatwiejszym sposobem (np. Kilka bajtów pamięci dla rozmiaru może uniknąć wielu bajtów kodu do jego obliczenia).
Jerry Coffin
1
@ superupat: Widzę logikę funkcji pobierania biblioteki C w wersji Cherry, ale ustawienie opcji języka na „opcjonalne” wydaje się zdecydowanie nieprzydatne dla kogoś, kto próbuje napisać wieloplatformowy kod C. Jest stosowany jako że C był oczywistym wyborem dla blisko metalowych systemów programowania, który może łatwo być nakierowany na inny kompilator i innej platformie sprzętowej. To nie jest takie oczywiste.
jxh 21.04.16
1
@supercat: Bombardowanie stosu nie jest unikalne dla VLA. Nieprawidłowo duże obiekty automatyczne lub nieograniczony stos wywołań funkcji będą miały podobne problemy. Jeśli standard określa sposób wykrywania awarii w tych przypadkach, prawdopodobnie działałby również dla VLA. Opcjonalnie utrudnia to argumentowanie za użyciem nowych funkcji C w nowym kodzie C w nowych projektach, które muszą działać na wielu platformach przy użyciu kompilatorów od wielu dostawców.
jxh 21.04.16