Strong and weak typing explained

In computer programming, one of the many ways that programming languages are colloquially classified is whether the language's type system makes it strongly typed or weakly typed (loosely typed). However, there is no precise technical definition of what the terms mean and different authors disagree about the implied meaning of the terms and the relative rankings of the "strength" of the type systems of mainstream programming languages.[1] For this reason, writers who wish to write unambiguously about type systems often eschew the terms "strong typing" and "weak typing" in favor of specific expressions such as "type safety".

Generally, a strongly typed language has stricter typing rules at compile time, which implies that errors and exceptions are more likely to happen during compilation. Most of these rules affect variable assignment, function return values, procedure arguments and function calling. Dynamically typed languages (where type checking happens at run time) can also be strongly typed. In dynamically typed languages, values, rather than variables, have types.

A weakly typed language has looser typing rules and may produce unpredictable or even erroneous results or may perform implicit type conversion at runtime.[2] A different but related concept is latent typing.

History

In 1974, Barbara Liskov and Stephen Zilles defined a strongly-typed language as one in which "whenever an object is passed from a calling function to a called function, its type must be compatible with the type declared in the called function."[3] In 1977, K. Jackson wrote, "In a strongly typed language each data area will have a distinct type and each process will state its communication requirements in terms of these types."[4]

Definitions of "strong" or "weak"

A number of different language design decisions have been referred to as evidence of "strong" or "weak" typing. Many of these are more accurately understood as the presence or absence of type safety, memory safety, static type-checking, or dynamic type-checking.

"Strong typing" generally refers to use of programming language types in order to both capture invariants of the code, and ensure its correctness, and definitely exclude certain classes of programming errors. Thus there are many "strong typing" disciplines used to achieve these goals.

Implicit type conversions and "type punning"

Some programming languages make it easy to use a value of one type as if it were a value of another type. This is sometimes described as "weak typing".

For example, Aahz Maruch observes that "Coercion occurs when you have a statically typed language and you use the syntactic features of the language to force the usage of one type as if it were a different type (consider the common use of void* in C). Coercion is usually a symptom of weak typing. Conversion, on the other hand, creates a brand-new object of the appropriate type."[5]

As another example, GCC describes this as type-punning and warns that it will break strict aliasing. Thiago Macieira discusses several problems that can arise when type-punning causes the compiler to make inappropriate optimizations.[6]

There are many examples of languages that allow implicit type conversions, but in a type-safe manner. For example, both C++ and C# allow programs to define operators to convert a value from one type to another with well-defined semantics. When a C++ compiler encounters such a conversion, it treats the operation just like a function call. In contrast, converting a value to the C type is an unsafe operation that is invisible to the compiler.

Pointers

Some programming languages expose pointers as if they were numeric values, and allow users to perform arithmetic on them. These languages are sometimes referred to as "weakly typed", since pointer arithmetic can be used to bypass the language's type system.

Untagged unions

Some programming languages support untagged unions, which allow a value of one type to be viewed as if it were a value of another type.

Static type-checking

In Luca Cardelli's article Typeful Programming,[7] a "strong type system" is described as one in which there is no possibility of an unchecked runtime type error. In other writing, the absence of unchecked run-time errors is referred to as safety or type safety; Tony Hoare's early papers call this property security.[8]

Variation across programming languages

Some of these definitions are contradictory, others are merely conceptually independent, and still others are special cases (with additional constraints) of other, more "liberal" (less strong) definitions. Because of the wide divergence among these definitions, it is possible to defend claims about most programming languages that they are either strongly or weakly typed. For instance:

See also

Notes and References

  1. Web site: What to know before debating type systems Ovid [blogs.perl.org] ]. 2023-06-27 . blogs.perl.org.
  2. Web site: CS1130. Transition to OO programming. – Spring 2012 --self-paced version . 2005 . Cornell University, Department of Computer Science . https://web.archive.org/web/20151123211922/http://www.cs.cornell.edu/ . 2015-11-23 . 2015-11-23 . bot: unknown .
  3. 10.1.1.136.3043 . Programming with abstract data types . B . Liskov . S . Zilles . ACM SIGPLAN Notices . 1974 . 10.1145/942572.807045 . 9 . 4 . 50–59.
  4. Book: Jackson . K. . Design and Implementation of Programming Languages . Parallel processing and modular software construction . 1977 . Lecture Notes in Computer Science . 54 . 436–443 . 10.1007/BFb0021435 . 3-540-08360-X . registration.
  5. Web site: Typing: Strong vs. Weak, Static vs. Dynamic. Aahz. 16 August 2015.
  6. Web site: Type-punning and strict-aliasing - Qt Blog. Qt Blog. 18 February 2020.
  7. http://www.lucacardelli.name/Papers/TypefulProg.pdf Luca Cardelli, "Typeful programming"
  8. Hoare, C. A. R. 1974. Hints on Programming Language Design. In Computer Systems Reliability, ed. C. Bunyan. Vol. 20 pp. 505–534.
  9. Book: InfoWorld. 16 August 2015. 1983-04-25.
  10. Web site: Why Pascal is not my favorite programming language . Brian . Kernighan . Brian Kernighan . 1981 . 2011-10-22 . https://web.archive.org/web/20120406094058/http://www.cs.virginia.edu/~cs655/readings/bwk-on-pascal.html . 2012-04-06 . dead.
  11. Web site: CLHS: Chapter 4. 16 August 2015.
  12. Web site: CMUCL User's Manual: The Compiler. 16 August 2015. https://web.archive.org/web/20160308055914/https://common-lisp.net/project/cmucl/doc/cmu-user/compiler.html#toc123. 8 March 2016. dead.