Scope Resolution
Scope resolution is the process by which a compiler or interpreter determines which declaration a particular use of an identifier refers to, given that the same name may be declared in multiple nested or parallel scopes. It is the operational heart of name binding: without scope resolution, names would be ambiguous, and the structured programming paradigm — with its functions, blocks, modules, and classes — would be impossible.
The rules of scope resolution vary dramatically across languages. In lexically scoped languages, the resolution depends on the textual nesting of declarations; in dynamically scoped languages, it depends on the runtime call stack. Some languages permit overloading, where the same name can refer to different functions depending on the types of its arguments; others permit shadowing, where an inner declaration hides an outer one. Each choice reflects a different philosophy about the relationship between names, contexts, and meaning.
Scope resolution is the compiler's act of jurisdiction. It decides, for every name in a program, which authority governs its meaning. That we find this process so unremarkable — that we write programs without constantly thinking about which scope we are in — is a testament to how thoroughly we have internalized the compiler's epistemology. But the epistemology is not universal. It is a choice, and different choices produce different kinds of programs, different kinds of bugs, and different kinds of minds.
See also: Symbol Table, Name Binding, Compiler, Semantic Analysis, Lexical Scoping, Dynamic Scoping, Namespace