LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Никогда не понимал эту тягу к бизонам. Его в нормальных местах и так и так для парсинга исходников не используют.

А при чём тут использование функции до объявления? В Си, в начале его существования, это было нормой, но потом поняли что это плохая идея и надо хотя прототип писать заранее. В Паскале сразу используется второй вариант, без прототипа нельзя. Парсинг и компиляция и там и там могут быть сделаны однопроходными, отличие Си такое: его авторы посчитали допустимым при обнаружении неизвестной функции, во-первых, эту функцию вписывать в таблицу идентификаторов как функцию, во-вторых дефолтить её тип в int и передавать аргументы неким самым простым способом в надежде что окажется так и надо. Итог этих угадываний оказался плохим - провоцирование багов в программах, теперь все компиляторы пишут на такое варнинг, хоть и вынуждены поддерживать для совместимости с древним кодом. В Паскале сразу решили что не надо. Можно было бы сделать два прохода чтобы находить прототип со всеми типами даже если он ниже чем использование, но в целом этот вариант не посчитали удобным. Обращу внимание, всё вышеописанное с парсером не связано. Сам по себе вызов функции парсится одинаково вне зависимости от того, известна ли она к этому моменту или нет, в обоих языках.

Ещё можно привести в пример пхп: до какой-то версии там был однопроходный компилятор без построения синтаксического дерева. Функции, объявленные где-то внизу, вызывать можно, безо всяких проблем. Отличие от Си/Паскаля в том что пхп это скрипты, соглашений о передаче аргументов там не требуется, угадывать ничего не надо, соответственно при обнаружении вызова функции он просто компилируется в соответствующий байт-код с указанием её имени, а объявлена она или нет - важно только когда до этого места дойдёт уже выполнение кода.

Исходная версия firkax, :

Никогда не понимал эту тягу к бизонам. Его в нормальных местах и так и так для парсинга исходников не используют.

А при чём тут использование функции до объявления? В Си, в начале его существования, это было нормой, но потом поняли что это плохая идея и надо хотя прототип писать заранее. В Паскале сразу используется второй вариант, без прототипа нельзя. Парсинг и компиляция и там и там могут быть сделаны однопроходными, отличие Си такое: его авторы посчитали допустимым при обнаружении неизвестной функции, во-первых, эту функцию вписывать в таблицу идентификаторов как функцию, во-вторых дефолтить её тип в int и передавать аргументы неким самым простым способом в надежде что окажется так и надо. Итог этих угадываний оказался плохим - провоцирование багов в программах, теперь все компиляторы пишут на такое варнинг, хоть и вынуждены поддерживать для совместимости с древним кодом. В Паскале сразу решили что не надо. Можно было бы сделать два прохода чтобы находить прототип со всеми типами даже если он ниже чем использование, но в целом этот вариант не посчитали удобным. Обращу внимание, всё вышеописанное с парсером не связано. Сам по себе вызов функции парсится одинаково вне зависимости от того, известна ли она к этому моменту или нет, в обоих языках.