您的位置:首页 > 其它

Coding语言强弱类型的判定

2016-09-24 21:37 316 查看

Coding语言强弱类型的判定

前几天和师父(Coding大神)讨论了一下怎么判定语言的强弱类型,在这里总结一下:

强类型:

强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了.比如:如果你定义了一个整形变量a,那么程序根本不可能将a当作字符串类型处理.

强类型定义语言是类型安全的语言 .

弱类型:

数据类型可以被忽略的语言。它与强类型定义语言相反,一个变量可以赋予不同数据类型的值.

看了前面的文字叙述,感觉自己都是蒙的,这时候听了大神的解释才明白过来:

while (n)
{

}


上面的表达式是While条件语句,在C中只要n 不等于0||false 的话都会执行,所以n不一定要等于1||true就可以满足条件,所以C为弱类型语言,依次去类推可以得到其他的语言特点,一语点醒梦中人啊。

补充: 判断强弱类型语言

先来定义一些概念

Program Errors


trapped errors
。导致程序终止执行,如除0,Java中的数组越界访问。

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

Forbidden Behaviours:

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


Well behaved, ill behaved :

Well behaved
: 如果程序执行不可能出现
forbidden behaviours
, 则为
well behaved


ill behaved
: 否则为
ill behaved


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

强、弱类型

强类型
strongly typed
: 如果一种语言的所有程序都是
well behaved
——既不可能出现
forbidden behaviors
, 则该语言为
strongly typed


弱类型
weakly typed
: 上面强类型(
strongly typed
)否则为弱类型
weakly typed
。比如C语言的缓冲区溢出, 属于
trapped errors
, 即属于
forbidden behaviors
。故C语言是弱类型。

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

动态、静态类型

静态类型
statically
: 如果在编译时拒绝
ill behaved
程序,则是
statically typed


动态语言
dynamiclly
: 如果在运行时拒绝
ill behaviors
, 则是
dynamiclly typed


误区

大家一般都会认为C语言需要编写
int a, int b
之类的, Python语言不用写(可以直接写a, b), 所以C语言是静态的语言, Python 是动态的语言。这样理解是非常不准确的。比如Ocaml是静态类型的,但是也可以不明确的写出来。Ocaml是静态类型隐式

静态类型可以分为两种:

如果类型是语言语法的一部分, 是
explicitly typed
显示类型;

如果类型通过编译时推导,是
implicity typed
隐式类型, 比如ML和Haskell。

下面是些例子

无类型: 汇编;

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

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

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

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

静态显式类型 :Java/C;

静态隐式类型 :Ocaml, Haskell。

JackDan9 Thinking
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息