Monday, October 15, 2007
In computer science, a type system defines how a programming language classifies values and expressions into types, how it can manipulate those types and how they interact. A type indicates a set of values that have the same sort of generic meaning or intended purpose (although some types, such as abstract types and function types, might not be represented as values in the running computer program). Type systems vary significantly between languages with, perhaps, the most important variations being their compile-time syntactic and run-time operational implementations.
A compiler may use the static type of a value to optimize the storage it needs and the choice of algorithms for operations on the value. For example, in many C compilers the "float" data type is represented in 32 bits, in accordance with the IEEE specification for single-precision floating point numbers. Thus, C uses floating-point-specific operations on those values (floating-point addition, multiplication, etc.).
The depth of type constraints and the manner of their evaluation affects the typing of the language. Further, a programming language may associate an operation with varying concrete algorithms on each type in the case of type polymorphism. Type theory is the study of type systems, although the concrete type systems of programming languages originate from practical issues of computer architecture, compiler implementation, and language design.
Basis
The process of verifying and enforcing the constraints of types – type checking – may occur either at compile-time (a static check) or run-time (a dynamic check). If a language enforces type rules strongly (that is, generally allowing only those automatic type conversions which do not lose information), one can refer to the process as strongly typed, if not, as weakly typed.
Type checking
In most compiled computer languages, like C, C++ and Pascal, the data type of every variable, parameter and function return value is known at compile time. The programmer has to provide the type information through declarations. This is known as static typing (but some statically typed languages may include implicit declarations). A programming language is statically typed if type checking may be performed without testing equivalence of run-time expressions. A statically typed programming language respects the distinction between run-time and compile-time phases of processing. A language has a compile-time phase if separate modules of a program can be type checked separately (separate compilation), without information about all modules that exist at run time. Static type-checking becomes a primary task of the semantic analysis carried out by a compiler.
Static typing
In languages with dynamic data typing, like Lisp, Perl, and JavaScript, the data types are not declared. They are not known until execution time. The advantage of dynamic data typing is more flexibility and less work for the programmer. But often the data type declarations help organizing and understanding a program. A programming language is dynamically typed if the language supports run-time (dynamic) dispatch on tagged data. A programming language is dependently typed, if the phase distinction is violated and consequently the type checking requires testing equivalence of run-time expressions.
To see how type tag checking works, consider the following pseudocode example:
In this example, (1) declares the name x; (2) associates the integer value 5 to the name x; and (3) associates the string value "hi" to the name x. In most statically typed systems, this code fragment would be illegal, because (2) and (3) bind x to values of inconsistent type.
By contrast, a purely dynamically typed system would permit the above program to execute, since type tags are attached to values, not variables. The implementation of a dynamically typed language catches programmer errors related to the misuse of values—type errors—at the time of the computation of the erroneous statement or expression. In other words, dynamic typing catches errors during program execution.
A typical implementation of dynamic typing keeps all program values "tagged" with a type tag, and checks the tag before using any value in an operation. For example:
In this code fragment, (1) binds the value 5 to x; (2) binds the value "hi" to y; and (3) attempts to add x to y. In a dynamically typed language, the value bound to x might be a pair (integer, 5), and the value bound to y might be a pair (string, "hi"). When the program attempts to execute line 3, the language implementation checks the type tags integer and string, and if the operation + (addition) is not defined over these two types it signals an error.
Dynamic typing
Some statically typed languages have a "back door" in the language that enables programmers to write code that does not statically type check. For example, Java and C-style languages have "casting".
The presence of static typing in a programming language does not necessarily imply the absence of dynamic typing mechanisms. For example, Java uses static typing, but certain operations require the support of runtime type tests, which are a form of dynamic typing. See programming language for more discussion of the interactions between static and dynamic typing.
Combinations of dynamic and static typing
The choice between static and dynamic typing requires some trade-offs.
Static typing finds type errors reliably at compile time. This should increase the reliability of the delivered program. However, programmers disagree over how commonly type errors occur, and thus what proportion of those bugs which are written would be caught by static typing. Static typing advocates believe programs are more reliable when they have been type-checked, while dynamic typing advocates point to distributed code that has proven reliable and to small bug databases. The value of static typing, then, presumably increases as the strength of the type system is increased. Advocates of strongly typed languages such as ML and Haskell have suggested that almost all bugs can be considered type errors, if the types used in a program are sufficiently well declared by the programmer or inferred by the compiler.
Static typing usually results in compiled code that executes more quickly. When the compiler knows the exact data types that are in use, it can produce optimized machine code. Further, compilers in statically typed languages can find shortcuts more easily. Some dynamically-typed languages such as Common Lisp allow optional type declarations for optimization for this very reason. Static typing makes this pervasive. See optimization.
By contrast, dynamic typing may allow compilers and interpreters to run more quickly, since changes to source code in dynamically-typed languages may result in less checking to perform and less code to revisit. This too may reduce the edit-compile-test-debug cycle.
Statically-typed languages which lack type inference (such as Java) require that programmers declare the types they intend a method or function to use. This can serve as additional documentation for the program, which the compiler will not permit the programmer to ignore or drift out of synchronization. However, a language can be statically typed without requiring type declarations, so this is not a consequence of static typing.
Static typing allows construction of libraries which are less likely to be accidentally misused by their users. This can be used as an additional mechanism for communicating the intentions of the library developer.
Dynamic typing allows constructs that some static type systems would reject as illegal. For example, eval functions, which execute arbitrary data as code, become possible (however, the typing within that evaluated code might remain static). Furthermore, dynamic typing accommodates transitional code and prototyping, such as allowing a string to be used in place of a data structure. Recent enhancements (e.g. Haskell Generalized algebraic data types) to statically typed languages have allowed eval functions to be written in a type-safe way.
Dynamic typing typically makes metaprogramming more powerful and easier to use. For example, C++ templates are typically more cumbersome to write than the equivalent Ruby or Python code. More advanced run-time constructs such as metaclasses and introspection are often more difficult to use in statically-typed languages.
Static and dynamic type checking in practice
Subscribe to:
Post Comments (Atom)
Blog Archive
-
▼
2007
(104)
-
▼
October
(29)
- The Committee on Development (Commission du dé...
- People's Republic of China (PRC), which governs...
- Advertising Age is a magazine, delivering news...
- The Shenandoah Valley region of western Virgin...
- The Short C-23 Sherpa is a small transport aircr...
- Orkney (also known as the Orkney Islands, Isles ...
- Richard Walter Zisk (born February 6, 1949 in ...
- Baron Burnham, of Hall Barn in the Parish of Bea...
- The Tempest is a play written by William Shakesp...
- The Great Britain road numbering scheme is a num...
- Donald Pleasence, OBE (October 5, 1919 – Febru...
- Karl Wilhelm von Nägeli (March 27, 1817 - May ...
- County Down, (Contae An Dúin in Irish) is one of...
- John William Heisman (October 23, 1869 – October...
- For the Anglo-Saxon monarch, see Eni of East A...
- For Wikipedia policy about copyright issues, see...
- In computer science, a type system defines how...
- New Zealand receives two million tourists per ye...
- OpenSolaris is an open source project created ...
- The Capitole de Toulouse is the seat of the mu...
- Combos, officially called Combos Snacks, inven...
- Sir Roy Herbert Thomson, 1st Baron Thomson of ...
- Overview There are laboratories around the wor...
- This article is about the British campaign me...
- Honolulu Stadium For an article on the minor lea...
- Mac OS X version 10.4 "Tiger" is the fifth major...
- Coordinates: 52°46′08″N 2°22′38″W / 52.769, -2...
- Names The crown of Wallachia was not passed auto...
- Synonyms (in ancient Greek, συν ("syn") = plus...
-
▼
October
(29)
No comments:
Post a Comment