Чому масиви змінної довжини стали необов’язковими в C 2011?


12

Коли в 1999 році були представлені VLAs, я подумав, що мова є чудовою інновацією для мови. Однак, дізнавшись, що це стало необов’язковим у C 2011 році, мені цікаво, що призвело до зміни його статусу, і якщо це означає, що ця функція насправді спрямовується на застарілість. Якщо так, чи існує еквівалентне поняття автоматичного управління даними динамічного розміру, які розглядаються як заміщення?

Я намагався знайти документ обгрунтування C 2011, але він, здається, ще не опублікований.


Відсутність усиновлення?
Райан Райх

@RyanReich: Напевно, але навіщо опір постачальників?
jxh

Відповіді:


8

Я чув легенди, що відрізняються від "це повинно бути необов'язковим, оскільки деякі невеликі компілятори повинні бути здатними бути сумісними з C11 без VLAs" до "це була помилка в першу чергу". Я ніколи не отримав жодної правдивої і певної відповіді на це. Зрештою, я не вірю, що хтось насправді має таке, оскільки причина (припускаючи - і сподіваюсь, що є така) ніколи не розголошувалася (наскільки мої старі пошуки йшли).


З глави 4 (стор. 13) Обгрунтування міжнародних стандартів - Мови програмування - C 5.10 (2003)

Визначаючи відповідні реалізації з точки зору програм, які вони приймають, Стандарт залишає відкритими двері для широкого класу розширень як частини відповідної реалізації. Визначаючи як відповідні розміщені, так і відповідні самостійно реалізовані реалізації, Стандарт визнає використання C для запису таких програм, як операційні системи та додатки на основі ROM, а також більш звичайні розміщені програми. Поза цією дворівневою схемою додаткового підмножини для C не визначено, оскільки Комітет C89 сильно вважає, що занадто багато рівнів знижує ефективність стандарту .

Наголос мій. Зауважте, що це рішення суперечить їх власному обґрунтуванню. Тим не менш, інша річ стала необов’язковою. Тепер ви отримуєте __STDC_NO_VLA__або підтримку VLA. Це дуже дивне рішення.


@jxh Навіть цього не бачив. Дякую, що вказали на це, воно було змінено на більш чітке та менш неоднозначне формулювання. Я бачив мотив як синонім мотиву та мети в деяких контекстах, але я вважаю, що він часто зустрічається лише в мистецьких сценаріях.
Бернардо Сульцбах

Проблема наявності лише дворівневої схеми полягає в тому, що існує безліч корисних функцій і гарантій, які широко, але не зовсім універсально підтримуються, і які можуть дозволяти писати деякі програми набагато ефективніше, ніж інакше було б можливо. Відсутність будь-яких стандартних засобів тестування на наявність таких функцій обумовлює необхідність значної частки, якщо не більшості практичних програм у багатьох галузях, використовувати гарантії, що виходять за рамки тих, що включені до Стандарту, і ускладнює визначення певність, чи є якась конкретна ...
supercat

... програма буде працювати з будь-якою конкретною реалізацією. Визначення більшого різноманіття додаткових функцій та гарантій, які реалізації можуть або підтримувати, або відмовляти (відхиляючи компіляцію), дозволило б мати простий легкий стандартний спосіб тестування, чи буде програма, яка правильно визначає її вимоги, правильно працювати на платформі: спробуйте будувати його. Якщо він будує, він буде працювати. Якщо ні, то, очевидно, не буде. Збільшення частки програм, для яких можна було б гарантувати, що успішна збірка гарантувала б успішну роботу ...
supercat

... здавалося б набагато більш цінним, ніж просто максимізувати кількість компіляторів, які можуть обробляти крихітну частину програм, які не отримають користі від функцій та гарантій, ніж те, що вимагає Стандарт.
supercat

4

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

Тенденція полягала в тому, що постачальники компіляторів, які орієнтувались на вбудовані системи, залишалися за стандартом C90 через введення тих великих функцій, про які їх клієнти не просили.


У багатьох випадках "просили, щоб вони залишилися поза межами". Коли ви дивитесь на зміну сліду оперативної пам’яті, коли ви включаєте ці функції, стає очевидним, чому деякі люди не хочуть їх. Це може подвоїти вартість процесора, який може бути найдорожчою частиною системи.
Ⴖ в

1
@JerryCoffin: Так, але код генерується лише тоді, коли sizeof () фактично використовується в масиві. Компілятору потрібно відслідковувати інформацію, щоб вона могла генерувати правильний код, але цю інформацію не потрібно вбудовувати в представлення пам'яті VLA.
jxh

2
@jxh: Як спочатку передбачалося, автономні та розміщені реалізації використовували ту саму основну мову. Відмінності були обмежені лише бібліотекою. У випадку з VLAs є різниця в самій мові, що (принаймні, деякі постачальники відчували) насправді не підходить для менших вбудованих систем. Що стосується вбудовування розміру: ні, це, мабуть, ніколи не є абсолютно необхідним, але це може бути найпростіший спосіб (наприклад, кілька байтів зберігання для розміру можуть уникнути багатьох байтів коду для його обчислення).
Джері Коффін

1
@supercat: Я можу побачити логіку функціонування бібліотеки C вибору вишні, але зробити мовні функції "необов'язковими" для когось, хто намагається написати мультиплатформенний код C, здається непосильним. Він використовується , щоб бути , що C був очевидним вибором для близьких до металевих систем програмування , які можуть бути легко перенацеливаться на інший компілятор і інший апаратній платформі. Зараз це не так очевидно.
jxh

1
@supercat: Бомбардування стека не властиве VLA. Аномально великі автоматичні об'єкти або стек виклику нестримних функцій матимуть подібні проблеми. Якщо стандарт визначає засоби для виявлення несправностей для цих випадків, це, ймовірно, спрацює і для VLA. Що стосується необов'язкового, це просто ускладнює сперечатися щодо використання нових функцій C у новому коді C у нових проектах, які необхідні для роботи на декількох платформах, використовуючи компілятори від декількох постачальників.
jxh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.