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

Я пережил немного истории C, и я обнаружил, что в более ранних версиях C, как и в стандарте C89, обязательно объявлять переменные в начале блока.

Но я также обнаружил, что есть некоторые релаксации от стандартной спецификации C99, где переменная может быть объявлена ​​где угодно до ее использования.

Мой вопрос: почему более ранние версии сделали это обязательным? мой упор делается на то, чтобы знать, были ли какие-либо технические трудности при разработке компилятора в те дни, что помешало им идентифицировать объявления в любой момент.

Кроме того, с точки зрения дизайна компилятора я понимаю, что с таким ограничением на C89 легко обрабатывать объявления переменных и использование с помощью промежуточного файла для хранения отображений. Но существуют ли методы, которые могут обрабатывать случай, не используя файл-посредник, скажем, какое-то хранилище на основе памяти?.

Ответы

Ответ 1

Если компилятор видит сводный список всех локальных/автоматических переменных спереди, он может сразу же выработать общую сумму, с помощью которой можно переместить указатель стека для резервной стековой памяти для них - всего одну операцию над указателем стека. Если он обрабатывает переменные в dribs и drabs, как они встречаются в функции, перемещая указатель стека инкрементально, тогда в итоге появляется больше опкодов, предназначенных для обновлений стека и обновлений указателя стека. Важно, чтобы указатель стека обновлялся всякий раз, когда выполнялся другой вызов функции. Более новые компиляторы выполняют крошечный бит дополнительной работы для исправления ошибки в количестве, с помощью которого можно перемещать указатель стека после того, как будет рассмотрена вся функция. (Я бы поставил под угрозу, что минимальные усилия, которые ранний Стандарт был сформирован в большей степени за счет концептуальной привлекательности знания того, что делать впереди, а не для того, чтобы быть более гибким, но если вы просто хотите получить что-то полезное - зачем прикладывать дополнительные усилия?)

Ответ 2

C99 Обоснование напрямую не объясняет, почему это не было разрешено в C89, но, по его словам, было добавлено в C99, потому что оно было разрешено на других языках, и оно было признано полезным.

Обоснование для международного стандарта - Языки программирования - C

§6.2.4 Длительность хранения объектов

Новая функция C99: C89 требует, чтобы все объявления в блоке возникали перед любыми утверждениями. С другой стороны, многие языки, подобные C (такие как Algol 68 и С++), позволяют произвольно смешивать декларации и утверждения. Эта функция оказалась полезной и была добавлена ​​на C99.