fbpx
Wikipedia

Strong and weak typing

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 edit

In 1974, B. Liskov and S. 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" edit

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" edit

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 void* is an unsafe operation that is invisible to the compiler.

Pointers edit

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 edit

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 edit

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 edit

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:

  • Java, Pascal, Ada, and C require variables to have a declared type, and support the use of explicit casts of arithmetic values to other arithmetic types. Java, C#, Ada, and Pascal are sometimes said to be more strongly typed than C, a claim that is probably because C supports more kinds of implicit conversions, and allows pointer values to be explicitly cast while Java and Pascal do not. Java may be considered more strongly typed than Pascal as methods of evading the static type system in Java are controlled by the Java virtual machine's type system. C# and VB.NET are similar to Java in that respect, though they allow disabling of dynamic type checking by explicitly putting code segments in an "unsafe context". Pascal's type system has been described as "too strong", because the size of an array or string is part of its type, making some programming tasks very difficult. However, Delphi fixes this issue.[9][10]
  • Smalltalk, Ruby, Python, and Self are all "strongly typed" in the sense that typing errors are prevented at runtime and they do little implicit type conversion, but these languages make no use of static type checking: the compiler does not check or enforce type constraint rules. The term duck typing is now used to describe the dynamic typing paradigm used by the languages in this group.
  • The Lisp family of languages are all "strongly typed" in the sense that typing errors are prevented at runtime. Some Lisp dialects like Common Lisp or Clojure do support various forms of type declarations[11] and some compilers (CMU Common Lisp (CMUCL)[12] and related) use these declarations together with type inference to enable various optimizations and limited forms of compile time type checks.
  • Standard ML, F#, OCaml, Haskell, Go and Rust are statically type-checked, but the compiler automatically infers a precise type for most values.
  • Assembly language and Forth can be characterized as untyped. There is no type checking; it is up to the programmer to ensure that data given to functions is of the appropriate type.

See also edit

References edit

  1. ^ "What to know before debating type systems | Ovid [blogs.perl.org]". blogs.perl.org. Retrieved 2023-06-27.
  2. ^ . Cornell University, Department of Computer Science. 2005. Archived from the original on 2015-11-23. Retrieved 2015-11-23.{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  3. ^ Liskov, B; Zilles, S (1974). "Programming with abstract data types". ACM SIGPLAN Notices. 9 (4): 50–59. CiteSeerX 10.1.1.136.3043. doi:10.1145/942572.807045.
  4. ^ Jackson, K. (1977). "Parallel processing and modular software construction". Design and Implementation of Programming Languages. Lecture Notes in Computer Science. Vol. 54. pp. 436–443. doi:10.1007/BFb0021435. ISBN 3-540-08360-X.
  5. ^ Aahz. "Typing: Strong vs. Weak, Static vs. Dynamic". Retrieved 16 August 2015.
  6. ^ "Type-punning and strict-aliasing - Qt Blog". Qt Blog. Retrieved 18 February 2020.
  7. ^ 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. ^ InfoWorld. 1983-04-25. Retrieved 16 August 2015.
  10. ^ Kernighan, Brian (1981). . Archived from the original on 2012-04-06. Retrieved 2011-10-22.
  11. ^ "CLHS: Chapter 4". Retrieved 16 August 2015.
  12. ^ . Archived from the original on 8 March 2016. Retrieved 16 August 2015.

strong, weak, typing, computer, programming, many, ways, that, programming, languages, colloquially, classified, whether, language, type, system, makes, strongly, typed, weakly, typed, loosely, typed, however, there, precise, technical, definition, what, terms. 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 Contents 1 History 2 Definitions of strong or weak 2 1 Implicit type conversions and type punning 2 2 Pointers 2 3 Untagged unions 2 4 Static type checking 3 Variation across programming languages 4 See also 5 ReferencesHistory editIn 1974 B Liskov and S 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 editA 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 edit 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 void is an unsafe operation that is invisible to the compiler Pointers edit 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 edit 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 edit 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 editThis section possibly contains original research Please improve it by verifying the claims made and adding inline citations Statements consisting only of original research should be removed May 2018 Learn how and when to remove this message This section needs additional citations for verification Please help improve this article by adding citations to reliable sources in this section Unsourced material may be challenged and removed May 2020 Learn how and when to remove this message 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 Java Pascal Ada and C require variables to have a declared type and support the use of explicit casts of arithmetic values to other arithmetic types Java C Ada and Pascal are sometimes said to be more strongly typed than C a claim that is probably because C supports more kinds of implicit conversions and allows pointer values to be explicitly cast while Java and Pascal do not Java may be considered more strongly typed than Pascal as methods of evading the static type system in Java are controlled by the Java virtual machine s type system C and VB NET are similar to Java in that respect though they allow disabling of dynamic type checking by explicitly putting code segments in an unsafe context Pascal s type system has been described as too strong because the size of an array or string is part of its type making some programming tasks very difficult However Delphi fixes this issue 9 10 Smalltalk Ruby Python and Self are all strongly typed in the sense that typing errors are prevented at runtime and they do little implicit type conversion but these languages make no use of static type checking the compiler does not check or enforce type constraint rules The term duck typing is now used to describe the dynamic typing paradigm used by the languages in this group The Lisp family of languages are all strongly typed in the sense that typing errors are prevented at runtime Some Lisp dialects like Common Lisp or Clojure do support various forms of type declarations 11 and some compilers CMU Common Lisp CMUCL 12 and related use these declarations together with type inference to enable various optimizations and limited forms of compile time type checks Standard ML F OCaml Haskell Go and Rust are statically type checked but the compiler automatically infers a precise type for most values Assembly language and Forth can be characterized as untyped There is no type checking it is up to the programmer to ensure that data given to functions is of the appropriate type See also editComparison of programming languages Data type includes a more thorough discussion of typing issues Design by contract strong typing as implicit contract form Latent typing Memory safety Type safety Type system Strongly typed identifierReferences edit What to know before debating type systems Ovid blogs perl org blogs perl org Retrieved 2023 06 27 CS1130 Transition to OO programming Spring 2012 self paced version Cornell University Department of Computer Science 2005 Archived from the original on 2015 11 23 Retrieved 2015 11 23 a href Template Cite web html title Template Cite web cite web a CS1 maint bot original URL status unknown link Liskov B Zilles S 1974 Programming with abstract data types ACM SIGPLAN Notices 9 4 50 59 CiteSeerX 10 1 1 136 3043 doi 10 1145 942572 807045 Jackson K 1977 Parallel processing and modular software construction Design and Implementation of Programming Languages Lecture Notes in Computer Science Vol 54 pp 436 443 doi 10 1007 BFb0021435 ISBN 3 540 08360 X Aahz Typing Strong vs Weak Static vs Dynamic Retrieved 16 August 2015 Type punning and strict aliasing Qt Blog Qt Blog Retrieved 18 February 2020 Luca Cardelli Typeful programming Hoare C A R 1974 Hints on Programming Language Design In Computer Systems Reliability ed C Bunyan Vol 20 pp 505 534 InfoWorld 1983 04 25 Retrieved 16 August 2015 Kernighan Brian 1981 Why Pascal is not my favorite programming language Archived from the original on 2012 04 06 Retrieved 2011 10 22 CLHS Chapter 4 Retrieved 16 August 2015 CMUCL User s Manual The Compiler Archived from the original on 8 March 2016 Retrieved 16 August 2015 Retrieved from https en wikipedia org w index php title Strong and weak typing amp oldid 1216926967, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.