Нужен автокод - иностранцам вежливо настраивать язык кириллический

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Области видимости

Сообщений 1 страница 6 из 6

1

"Если, например, все имена хранить в глобальном контексте, то мы не можем позволить себе рекурсию.
Если полностью изолировать глобальный контекст и контекст функции, т.е. в функции искать переменные только локально, — создаём кучу неудобств.
Если разрешаем видеть глобальные переменные из функции, то
— приходится изобретать способы различения — где имя глобальное, а где локальное (по-яваскриптовски, var локальное, иначе глобальное; или по-питоньи, global глобальное, есть присваивание — локальное, иначе хитровывернутый поиск)
— приходится изобретать правила для вложенных функций, вложенных блоков, замыканий, циклов и т.д."

0

2

то мы не можем позволить себе рекурсию.

Можем (но не всю). Scheme умеет автоматически преобразовывать хвостовую рекурсию в цикл. Преобразования остальных рекурсий в цикл не известны. Но доказательств отсутствия такого преобразования не существует.

создаём кучу неудобств.

Которые почему то не указаны. Вообще то там одни плюсы.

приходится изобретать правила для вложенных функций, вложенных блоков, замыканий, циклов и т.д."

Обходите дерево и все проблемы становятся понятными и решаемыми. И еще плюс - если вызов функций представлять как дерево, упрощается реализация параллельного исполнения (каждая ветвь работает независимо друг от друга). И в таком случае невидимость глобальных переменных огромный жирный плюс.

Отредактировано utkin (2017-10-27 20:54:25)

0

3

utkin написал(а):

Scheme умеет автоматически преобразовывать хвостовую рекурсию в цикл. Преобразования остальных рекурсий в цикл не известны. Преобразования остальных рекурсий в цикл не известны.

Разница лишь в необходимости тянуть данные.

0

4

Если области видимости не реализовывать, то ...

Ошибки: исчезает класс ошибок "переменная не объявлена в этой области (но объявлена в другой)".
Есть только "имя не найдено" и "имя уже используется".

В компиляторе не нужно хранить вложенные таблицы символов.
Достаточно одной глобальной хеш-таблицы "имя → описание" (ну или индекса на основе дерева).

Разрешение имен - при встрече идентификатора всегда одно место для поиска. Нет рекурсивного обхода цепочек областей.

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

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

0

5

Лис написал(а):

Есть только "имя не найдено" и "имя уже используется".

Сразу вспомнился РЯП,
в котором переменные вообще не объявляются,
так как существует только один единственный вид переменных "число с плавающей запятой"
(это же и целое число).

Лис написал(а):

Cуществуют языки без функций (там функции это другое).

РЯП сейчас без функций и без процедур.

ВежливыйЛис написал(а):

— приходится изобретать способы различения — где имя глобальное, а где локальное

Компилятор или интерпретатор сам должен понимать где что, исходя из самого кода.
Можно реализовать функцию автоматической доработки кода самим интерпретатором.
То есть человек быстро пишет код и
интерпретатор в окне кода его перелопачивает и
говорит "Я интеллектуальный интерпретатор (ИИ), я так вижу!"
И человек говорит "Это именно то, что я и хотел написать!"

0

6

NuShaman написал(а):

РЯП, в котором переменные вообще не объявляются

Язык без типов

0