powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Физический смысл области видимости (scope) в циклах?
18 сообщений из 18, страница 1 из 1
Физический смысл области видимости (scope) в циклах?
    #37961257
Кантачес
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В функциях, методах вроде понятно - после компилирования это разные куски кода. В циклах - не пойму. Вроде визуально один кусок кода, а объявление в цикле все же "перекрывает" объявление с тем же именем вне цикла.
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37961323
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заводишь переменную в цикле "для внутреннего употребления" и не паришься, есть такое имя где-то снаружи или нет...
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37961560
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КантачесВ функциях, методах вроде понятно - после компилирования это разные куски кода. В циклах - не пойму. Вроде визуально один кусок кода, а объявление в цикле все же "перекрывает" объявление с тем же именем вне цикла.Обратите внимание, что локальные переменные перекрывают видимые глобальные, хотя "физически" глобальная переменная в месте использования локальной, разумеется, доступна. Здесь схожий механизм, который можно обобщённо назвать "частное имеет приоритет над общим": в случае "конфликта" имён его надо или как-то разрешать, или выдавать сообщение об ошибке.
В реальности, при анализе каждого блока компилятор держит "в уме" цепочку блоков, в которые этот блок вложен и, встретив идентификатор, просто идёт по цепочке вверх, пока не найдёт его (первое) объявление, после чего поиск прекращается. То есть, конфликт имён даже не регистрируется.
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37961846
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> В функциях, методах вроде понятно - после компилирования это разные куски кода.
> В циклах - не пойму. Вроде визуально один кусок кода, а объявление в цикле все
> же "перекрывает" объявление с тем же именем вне цикла.

Я хочу добавить, что scoped variables появились в языке программирования Алгол,
примерно в конце 60-х годов. С тех пор это считается благом для языка и все
языки программирования стараются это свойство реализовать. Даже старые языки,
в которых таких свойств не было, их приобретают.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37962498
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КантачесВ функциях, методах вроде понятно - после компилирования это разные куски кода.
Не факт. Функции, например, бывают встраиваемые.

Кантачес В циклах - не пойму.
Если на то пошло, с чего Вы взяли, что у этого должен быть какой-то "физический" смысл? Это просто удобно.. во всяком случае, в Алголе решили, что это удобно.

Кантачес Вроде визуально один кусок кода, а объявление в цикле все же "перекрывает" объявление с тем же именем вне цикла.
Ну "визуально" контора "Рога и Копыта" - одна организация, но для отдела тестирования тестировщик Вася "перекрывает" завхоза Васю, в то время как вся остальная контора при слове "Вася" думает именно о завхозе.
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37962544
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЕсли на то пошло, с чего Вы взяли, что у этого должен быть какой-то "физический" смысл? Это просто удобно.. во всяком случае, в Алголе решили, что это удобно.
Ну, вопрос "физического" смысла действительно странен, смысл скорее "логический". Вопрос при этом разбивается на два: откуда взялась идея перекрытия областей видимости и почему какие-то конструкции языка сделаны задающими свою область видимости.

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

Второй вопрос, как понимаю, скорее исторический - "так сложилось". Удобно выделять в отдельную область видимости конструкции, которые с высокой вероятностью могут оказаться самостоятельными, законченными (условно, подверженными Copy-Paste) фрагментами кода. Удобно выделять те фрагменты, которые легко распознать в фазе анализа (скажем, в C++ пара операторных скобок {} порождает такой блок, а метки в блоке switch - нет; потом это решение "по наследству" переехало в C#, хотя в нём наборы меток порождают логически изолированные части кода). Ну, и дальше в случае каждого конкретного языка нужно смотреть стандарт.
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37962582
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AbstractionВопрос при этом разбивается на два: откуда взялась идея перекрытия областей видимости
Насколько я помню, к ней пришли когда потребовалось реализовать рекурсивные вызовы функций и, соответственно, размещение переменных как глобального блока стало резко неудобным.

AbstractionВторой вопрос, как понимаю, скорее исторический - "так сложилось". Удобно выделять в отдельную область видимости конструкции, которые с высокой вероятностью могут оказаться самостоятельными, законченными (условно, подверженными Copy-Paste) фрагментами кода.
Я бы сказал это несколько по-другому. В шестидесятые годы программисты ещё только начинали путь к привычному нам конструированию кода из огромного количества небольших подпрограмм. В то время подпрограмм было гораздо меньше, а сами они - гораздо длиннее и, соответственно, состоящими из большого количества сравнительно мало связанных фрагментов. Это приводило к необходимости определять переменные непосредственно в месте использования или рядом с ним. И, соответственно, было удобно и разумно "замкнуть" такие вот локальные переменные внутри блока, чтобы избежать конфликтов при модификации кода на сто строк выше или на сто строк ниже (здесь ещё стоит вспомнить, что одним из основных носителей тогда были перфокарты и программа нередко модифицировалась или даже конфигурировалась путём "редактирования колоды", то есть добавления или удаления некоторых карт. Взял колоду, вытащил из центра группу синих перфокарт, заменил группой оранжевых - и программа стала считать интегралы другим методом, более подходящим к текущему набору данных).
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37962767
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я тут OCaml рассматриваю...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
# let a = 5;;
val a : int = 5
# let adda x = x + a;;
val adda : int -> int = <fun>
# let a = 10;;
val a : int = 10
# adda 0;;
- : int = 5
# 
Область видимости это временами такая странная штука :)
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37963649
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

ничего странного, каждый let создает новую область видимость с новыми биндингами, которая идет ниже него. Т.е. кажущаяся линейной последовательность выражений в твоем примере
Код: plaintext
1.
2.
3.
4.
let a = 5;;
let adda x = x + a;;
let a = 10;;
adda 0;;

структурно, в переводе на си-подобный синтаксис, на самом деле выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
{
    int a = 5;
    {
        int adda(int x) { return x + a; }
        {
            int a = 10;
            return adda(0);
        }
    }
}

Изменяемые нужно задавать явно:

http://ideone.com/auFVZ

http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual003.html#toc8
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37968571
Кантачес
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abstraction, не смог так четко сформулировать. В голове вертелись обрывочные сведения об ассемблере: что функции помещаются в стек - отсюда ни ее переменные, ни внешние переменные не "видят" друг друга, если только в функцию не передать нужную внешнюю переменную. Получается причина появления scope - чисто логическая, а не техническая - уровня ассемблера\специфики работы машины тьюринга (не знаю, как будет точнее сказать).
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37968619
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КантачесПолучается причина появления scope - чисто логическая, а не техническая
Однажды, когда мне было четырнадцать лет, в своей первой серьёзной программе я сделал ошибку - забыл описать в функции переменную I в то время как в программе была описана глобальная переменная I. Причём эта глобальная переменная активно использовалась в цикле, внутри которого вызывалась функция, в свою очередь использовавшая I в цикле. Когда я разобрался, почему у меня получаются такие странные результаты, я хорошо ощутил, что scope - очень логичная и правильная вещь, с которой нужно дружить.
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37969028
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Abstraction, не смог так четко сформулировать. В голове вертелись обрывочные
> сведения об ассемблере: что функции помещаются в стек - отсюда ни ее переменные,
> ни внешние переменные не "видят" друг друга, если только в функцию не передать
> нужную внешнюю переменную. Получается причина появления scope - чисто
> логическая, а не техническая - уровня ассемблера\специфики работы машины
> тьюринга (не знаю, как будет точнее сказать).

Это у тебя юношеский экстремизм в голове. Ассемблеров ровно столько разных,
сколько архитектур машин/процессоров. Это только сейчас везде один интел.
А в принципе разные машины работают по-разному, и стек есть далеко не везде.
Точнее его придумали (наверное) в PDP, в IBM-ах его не было -- были связные
списки PROCESS STATUS или что-то в этом роде, уже и не помню.
И даже в рамках одной архитектуры (типа интел) можно использовать и не
использовать стек.

Причина появления области видимости (а точнее блочной видимости переменных)
просто в том, что они удобны, со стеком это никак не связано.
И конечно ни машина фон-Неймана, ни тем более машина Тьюринга тут ни при чём.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37969133
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivв IBM-ах его не было -- были связные
списки PROCESS STATUS или что-то в этом роде, уже и не помню.
RSA (Register Save Area)
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37969191
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> RSA (Register Save Area)
Точно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37969206
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КантачесВ функциях, методах вроде понятно - после компилирования это разные куски кода. В циклах - не пойму. Вроде визуально один кусок кода, а объявление в цикле все же "перекрывает" объявление с тем же именем вне цикла.здесь дело не в циклах как таковых, а в блоках кода.

Физического смысла в области видимости блока кода нет, но зато логический вполне логический ))
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37970266
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нравилось что где-то С# есть такая штука как namespace {}.
ЕМНИП можно в одном исходнике заюзать разные библиотеки
где есть много пересекающихся по именам классов типа *.xml.Document,
*.pdf.Document, e.t.c. и спокойно писать код не ломая себе мозг
и зрение длинными префиксами. Последнее весьма бесит в Java
где либерализм в клепании своих пространств имён и библиотек
достиг того предела когда каждый вася пупкин создаёт свой
длинный доменный префикс. Исходники более чем наполовину
забиты ими.
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37970343
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonгде либерализм в клепании своих пространств имён и библиотек
какой же это либерализм?
это диктатура
...
Рейтинг: 0 / 0
Физический смысл области видимости (scope) в циклах?
    #37970358
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO. Java - позиционируется как среда для всяких блохастых хиппи (шутка)
не признающих железной руки корпораций! Отсюда и моё бухтение. Возможно
я не прав по поводу клепания неймспесов но попробуйте найдите среду где
есть больший либерализьм.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Физический смысл области видимости (scope) в циклах?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]