mydeer
就像我们从来没有来过这里,但这种感觉似曾相识。
弱类型、强类型、动态类型、静态类型语言的区别是什么?

关于语言类型概念有些乱,想弄清楚这些定义需要先知道一些概念。

1、概念介绍

Program Errors

trapped errors:程序异常,终止执行,如除0,Java中数组越界访问

untrapped errors:出错后继续执行,但可能出现任意行为。如C里的缓冲区溢出、Jump到错误地址

Forbidden Behavious

语言设计是,可以定义一组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 behavious)。

弱类型weakly typed: 否则为 weakly typed。如C语言的缓冲区溢出,属于untrapped errors,属于forbidden behavious

静、动态类型

静态类型 statically: 在编译时拒绝ill behaved;

动态乐行 danamiclly: 在运行时拒绝 ill behaved;

3、误区

C语言要写int a,Php 不用写(直接 $a),所以C 是静态,PHP是动态。这么理解太片面。譬如Ocaml是静态类型的,但是可以不用明确写出类型修饰符(属于静态隐式类型)。

静态类型分为:

显示类型explicitly typed,类型是语言语法的一部分。

隐式类型implicity typed,类型通过编译时推导

4、例子

无类型:汇编

弱类型、静态类型:C/C++

弱类型、动态类型检查:PHP/Perl

强类型、静态类型检查:JAVA/C#

强类型、动态类型检查:Python, Scheme

静态显式类型:Java/C

静态隐式类型:Ocaml/Haskell


配个图:

2aa7b669e45a2fb111a4c736afe3083c_b.png

红色区域外:well behaved (type soundness)

红色区域内:ill behaved

如果所有程序都是灰的,strongly typed

否则如果存在红色的程序,weakly typed

编译时排除红色程序,statically typed

运行时排除红色程序,dynamically typed

所有程序都在黄框以外,type safe


最后对于动态语言与静态语言的区分,套用一句流行的话就是:Static typing when possible, dynamic typing when needed。


参考:zhihu.com/question/19918532

<< 上一篇 php static静态属性和静态方法的调用 一个http请求发送到后端的详细过程 下一篇 >>
文章标签
随意 | Created At 2014 By William Clinton | Contact Me: 1619488373@qq.com | 蜀ICP备14002619号 |