Исправление firkax, (текущая версия) :
При том что блок это новый фрейм
Нет. Это только в учебных теориях так.
Переменные из блока существуют только внутри блока.
Переменная из объявления в середине блока существует только в хвосте блока, а не во всём. Соответственно
вставить машкод для резервирования
(только не фрейма, а места для переменной) компилятор может прямо туда где она объявлена. Если мы хотим всё оптимизировать - то конечно придётся делать не то что два прохода, а вообще долго лазить по всему коду в произвольном порядке после предварительного составления графа исполнения, но это другая тема.
Это вообще не работает
Что за несёшь? Зачем сломанный код мне пихаешь? При обнаружении объявления - ставим скобку и увеличиваем счётчик. При обнаружении конца блока - ставим все накопленные закрывающие.
#include <stdio.h>
int main () {
int x = 1;
printf("%d\n", x);
{ int y = 2;
printf("%d\n", y); }
}
(и кстати, такой код с явно указанными скобками хоть и некрасивый, но всё же приятнее, чем если бы int y было просто в середине алгоритма).
Хуже того (для твоей ложной теории), компиляторы всегда поддерживали код вида
int x = 10;
int a = f(x);
int b;
Где по факту кодогенерация начиналась до того, как компилятор просмотрит все объявления. И даже доп. фигурные скобки никто не требовал. Так что ограничение это - чисто декоративное, и именно для того, чтобы соблюсти чистоту кода. К слову, я такими объявлениями, как приведены выше, никогда не пользуюсь. Ведь код, кроме компилятора, читаю я сам, и такую кашу читать неудобно.
Исправление firkax, :
При том что блок это новый фрейм
Нет. Это только в учебных теориях так.
Переменные из блока существуют только внутри блока.
Переменная из объявления в середине блока существует только в хвосте блока, а не во всём. Соответственно
вставить машкод для резервирования
(только не фрейма, а места для переменной) компилятор может прямо туда где она объявлена. Если мы хотим всё оптимизировать - то конечно придётся делать не то что два прохода, а вообще долго лазить по всему коду в произвольном порядке после предварительного составления графа исполнения, но это другая тема.
Это вообще не работает
Что за несёшь? Зачем сломанный код мне пихаешь? При обнаружении объявления - ставим скобку и увеличиваем счётчик. При обнаружении конца блока - ставим все накопленные закрывающие.
#include <stdio.h>
int main () {
int x = 1;
printf("%d\n", x);
{ int y = 2;
printf("%d\n", y); }
}
Хуже того (для твоей ложной теории), компиляторы всегда поддерживали код вида
int x = 10;
int a = f(x);
int b;
Где по факту кодогенерация начиналась до того, как компилятор просмотрит все объявления. И даже доп. фигурные скобки никто не требовал. Так что ограничение это - чисто декоративное, и именно для того, чтобы соблюсти чистоту кода. К слову, я такими объявлениями, как приведены выше, никогда не пользуюсь. Ведь код, кроме компилятора, читаю я сам, и такую кашу читать неудобно.
Исходная версия firkax, :
При том что блок это новый фрейм
Нет. Это только в учебных теориях так.
Переменные из блока существуют только внутри блока.
Переменная из объявления в середине блока существует только в хвосте блока, а не во всём. Соответственно
вставить машкод для резервирования
(только не фрейма, а места для переменной) компилятор может прямо туда где она объявлена.
Это вообще не работает
Что за несёшь? Зачем сломанный код мне пихаешь? При обнаружении объявления - ставим скобку и увеличиваем счётчик. При обнаружении конца блока - ставим все накопленные закрывающие.
#include <stdio.h>
int main () {
int x = 1;
printf("%d\n", x);
{ int y = 2;
printf("%d\n", y); }
}
Хуже того (для твоей ложной теории), компиляторы всегда поддерживали код вида
int x = 10;
int a = f(x);
int b;
Где по факту кодогенерация начиналась до того, как компилятор просмотрит все объявления. И даже доп. фигурные скобки никто не требовал. Так что ограничение это - чисто декоративное, и именно для того, чтобы соблюсти чистоту кода. К слову, я такими объявлениями, как приведены выше, никогда не пользуюсь. Ведь код, кроме компилятора, читаю я сам, и такую кашу читать неудобно.