Вот другой вопрос по этому вопросу, который мы можем получить, сделав шаг назад и рассмотрев роль обзора в более широких рамках интерпретации (запуск программы). Другими словами, представьте, что вы строили интерпретатор (или компилятор) для языка и отвечали за вычисление вывода, учитывая программу и некоторый ввод в нее.
Интерпретация включает в себя отслеживание трех вещей:
1) Состояние, а именно, переменные и ссылочные ячейки памяти в куче и стеке.
2) Операции над этим состоянием - а именно, каждая строка кода в вашей программе
3) Окружающая среда, в которой выполняется данная операция, а именно проекция состояния на операцию.
Интерпретатор запускается в первой строке кода в программе, вычисляет его среду, запускает строку в этой среде и фиксирует ее влияние на состояние программы. Затем он следует за потоком управления программой для выполнения следующей строки кода и повторяет процесс до завершения программы.
Способ вычисления среды для любой операции осуществляется через формальный набор правил, определяемых язык программирования. Термин «привязка» часто используется для описания отображения общего состояния программы на значение в среде. Обратите внимание, что под «общим состоянием» мы не имеем в виду глобальное состояние, а скорее сумму всех достижимых определений в любой момент выполнения)
. Это структура, в которой определена задача определения области видимости. Теперь к следующей части наших опций.
Это суть динамического охвата, в котором среда, в которой работает любой код, связана с состоянием программы, как определено ее выполнением context.
Другими словами, с помощью Lexical Scope среда, которую видит любой код, привязана к состоянию, связанной с областью, определенной явно на языке, например блоком или функция.