强、弱类型与静态、动态类型语言

来源:互联网 发布:csgo mac 黑屏 编辑:程序博客网 时间:2024/05/16 19:23

链接:https://www.zhihu.com/question/19918532/answer/21647195
来源:知乎

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

1. 基础概念

Program Errors

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

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

Well behaved、ill behaved

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

2. 强、弱类型,静态、动态类型

强、弱类型

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

      弱类型语言,类型检查更不严格,如偏向于容忍隐式类型转换。譬如说C语言的int可以变成double。 这样的结果是:容易产生forbidden behaviours,所以是弱类型的。

动态、静态类型

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

3.误区

  很多地方把静态=强类型=声明变量类型,动态=弱类型=不声明变量类型,这么理解是不够准确的。譬如Ocaml是静态类型的,但是也可以不用明确地写出来。
  Ocaml是静态隐式类型

静态类型可以分为两种:

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

4.例子

无类型: 汇编
弱类型、静态类型 : C/C++
弱类型、动态类型检查: Perl/PHP
强类型、静态类型检查 :Java/C#
强类型、动态类型检查 :Python, Scheme
静态显式类型 :Java/C
静态隐式类型 :Ocaml, Haskell

如果只关注动静和强弱可以记住下图:

这里写图片描述

Java/C#等强类型的静态语言一般需要对变量/对象进行声明,因此IDE可以做到很好的代码感知能力。在实现复杂的业务逻辑、开发大型商业系统以及那些生命周期很长的应用中也有这非常强的优势。
静态类语言的一般都是先编译在交由CPU执行因此执行效率非常高,所以大型项目多数由静态语言开发。

动态类型(尤其是动态强类型,如Python)的语言可以让编写者集中思考业务逻辑实现,而不必将过多时间放在数据结构与类型转换上,达到思考过程即实现过程

阅读全文
0 0
原创粉丝点击