In computer programming,
a variable is a storage location and an associated symbolic name which contains some known or unknown
quantity or information, a value.
The variable name is the usual way to reference the
stored value; this separation of name and content allows the name to be used
independently of the exact information it represents.[dubious – discuss] A
variable name in computer source code is an identifier that
can be bound to a value during run time,
and the value may change during the course of program execution.
Variables in programming
may not directly correspond to the concept of variables in
mathematics. The value of a computing variable is not necessarily
part of an equation or formula as in mathematics. In computing,
a variable may be employed in a repetitive process: assigned a value in one
place, then used elsewhere, then reassigned a new value and used again in the
same way (see iteration). Variables in
computer programming are frequently given long names to make them relatively
descriptive of their use, whereas variables in mathematics often have terse,
one- or two-character names for brevity in transcription and manipulation.
Compilers have
to replace variables' symbolic names with the actual locations of the data.
While a variable's name, type, and location often remain fixed, the data stored
in the location may be changed during program execution.
Actions on a variable
In imperative programming languages,
values can generally be accessed or changed at
any time. However, in pure functional and logic languages, variables are bound to
expressions and keep a single value during their entire lifetime due
to the requirements of referential
transparency. In imperative languages, the same behavior is
exhibited by constants,
which are typically contrasted with normal variables.
Depending on the type system of a programming language,
variables may only be able to store a specified datatype (e.g. integer or string).
Alternatively, a datatype may be associated only with the current value,
allowing a single variable to store anything supported by the programming
language.
Identifiers referencing a variable
An identifier referencing a
variable can be used to access the variable in order to read out the value, or
alter the value, or edit the attributes of
the variable, such as access permission, locks,semaphores,
etc.
For instance, a variable
might be referenced by the identifier "total_count" and the variable
can contain the number 1956. If the same variable is referenced by the
identifier "x" as well, and if using this identifier "x",
the value of the variable is altered to 2009, then reading the value using the
identifier "total_count" will yield a result of 2009 and not 1956.
If a variable is only
referenced by a single identifier, that can simply be called the name
of the variable. Otherwise, we can speak of one of the names of the
variable. For instance, in the previous example, the "total_count"
is a name of the variable in question, and "x" is another name of the
same variable.
Scope and extent
The scope of
a variable describes where in a program's text, the variable may be used, while
the extent (or lifetime) describes when in a
program's execution a variable has a (meaningful) value. The scope of a
variable is actually a property of the name of the variable, and the extent is
a property of the variable itself.
A variable name's scope affects
its extent.
Scope is
a lexical aspect
of a variable. Most languages define a specific scope for each
variable (as well as any other named entity), which may differ within a given
program. The scope of a variable is the portion of the program code for which
the variable's name has meaning and for which the variable is said to be
"visible". Entrance into that scope typically begins a variable's
lifetime and exit from that scope typically ends its lifetime. For instance, a
variable with "lexical scope" is meaningful only within a certain
block of statements or subroutine. Variables
only accessible within a certain functions are termed "local variables". A "global variable", or one with indefinite
scope, may be referred to anywhere in the program.
Extent,
on the other hand, is a runtime (dynamic)
aspect of a variable. Each binding of a variable to a value can have
its own extent at runtime. The extent of the binding is the
portion of the program's execution time during which the variable continues to
refer to the same value or memory location. A running program may enter and
leave a given extent many times, as in the case of a closure.
Unless the programming
language features garbage
collection, a variable whose extent permanently outlasts its scope
can result in a memory leak, whereby
the memory allocated for the variable can never be freed since the variable
which would be used to reference it for deallocation purposes is no longer
accessible. However, it can be permissible for a variable binding to extend
beyond its scope, as occurs in Lisp closures and
C static local variables;
when execution passes back into the variable's scope, the variable may once
again be used. A variable whose scope begins before its extent does is said to
be uninitialized and
often has an undefined, arbitrary value if accessed (see wild pointer), since it has yet to be
explicitly given a particular value. A variable whose extent ends before its
scope does may become a dangling pointer and deemed uninitialized
once more since its value has been destroyed. Variables described by the
previous two cases may be said to be out of extent or unbound.
In many languages, it is an error to try to use the value of a variable when it
is out of extent. In other languages, doing so may yield unpredictable results.
Such a variable may, however, be assigned a new value, which gives it a new
extent.
For space efficiency, a
memory space needed for a variable may be allocated only when the variable is
first used and freed when it is no longer needed. A variable is only needed
when it is in scope, but beginning each variable's lifetime when it enters
scope may give space to unused variables. To avoid wasting such space,
compilers often warn programmers if a variable is declared but not used.
It is considered good
programming practice to make the scope of variables as narrow as feasible so
that different parts of a program do not accidentally interact with each other
by modifying each other's variables. Doing so also prevents action
at a distance. Common techniques for doing so are to have different
sections of a program use different namespaces,
or to make individual variables "private" through either dynamic variable
scoping or lexical variable
scoping.
Many programming languages
employ a reserved value (often named null or nil) to indicate
an invalid or uninitialized variable.
Typing
See
also: Datatype
In statically typed languages such as Java or ML, a
variable also has a type, meaning that only certain kinds of values
can be stored in it. For example, a variable of type "integer" is prohibited from storing text
values.
In dynamically typed languages such as Python,
it is values, not variables, which carry type. In Common Lisp, both situations exist
simultaneously: a variable is given a type (if undeclared, it is assumed to be T,
the universal supertype) which exists at
compile time. Values also have types, which can be checked and queried at
runtime.
Typing of variables also
allows polymorphisms to
be resolved at compile time. However, this is different from the polymorphism
used in object-oriented function calls (referred to as virtual functions in C++) which resolves the call based on the value type as
opposed to the supertypes the variable is allowed to have.
Variables often store
simple data, like integers and literal strings, but some programming languages
allow a variable to store values of other datatypes as well. Such languages may
also enable functions to be parametric
polymorphic. These functions operate like variables to represent
data of multiple types. For example, a function named length may
determine the length of a list. Such a length function may be
parametric polymorphic by including a type variable in its type signature, since the amount of elements
in the list is independent of the elements' types.
Parameters
The formal
parameters of functions are also referred to as variables. For
instance, in this Python code
segment,
def
addtwo(x):
return x
+ 2
addtwo(5) # yields 7
The variable named x is
a parameter because it is given a value when the function is
called. The integer 5 is the argument which gives x its
value. In most languages, function parameters have local scope. This specific
variable named x can only be referred to within the addtwo function
(though of course other functions can also have variables called x).
Memory allocation
The specifics of variable
allocation and the representation of their values vary widely, both among
programming languages and among implementations of a given language. Many
language implementations allocate space for local variables, whose extent lasts for a
single function call on the call stack, and whose memory is
automatically reclaimed when the function returns. More generally, in name binding, the name of a variable is
bound to the address of some particular block (contiguous sequence) of bytes in
memory, and operations on the variable manipulate that block. Referencing is
more common for variables whose values have large or unknown sizes when the
code is compiled. Such variables reference the location of the value instead of
storing the value itself, which is allocated from a pool of memory called the heap.
Bound variables have
values. A value, however, is an abstraction, an idea; in implementation, a
value is represented by some data object,
which is stored somewhere in computer memory. The program, or the runtime
environment, must set aside memory for each data object and, since memory is
finite, ensure that this memory is yielded for reuse when the object is no
longer needed to represent some variable's value.
Objects allocated from the
heap must be reclaimed—especially when the objects are no longer needed. In a garbage-collected language
(such as C#, Java,
and Lisp),
the runtime environment automatically reclaims objects when extant variables
can no longer refer to them. In non-garbage-collected languages, such as C, the
program (and the programmer) must explicitly allocatememory, and then later free it, to reclaim its
memory. Failure to do so leads to memory leaks, in which the heap is depleted as
the program runs, risking eventual failure from exhausting available memory.
When a variable refers to a data structure created dynamically, some
of its components may be only indirectly accessed through the variable. In such
circumstances, garbage collectors (or analogous program features in languages
that lack garbage collectors) must deal with a case where only a portion of the
memory reachable from the variable needs to be reclaimed.
Naming conventions
See
also: Identifier and Namespace
(computer science)
Unlike their mathematical
counterparts, programming variables and constants commonly take
multiple-character names, e.g. COST or total. Single-character
names are most commonly used only for auxiliary variables; for instance, i, j, k for array index variables.
Some naming conventions are
enforced at the language level as part of the language syntax and involve the
format of valid identifiers. In almost all languages, variable names cannot
start with a digit (0-9) and cannot contain whitespace characters. Whether,
which, and when punctuation marks are permitted in variable names varies from
language to language; many languages only permit the underscore ("_") in variable
names and forbid all other punctuation. In some programming languages, specific
(often punctuation) characters (known as sigils)
are prefixed or appended to variable identifiers to indicate the variable's
type.
Case-sensitivity of variable names also
varies between languages and some languages require the use of a certain case
in naming certain entities;[note 1] Most modern languages are
case-sensitive; some older languages are not. Some languages reserve certain
forms of variable names for their own internal use; in many languages, names
beginning with 2 underscores ("__") often fall under this category.
However, beyond the basic
restrictions imposed by a language, the naming of variables is largely a matter
of style. At the machine code level, variable names are not used, so the exact
names chosen do not matter to the computer. Thus names of variables identify
them, for the rest they are just a tool for programmers to make programs easier
to write and understand.
Programmers often create
and adhere to code style guidelines which offer guidance on naming variables or
impose a precise naming scheme. Shorter names are faster to type but are less
descriptive; longer names often make programs easier to read and the purpose of
variables easier to understand. However, extreme verbosity in variable names
can also lead to less comprehensible code.
No comments:
Post a Comment