Type system[edit]

Main articles: Data typeType system, and Type safety

A type system defines how a programming language classifies values and expressions into types, how it can manipulate those types and how they interact. The goal of a type system is to verify and usually enforce a certain level of correctness in programs written in that language by detecting certain incorrect operations. Any decidable type system involves a trade-off: while it rejects many incorrect programs, it can also prohibit some correct, albeit unusual programs. In order to bypass this downside, a number of languages have type loopholes, usually unchecked casts that may be used by the programmer to explicitly allow a normally disallowed operation between different types. In most typed languages, the type system is used only to type check programs, but a number of languages, usually functional ones, infer types, relieving the programmer from the need to write type annotations. The formal design and study of type systems is known as type theory.

Typed versus untyped languages[edit]

A language is typed if the specification of every operation defines types of data to which the operation is applicable, with the implication that it is not applicable to other types.[47] For example, the data represented by "this text between the quotes" is a string, and in many programming languages dividing a number by a string has no meaning and will be rejected by the compilers. The invalid operation may be detected when the program is compiled ("static" type checking) and will be rejected by the compiler with a compilation error message, or it may be detected when the program is run ("dynamic" type checking), resulting in a run-time exception. Many languages allow a function called an exception handler to be written to handle this exception and, for example, always return "-1" as the result.

A special case of typed languages are the single-type languages. These are often scripting or markup languages, such as REXX or SGML, and have only one data type—most commonly character strings which are used for both symbolic and numeric data.

In contrast, an untyped language, such as most assembly languages, allows any operation to be performed on any data, which are generally considered to be sequences of bits of various lengths.[47] High-level languages which are untyped include BCPLTcl, and some varieties of Forth.

In practice, while few languages are considered typed from the point of view of type theory (verifying or rejecting all operations), most modern languages offer a degree of typing.[47] Many production languages provide means to bypass or subvert the type system, trading type-safety for finer control over the program's execution (see casting).

Static versus dynamic typing[edit]

In static typing, all expressions have their types determined prior to when the program is executed, typically at compile-time. For example, 1 and (2+2) are integer expressions; they cannot be passed to a function that expects a string, or stored in a variable that is defined to hold dates.[47]

Statically typed languages can be either manifestly typed or type-inferred. In the first case, the programmer must explicitly write types at certain textual positions (for example, at variable declarations). In the second case, the compiler infers the types of expressions and declarations based on context. Most mainstream statically typed languages, such as C++C# and Java, are manifestly typed. Complete type inference has traditionally been associated with less mainstream languages, such as Haskelland ML. However, many manifestly typed languages support partial type inference; for example, Java and C# both infer types in certain limited cases.[48] Additionally, some programming languages allow for some types to be automatically converted to other types; for example, an int can be used where the program expects a float.

Dynamic typing, also called latent typing, determines the type-safety of operations at run time; in other words, types are associated with run-time values rather than textual expressions.[47] As with type-inferred languages, dynamically typed languages do not require the programmer to write explicit type annotations on expressions. Among other things, this may permit a single variable to refer to values of different types at different points in the program execution. However, type errors cannot be automatically detected until a piece of code is actually executed, potentially making debugging more difficult. LispSmalltalkPerlPythonJavaScript, and Ruby are all examples of dynamically typed languages.

Weak and strong typing[edit]

Weak typing allows a value of one type to be treated as another, for example treating a string as a number.[47] This can occasionally be useful, but it can also allow some kinds of program faults to go undetected at compile time and even at run time.

Strong typing prevents the above. An attempt to perform an operation on the wrong type of value raises an error.[47] Strongly typed languages are often termed type-safeor safe.

An alternative definition for "weakly typed" refers to languages, such as Perl and JavaScript, which permit a large number of implicit type conversions. In JavaScript, for example, the expression 2 * x implicitly converts x to a number, and this conversion succeeds even if x is nullundefined, an Array, or a string of letters. Such implicit conversions are often useful, but they can mask programming errors. Strong and static are now generally considered orthogonal concepts, but usage in the literature differs. Some use the term strongly typed to mean strongly, statically typed, or, even more confusingly, to mean simply statically typed. Thus C has been called both strongly typed and weakly, statically typed.[49][50]

It may seem odd to some professional programmers that C could be "weakly, statically typed". However, notice that the use of the generic pointer, the void* pointer, does allow for casting of pointers to other pointers without needing to do an explicit cast. This is extremely similar to somehow casting an array of bytes to any kind of datatype in C without using an explicit cast, such as (int) or (char).

https://en.wikipedia.org/wiki/Programming_language

最新文章

  1. Yii 1开发日记 -- Ajax实现点击加载下一页
  2. Ngrok 内网穿透神器(转载)
  3. linux echo命令的-n、-e两个参数
  4. 在sql中使用了 hashbytes 函数
  5. 十、Notepad++正则表达式使用
  6. python - socket模块1
  7. 眼花缭乱的UI,蓝牙位于何方
  8. Visual Studio 使用及调试必知必会
  9. 使用 sitemesh/decorator装饰器装饰jsp页面(原理及详细配置)
  10. 终端管理软件tmux
  11. html5 javascript 小型计算器
  12. Django contenttypes组件
  13. 嵌入式C语言预处理使用
  14. 决策树之ID3,C4.5及CART
  15. 安装完office后 在组件服务里DCOM配置中找不到
  16. Python自动化必备发送邮件报告脚本详解
  17. AndroidStudio编译error:app:validateReleaseSigning'Keystore file not found for signing config 'release
  18. 安装mysql提示3306端口已经被占用解决方案
  19. 获取最后插入的id另外方法
  20. 阿里云96页报告详解《云上转型》(10个案例、10大趋势/完整版PPT)

热门文章

  1. centos7 redmine安装过程(转载)
  2. day28 re(正则)模块
  3. ojdbc14:11.2.0.1.0出错
  4. 初步使用vue中axios
  5. linu问题集锦
  6. Nginx负载均衡health_check分析
  7. 我的第一个arcgis地图应用
  8. jQuery(Dom节点操作)
  9. spring和struts整合
  10. POJ 1811