|
In computer programming, scope is an enclosing context where values and expressions are associated. Various programming languages have various types of scopes. The type of scope determines what kind of entities it can contain and how it affects them -- or semantics. Scopes can: Computer programming (often shortened to programming or coding) is the process of writing, testing, and maintaining the source code of computer programs. ...
In theoretical computer science formal semantics is the field concerned with the rigorous mathematical study of the meaning of programming languages and models of computation. ...
A namespace is a scope that uses the enclosing nature of the scope to group logically related identifiers under a single identifier. Thus, scopes can affect the name resolution for their contents. Identifiers (IDs) are lexical tokens that name entities. ...
A statement is the minimal unit of structuring in imperative programming languages. ...
An expression in a programming language is a combination of values and functions or procedures, interpreted according to the particular rules of precedence and of association for a particular programming language, which computes and then returns another value. ...
In mathematics, computing, linguistics, and related disciplines, an algorithm is a finite list of well-defined instructions for accomplishing some task that, given an initial state, will terminate in a defined end-state. ...
In many programming languages, a namespace is a context for identifiers. ...
In computer science, name resolution (also called name lookup) is the process of finding the entity that an identifier used in a certain context refers to. ...
Variables are associated with scopes. Different scoping types affect how local variables are bound. This has different consequences depending if the language has static or dynamic scoping. In computer science and mathematics, a variable (IPA pronunciation: ) (sometimes called a pronumeral) is a symbolic representation denoting a quantity or expression. ...
In programming languages, name binding refers to the association of values with identifiers. ...
Programmers often indent scopes in their source code text to improve readability. An indentation can mean two things: To make notches in something or form deep recesses in a coastline for instance. ...
Source code (commonly just source or code) is any series of statements written in some human-readable computer programming language. ...
History
Lexical scoping was first introduced in Lisp 1.5 (via the FUNARG device developed by Steve Russell, working under John McCarthy) and added later into Algol 60 (also by Steve Russell), and has been picked up in other languages since then. Descendants of dynamically scoped languages often adopt lexical scoping. In Lisp, for example, Emacs Lisp uses dynamic scoping, Common Lisp has both dynamic and lexical scoping, and Scheme uses lexical scoping exclusively. The original Lisp used dynamic scoping. In other cases, languages which already had dynamic scoping have added lexical scoping afterwards, such as Perl. C and Pascal have always had lexical scoping, since they are both influenced by the ideas that went into Algol. Steve Russel created the first videogame, Spacewar at the Tech Model Railroad Club at the MIT. Categories: Substubs ...
John McCarthy (born September 4, 1927, in Boston, Massachusetts, sometimes known affectionately as Uncle John McCarthy), is a prominent computer scientist who received the Turing Award in 1971 for his major contributions to the field of Artificial Intelligence. ...
ALGOL (short for ALGOrithmic Language) is a programming language originally developed in the mid 1950s which became the de facto standard way to report algorithms in print for almost the next 30 years. ...
Lisp is a family of computer programming languages with a long history and a distinctive fully-parenthesized syntax. ...
Emacs Lisp is a dialect of the Lisp programming language used by the GNU Emacs and XEmacs text editors (which we will collectively refer to as Emacs in this article. ...
Common Lisp, commonly abbreviated CL, is a dialect of the Lisp programming language, standardised by ANSI X3. ...
Scheme is a multi-paradigm programming language. ...
Wikibooks has a book on the topic of Perl Programming Perl is a dynamic programming language created by Larry Wall and first released in 1987. ...
C is a general-purpose, block structured, procedural, imperative computer programming language developed in 1972 by Dennis Ritchie at the Bell Telephone Laboratories for use with the Unix operating system. ...
Pascal is an imperative computer programming language, developed in 1970 by Niklaus Wirth as a language particularly suitable for structured programming. ...
Example The following example shows various scopes declared in the language C++: C++ (pronounced see plus plus, IPA: ) is a general-purpose programming language with high-level and low-level capabilities. ...
namespace N { // namespace scope, merely groups identifiers class C { // class scope, defines/declares member variables and functions void f (bool b) { // function scope, contains executable statements if (b) { // unnamed scope for conditionally executed statements ... } } }; } Static versus dynamic scoping One of the basic reasons for scoping is to keep variables in different parts of the program distinct from one another. Since there are only a small number of short variable names, and programmers share habits about the naming of variables (e.g., i for an array index), in any program of moderate size the same variable name will be used in multiple different scopes. The question of how to match various variable occurrences to the appropriate binding sites is generally answered in one of two ways: static scoping and dynamic scoping. In programming languages, name binding refers to the association of values with identifiers. ...
Static scoping With static scope, a variable always refers to its nearest enclosing binding. This is a property of the program text and unrelated to the runtime call stack. Because matching a variable to its binding only requires analysis of the program text, this type of scoping is sometimes also called lexical scoping. Static scope is standard in modern functional languages such as ML and Haskell because it allows the programmer to reason as if variable bindings are carried out by substitution. Static scoping also makes it much easier to make modular code and reason about it, since its binding structure can be understood in isolation. In contrast, dynamic scope forces the programmer to anticipate all possible dynamic contexts in which the module's code may be invoked. In computer science, a call stack is a special stack which stores information about the active subroutines of a computer program. ...
ML is a general-purpose functional programming language developed by Robin Milner and others in the late 1970s at the University of Edinburgh, whose syntax is inspired by ISWIM. Historically, ML stands for metalanguage as it was conceived to develop proof tactics in the LCF theorem prover (the language of...
Haskell is a standardized purely functional programming language with non-strict semantics, named after the logician Haskell Curry. ...
Correct implementation of static scope in languages with first-class nested functions can be subtle, as it requires each function value to carry with it a record of the values of the variables that it depends on (the pair of the function and this environment is called a closure). When first-class nested functions are not used or not available (such as in C), this overhead is of course not incurred. Variable lookup is always very efficient with static scope, as the location of each value is known at compile time. In programming languages, a closure is a function that refers to free variables in its lexical context. ...
In computer science, compile time, as opposed to runtime, is the time when a compiler compiles code written in a programming language into an executable form. ...
Dynamic scoping With dynamic scope, each identifier has a global stack of bindings. Introducing a local variable with name x pushes a binding onto the global x stack (which may have been empty), which is popped off when the control flow leaves the scope. Evaluating x in any context always yields the top binding. In other words, a global identifier refers to the identifier associated with the most recent environment. Note that this cannot be done at compile time because the binding stack only exists at runtime, which is why this type of scoping is called dynamic scoping. Look up Stack in Wiktionary, the free dictionary. ...
In computer science control flow (or alternatively, flow of control) refers to the order in which the individual statements, instructions or function calls of an imperative or functional program are executed or evaluated. ...
Generally, certain blocks are defined to create bindings whose lifetime is the execution time of the block; this adds a hint of lexicality to the scoping. However, since a section of code can be called from many different locations and situations, it can be difficult to determine at the outset what bindings will apply when a variable is used. This can be beneficial; application of the principle of least knowledge suggests that code avoid depending on the reasons for (or circumstances of) a variable's value, but simply use the value according to the variable's definition. This narrow interpretation of shared data can provide a very flexible system for adapting the behavior of a function to the current state (or policy) of the system. However, this benefit relies on careful documentation of all variables used this way as well as on careful avoidance of assumptions about a variable's behavior, and does not provide any mechanism to detect interference between different parts of a program. As such, dynamic scoping can be dangerous and many modern languages do not use it. Some languages, like Perl and Common Lisp, allow the programmer to choose lexical or dynamic scoping when (re)defining a variable. In computer programming, a statement block is a section of code which is grouped together, much like a paragraph; such blocks consist of one, or more, statements. ...
The Law of Demeter (LoD), or Principle of Least Knowledge is a design guideline for developing software, particularly object-oriented programs. ...
Wikibooks has a book on the topic of Perl Programming Perl is a dynamic programming language created by Larry Wall and first released in 1987. ...
Common Lisp, commonly abbreviated CL, is a dialect of the Lisp programming language, standardised by ANSI X3. ...
Dynamic scoping is easier to implement. To find an identifier's value, the program traverses the runtime stack, checking each activation record (each function's stack frame) for a value for the identifier. This is known as deep binding. An alternate strategy that is usually more efficient is to maintain a stack of bindings for each identifier; the stack is modified whenever the variable is bound or unbound, and a variable's value is simply that of the top binding on the stack. This is called shallow binding. Note that both of these strategies assume a last-in-first-out (LIFO) ordering to bindings for any one variable; in practice all bindings are so ordered. This article or section should be merged with name binding In computer science, deep binding is the most common implementation of bindings. ...
In programming languages, name binding refers to the association of identifiers with runtime entities such as objects and functions. ...
Example This example compares the consequences of using static scope and dynamic scope. Observe the following code, in a C-like language: int x = 0; int f () { return x; } int g () { int x = 1; return f(); } With static scoping, calling g will return 0 since it has been determined at compile time that the expression x in any invocation of f will yield the global x binding which is unaffected by the introduction of a local variable of the same name in g. With dynamic scoping, the binding stack for the x identifier will contain two items when f is invoked: the global binding to 0, and the binding to 1 introduced in g (which is still present on the stack since the control flow hasn't left g yet). Since evaluating the identifier expression by definition always yields the top binding, the result is 1. To clarify this further we note that the language Perl offers both dynamic and lexical scoping so we can explore this example in both modes. The keyword "my" defines a local variable with lexical scoping, while the keyword "local" defines a local variable with dynamic scoping[1]. Wikibooks has a book on the topic of Perl Programming Perl is a dynamic programming language created by Larry Wall and first released in 1987. ...
$x = 0; sub f { return $x; } sub g { my $x = 1; return f(); } This case uses "my" for static scoping of g's local variable $x. As above, calling g returns 0 because f cannot see g's variable $x, so it looks for the global $x. $x = 0; sub f { return $x; } sub g { local $x = 1; return f(); } In this alternative, "local" is used to make g's $x dynamically-scoped. Now, calling g yields 1 because f sees g's local variable by looking up the execution stack. In other words, the dynamically-scoped variable $x is resolved in the environment of execution, rather than the environment of definition.
See also In programming languages, a closure is a function that refers to free variables in its lexical context. ...
In computer programming, a global variable is a variable that is accessible in every scope. ...
In computer science, a local variable is a variable that is given local scope. ...
In programming languages, name binding refers to the association of values with identifiers. ...
In computer science, name resolution (also called name lookup) is the process of finding the entity that an identifier used in a certain context refers to. ...
In computer science and mathematics, a variable (IPA pronunciation: ) (sometimes called a pronumeral) is a symbolic representation denoting a quantity or expression. ...
References - ^ Perl FAQ 4.3 What's the difference between dynamic and static (lexical) scoping?
|