通知 网站从因情语写改为晴雨,这个网站的模板也从calmlog_ex改为 whimurmur
文章来源于网络,无法注明出处的还请谅解,如果出处注明错误(如仍是载转),请联系我修改

弱类型、强类型、动态类型、静态类型语言的区别

254人浏览 / 0人评论 / | 这是对我有帮助的文章  | 分类: 计算机语言  | 标签: 转载

作者:xlupc

链接:https://www.cnblogs.com/xiongxiaolong/p/10179790.html

来源:博客园


类型系统的一些概念,众说纷纭,使用上也比较乱。有些东西,甚至不好严格定义。以下算学术界的一种相对“严格”的说法。

首先了解一下基本概念

0|1Program Errors


  • trapped errors。导致程序终止执行,如除0,Java中数组越界访问
  • untrapped errors。 出错后继续执行,但可能出现任意行为。如C里的缓冲区溢出、Jump到错误地址

0|1Forbidden Behaviours


语言设计时,可以定义一组forbidden behaviors. 它必须包括所有untrapped errors, 但可能包含trapped errors.

0|1Well behaved、ill behaved


  • well behaved: 如果程序执行不可能出现forbidden behaviors, 则为well behaved
  • ill behaved: 否则为ill behaved...

有了上面的概念,再讨论强、弱类型,静态、动态类型

强、弱类型

  • 强类型strongly typed: 如果一种语言的所有程序都是well behaved——即不可能出现forbidden behaviors,则该语言为strongly typed。
  • 弱类型weakly typed: 否则为weakly typed。比如C语言的缓冲区溢出,属于trapped errors,即属于forbidden behaviors..故C是弱类型

弱类型语言,类型检查更不严格,如偏向于容忍隐式类型转换

譬如说C语言的int可以变成double。 这样的结果是:容易产生forbidden behaviours,所以是弱类型的

弱类型

> "1"+2 '12'

强类型

>>> "1"+2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects

动态、静态类型

  • 静态类型 statically: 如果在编译时拒绝ill behaved程序,则是statically typed;
  • 动态类型dynamiclly: 如果在运行时拒绝ill behaviors, 则是dynamiclly typed。

其中静态类型可以分为两种:

  • 如果类型是语言语法的一部分,在是explicitly typed显式类型,比如java和c;
  • 如果类型通过编译时推导,是implicity typed隐式类型, 比如ML和Haskell

静态类型,编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误。

动态类型,编译的时候不知道每一个变量的类型,因为类型错误而不能做的事情是运行时错误。

静态类型指的是编译器在compile time执行类型检查,动态类型指的是编译器(虚拟机)在runtime执行类型检查。简单地说,就是在声明了一个变量之后,不能改变它的类型的语言,是静态语言;能够随时改变它的类型的语言,是动态语言。因为动态语言的特性,一般需要运行时虚拟机支持。

静态类型更适合构建大型应用( ? )

  • 静态类型检查可以做到early fail,即你编写的代码即使没有被执行到,一旦你编写代码时发生类型不匹配,语言在编译阶段(解释执行也一样,可以在运行前)即可发现。
  • 静态类型对阅读代码是友好的。对于复杂的应用,静态类型就是非常重要的提示和约束。

这也是TypeScript(添加了可选的静态类型和基于类的面向对象编程)为什么要使用的部分原因了

动态类型

>>> a = 1 >>> type(a) <type 'int'> >>> a = "s" >>> type(a) <type 'str'>

静态类型

Prelude> let a = "123" :: Int <interactive>:2:9: Couldn't match expected type `Int' with actual type `[Char]' In the expression: "123" :: Int In an equation for `a': a = "123" :: Int

附图:


转载文章声明标题示例:


点赞(0) 打赏

全部评论

还没有评论!