常见语言分类

静态语言和动态语言

先举个例子,C语言:

float pi = 3.14159265;

JavaScript:

var str = "hello";
alert(str);//第一行之后,str就是是一个String类型了

比较这两个方式。在C语言中,我们用float关键字定义了变量 pi,而JS并未使用这样的方式。
C语言是一种静态类型,在声明期 | 编译期就给定了变量的类型;在静态类型语言中,类型是从属于变量(变量改变类型需要类型声明改变)。从声明那一刻开始,变量只能被分配声明类型的数据(给定的数据类型 | 类型转换后的data)。那既然有这样的需求,静态语言会有一个编译期用于类型检测,这样就会产生编译期运行期两个时期。
一些常见的静态类型语言: C++, C#, Java, Basic, Pascal, Ada 和 Fortran。

JavaScript语言是一种动态类型,变量类型可以在运行期间改变;在动态类型语言中,类型是从属于数据(数据类型改变影响了类型改变)。变量名只是指向了数据,他们可以在任何时刻指向任何类型的数据。既然不需要类型检测,那么,也就不需要区分编译期运行期
一些常见的动态类型语言: 大部分脚本语言和快速原型开发语言,例如,Javascript, Lisp, PHP, Python, Ruby, Scheme 等等。

强类型与弱类型

强弱类型的概念没有动态和静态类型语言的区分那么清晰。一个最常见的定义方式:是否允许不相同类型之间的操作。
例如,JS操作:

var num = 123;
num = num + 'str';//结果123str,JS可以不用在意不同类型的变量之间进行操作

Java操作

int num = 123;
num = num +'str';//异常,Java不允许不同类型之间的变量进行操作

JS会隐式转换数字num为字符串,然后得出字符串结果。而Java不允许这样的转换(ClassCastException),因为这是一种过于灵活的表现。

弱类型允许这样的快速开发,而强类型会在编译期捕获这种隐含的错误。强类型需要程序员关注类型转换,而弱类型更多的是通过大量的隐式(自动)转换完成了这些操作。

P.S.
一般来说,静态类型由于需要编译期进行类型检测。正常来讲,静态类型应该都是强类型,即不允许不同类型之间可以进行操作。而C和Basic语言却是特殊的不是强类型的静态类型语言。
因为,C语言中,对于Char字符的操作,实际隐式转化为int进行操作,那么,这样的话,打破了强类型的规则。

安全类型和不安全类型

如何定义安全这个概念?对于异常进行捕获,将会导致程序停止,但是,如果不捕获异常,就会出现各种奇怪的行为。所以,安全类型会让语言在编译期捕获隐藏的异常,对于动态语言,将会在运行期捕获这些异常。
这里有一个误区:弱类型的语言缺乏安全性。这个概念是不对的,相反的,由于弱类型会把检测操作放在运行期,运行期检测有一个好处,所有的信息都处于待运行状态并且都可被获取,使得安全检测可以被更彻底的执行。
例如:C语言中的指针被认为是一种不安全的类型,而索引则被认为是一种安全的类型。

各语言分类

Language Static / Dynamic Strong / Weak Safety
Ada static strong safe
C static weak unsafe
C++ static strong unsafe
Java static strong safe
Javascript dynamic weak safe
Lisp dynamic strong safe
Pascal static strong safe
Perl dynamic weak safe
PHP dynamic weak safe
Python dynamic strong safe
Ruby dynamic strong safe

综述

强弱类型动静态语言区别:

这两个概念是有区别的,强弱类型的本质是是否允许不同类型之间进行操作,例如:

//JavaScript
var i = 1;//i 是number类型,数字
i = i + "abc"//不会报异常,结果为"1abc"

弱类型隐式转换了变量类型。

再如:

//Python
a = 1;//a是一个数字类型
a = a+"abc"//异常,不允许数字和字符串进行 "+"操作

python是一个强类型语言,不允许不同类型的变量之间的操作。

这里强调一下,我一直以为,Python是动态的语言,所以一定是弱类型语言,但是其实Python是动态的强类型语言。所以说这两个概念是有区别的:强类型不允许不同类型之间的变量有操作。动态型使得变量的类型是由数据的类型所决定,而不是由关键字。

动静态语言是由变量的初始化方式所决定。

//Java
int a = 1;//整型
float b = 1.0;//浮点型

变量的定义是关键字定义的。

//JavaScript
var str = 'abc';//字符串类型
str = 123;//number类型

变量的类型是由数据的类型所定义的。

参考:http://eli.thegreenplace.net/2006/11/25/a-taxonomy-of-typing-systems

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章