"Если, например, все имена хранить в глобальном контексте, то мы не можем позволить себе рекурсию.
Если полностью изолировать глобальный контекст и контекст функции, т.е. в функции искать переменные только локально, — создаём кучу неудобств.
Если разрешаем видеть глобальные переменные из функции, то
— приходится изобретать способы различения — где имя глобальное, а где локальное (по-яваскриптовски, var локальное, иначе глобальное; или по-питоньи, global глобальное, есть присваивание — локальное, иначе хитровывернутый поиск)
— приходится изобретать правила для вложенных функций, вложенных блоков, замыканий, циклов и т.д."
Области видимости
Сообщений 1 страница 6 из 6
Поделиться12017-10-27 17:09:52
Поделиться22017-10-27 20:46:13
то мы не можем позволить себе рекурсию.
Можем (но не всю). Scheme умеет автоматически преобразовывать хвостовую рекурсию в цикл. Преобразования остальных рекурсий в цикл не известны. Но доказательств отсутствия такого преобразования не существует.
создаём кучу неудобств.
Которые почему то не указаны. Вообще то там одни плюсы.
приходится изобретать правила для вложенных функций, вложенных блоков, замыканий, циклов и т.д."
Обходите дерево и все проблемы становятся понятными и решаемыми. И еще плюс - если вызов функций представлять как дерево, упрощается реализация параллельного исполнения (каждая ветвь работает независимо друг от друга). И в таком случае невидимость глобальных переменных огромный жирный плюс.
Отредактировано utkin (2017-10-27 20:54:25)
Поделиться32017-10-27 22:02:19
Scheme умеет автоматически преобразовывать хвостовую рекурсию в цикл. Преобразования остальных рекурсий в цикл не известны. Преобразования остальных рекурсий в цикл не известны.
Разница лишь в необходимости тянуть данные.
Поделиться42026-08-26 12:04:58
Если области видимости не реализовывать, то ...
Ошибки: исчезает класс ошибок "переменная не объявлена в этой области (но объявлена в другой)".
Есть только "имя не найдено" и "имя уже используется".
В компиляторе не нужно хранить вложенные таблицы символов.
Достаточно одной глобальной хеш-таблицы "имя → описание" (ну или индекса на основе дерева).
Разрешение имен - при встрече идентификатора всегда одно место для поиска. Нет рекурсивного обхода цепочек областей.
Генерация кода - адрес переменной можно вычислить один раз при объявлении и сохранить.
Не нужно вычислять смещение относительно текущего фрейма на лету.
Cуществуют языки без функций (там функции это другое).
Нет функций, значит не нужны видимость в пределах функции и стек.
Поделиться52026-08-27 06:54:56
Есть только "имя не найдено" и "имя уже используется".
Сразу вспомнился РЯП,
в котором переменные вообще не объявляются,
так как существует только один единственный вид переменных "число с плавающей запятой"
(это же и целое число).
Cуществуют языки без функций (там функции это другое).
РЯП сейчас без функций и без процедур.
— приходится изобретать способы различения — где имя глобальное, а где локальное
Компилятор или интерпретатор сам должен понимать где что, исходя из самого кода.
Можно реализовать функцию автоматической доработки кода самим интерпретатором.
То есть человек быстро пишет код и
интерпретатор в окне кода его перелопачивает и
говорит "Я интеллектуальный интерпретатор (ИИ), я так вижу!"
И человек говорит "Это именно то, что я и хотел написать!"
Поделиться62026-08-27 09:46:41
РЯП, в котором переменные вообще не объявляются