Почему массивы переменной длины стали необязательными в C 2011?

12

Когда в 1999 году были введены VLA, я подумал, что это отличная инновация для языка. Однако, узнав, что это стало необязательным в C 2011, мне интересно, что привело к его изменению статуса, и означает ли это, что функция фактически устарела. Если да, существует ли эквивалентное понятие автоматического управления данными динамического размера, которое рассматривается для его замены?

Я попытался найти обоснование документа C 2011, но, похоже, он еще не опубликован.

jxh
источник
Отсутствие усыновления?
Райан Райх
@RyanReich: Возможно, но почему сопротивление со стороны продавцов?
jxh

Ответы:

8

Я слышал, что легенды варьируются от «это должно быть необязательным, поскольку некоторые небольшие компиляторы должны быть в состоянии быть совместимыми с C11 без VLA», «чтобы это была ошибка на первом месте». У меня никогда не было ни одного правдивого и однозначного ответа на это. В конечном счете, я не верю, что у кого-то действительно есть такой, потому что причина (если предположить - и надеюсь - она ​​есть) никогда не была раскрыта (насколько мои старые поиски шли).


Из главы 4 (стр. 13) Обоснования международного стандарта - Языки программирования - C 5.10 (2003)

Определяя соответствующие реализации в терминах программ, которые они принимают, Стандарт оставляет дверь для широкого класса расширений как части соответствующей реализации. Определяя как совместные размещенные, так и соответствующие автономные реализации, Стандарт признает использование C для написания таких программ, как операционные системы и приложения на основе ПЗУ, а также более традиционные размещенные приложения. Помимо этой двухуровневой схемы, для С не определено никакого дополнительного поднабора, поскольку Комитет С89 твердо убежден, что слишком большое количество уровней снижает эффективность стандарта .

Акцент мой. Обратите внимание, что это решение противоречит их собственному обоснованию. Еще одна вещь, сделанная необязательной. Теперь вы либо получаете __STDC_NO_VLA__либо VLA поддержку. Это очень странное решение.

Бернардо Зульцбах
источник
@jxh Даже не видел этого. Спасибо за указание на это, оно было изменено на более четкую и менее двусмысленную формулировку. Я видел мотив как синоним мотива и цели в некоторых контекстах, но я считаю, что он встречается только в художественных сценариях.
Бернардо Зульцбах
Проблема с наличием только двухуровневой схемы состоит в том, что существует множество полезных функций и гарантий, которые широко, но не совсем универсально поддерживаются, и которые могут позволить писать некоторые виды программ гораздо более эффективно, чем это было бы возможно в противном случае. Отсутствие каких-либо стандартных средств тестирования на наличие таких функций делает необходимым для значительной части, если не для большинства практических программ во многих областях, использовать гарантии, помимо тех, которые включены в Стандарт, и затрудняет определение с помощью уверен ли какой-то конкретный ...
суперкат
... программа будет работать с любой конкретной реализацией. Определение большего разнообразия дополнительных функций и гарантий, которые реализации могут либо поддерживать, либо отклонять (отклоняя компиляцию), позволило бы иметь хороший простой стандартный способ проверки того, будет ли программа, которая правильно определяет ее требования, работать правильно на платформе: try построить это. Если это построит, это будет работать. Если нет, то, очевидно, не будет. Увеличение доли программ, для которых можно было бы гарантировать, что успешная сборка будет гарантировать успешную работу ...
суперкат
... может показаться гораздо более ценным, чем просто максимизировать количество компиляторов, которые могут обрабатывать крошечную часть программ, которые не получат преимущества от функций и гарантий, выходящих за рамки требований Стандарта.
суперкат
4

Насколько я могу судить по документам общественного комитета (в частности, N1395 ), одной из основных причин, по которой VLA (наряду со сложной арифметикой и многопоточностью) необязательно, было создание возможности создания соответствующих компиляторов Си для небольших встроенных процессоров.

Тенденция заключалась в том, что производители компиляторов, ориентированные на встраиваемые системы, придерживались стандарта C90 из-за введения тех крупных функций, о которых их клиенты не просили.

Барт ван Инген Шенау
источник
Во многих случаях «просили обойтись». Если вы посмотрите на изменение объема ОЗУ при включении этих функций, станет понятно, почему некоторые люди не хотят их использовать. Это может удвоить стоимость процессора, который может стать самой дорогой частью системы.
ღ uі
1
@JerryCoffin: Да, но код генерируется только тогда, когда sizeof () фактически используется в массиве. Компилятор должен отслеживать информацию, чтобы он мог генерировать правильный код, но эта информация не должна быть встроена в представление VLA в памяти.
jxh
2
@jxh: как первоначально предполагалось, автономные и размещенные реализации использовали один и тот же основной язык. Различия были ограничены библиотекой. В случае VLA существует разница в самом языке, которая (по крайней мере, некоторые поставщики считали) не совсем подходит для небольших встроенных систем. Что касается встраивания размера: нет, это, вероятно, никогда не является абсолютно необходимым, но может быть самым простым способом (например, несколько байт памяти для размера могут избежать многих байтов кода для его вычисления).
Джерри Коффин
1
@supercat: Я вижу логику выбора функций библиотеки C, но сделать языковые функции «необязательными» кажется абсолютно бесполезным для тех, кто пытается написать многоплатформенный код C. Он используется , чтобы быть , что C был очевидным выбором для близких к металлическим системам программирования , которые могут быть легко перенацеливаться на другой компилятор и другой аппаратной платформе. Теперь это не так очевидно.
JXH
1
@supercat: бомбардировка стека не является уникальной для VLA. У аномально больших автоматических объектов или безудержного стека вызовов функций будут аналогичные проблемы. Если в стандарте определены средства для обнаружения отказа в этих случаях, он, вероятно, будет работать и для VLA. С точки зрения необязательности, это только затрудняет использование новых функций C в новом коде C в новых проектах, которые требуются для работы на нескольких платформах с использованием компиляторов от разных поставщиков.
JXH