Статьи

Переменные языка программирования: область действия и степень

Этот пост рассматривает два аспектов , как переменные работают языки программирования: The Scope и экстенты переменных. Пример исходного кода приведен на JavaScript, но должен быть достаточно простым, чтобы быть универсально понятным.

Статический против динамического

Прежде чем мы сможем начать наше исследование, нам нужно установить, как можно наблюдать за работой переменных. Ниже приведены два способа просмотра программного кода.

  • Статически, каждый проверяет программу, как она существует в исходном коде, без ее запуска. Учитывая следующий код, мы можем сделать статическое утверждение, что функция g вложена в функцию f.
        function f() {
            function g() {
                
            }
        }
    

    Прилагательное лексическое используется как синоним статического, так как оба относятся к лексикону (словам, источнику) программы.

  • Динамически проверяется, что происходит во время выполнения программы («во время выполнения»). Учитывая следующий код, f и g имеют динамическое отношение, потому что f вызывает g.
        function g() {
        }
        function f() {
            g();
        }
    

Переменные привязки и их объем и степень

Заявление

    var x = ...;

устанавливает
привязку для переменной x, которая отображает имя переменной на значение. Далее термины «переменная» и «связывание» часто используются взаимозаменяемо. Это менее точно, но делает объяснения короче. Привязки характеризуются:

  • Область (пространственное свойство): Где можно получить доступ к привязке?
  • Степень (временное свойство): как долго существует привязка?

Существует несколько вариантов реализации области действия и степени в языке программирования.

Область действия . Прямой областью действия переменной является синтаксическая конструкция, в которой была создана привязка. То, что создает формы областей, зависит от языка программирования: любой тип блоков в большинстве языков, только функции в JavaScript. У одного есть два варианта определения того, где еще доступна переменная, в дополнение к прямой области:

  • Статическая (лексическая) область видимости: переменная доступна из прямой области видимости, и все области видимости вложены в нее. В следующем примере x виден в прямой области видимости функции f, а также во вложенной области видимости функции g.
        function f() {
            var x;
            function g(y) {
                return x + y;
            }
        }
    
  • Динамическая область видимости. В динамической области видимости переменная, объявленная в функции, доступна во всех вызываемых функциях. Пример ниже иллюстрирует динамическую область видимости. Если вызывается f, что, в свою очередь, вызывает g, то myvar в (*) ссылается на привязку в f.
        function g() {
            var x = myvar + 1; // (*)
        }
        function f() {
            var myvar = 123;
            g();
        }
    

Большинство современных языков программирования используют статическую область видимости. Некоторые, такие как Common Lisp, дополнительно поддерживают динамическую область видимости (для динамически инкапсулированных «глобальных» переменных). Два эффекта влияют на область видимости:

  • Области могут быть вложенными. Прямой объем можно рассматривать как вложение всех других областей, где доступна переменная. В этом случае вложенные области называются внутренними областями , прямая область называется внешней областью . В статической области вложенности происходит путем вложения синтаксических конструкций. В динамическом определении вложенности происходит путем рекурсивного вызова функций.
  • Переменные могут быть скрыты. Если внутренняя область объявляет переменную с тем же именем, что и переменная во внешней области, внешняя переменная затеняется внутренней: к ней нельзя получить доступ во внутренней области (или во вложенных в нее областях), поскольку упоминания о ней относятся к внутренней привязке. В следующем примере объявление в g затеняет объявление в f. Таким образом, x имеет значение «bar» в g и в h.
        function f() {
            var x = "foo";
            function g() {
                var x = "bar";
                function h() {
                }
            }
        }
    

Степень: наиболее распространенные виды степени

  • Динамический экстент: переменная существует, начиная с ее объявления, пока ее существование явно не закончится. Обычно это означает, что прямая область объявления завершила вычисления. Для обработки вложенных областей динамический экстент часто управляется с помощью стека привязок. Динамическая степень распространена в более простых языках программирования. JavaScript, однако, может сделать больше. Читать дальше.
  • Неопределенный экстент: в JavaScript экстент переменной начинается с ее объявления. Его привязка существует до тех пор, пока существует код, который ссылается на него. Таким образом, если функция покидает свою статическую область, она сохраняет переменные во внешних областях, если ссылается на них. В следующем примере функция g поддерживает работу x, поскольку она покидает статическую область видимости (функция f). Позже, когда больше нет ссылок на g (например, myfunc), и g, и привязка для x могут быть собраны сборщиком мусора.
        function f(x) {
            function g() {
                return x;
            }
            return g;
        }
        var myfunc = f("hello");
        console.log(myfunc()); // output: hello
    

Обратите внимание, что в литературе существует много разных определений «степени». Мы рассмотрели только один из них [1].

Связанное чтение

  1. Сфера охвата и объем (глава 3 в «Common Lisp the Language» Гая Стила). Эта глава является источником части этого поста.

 

С http://www.2ality.com/2011/05/programming-language-variables-scope.html