常见语言分类

静态语言和动态语言

先举个例子,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语言中的指针被认为是一种不安全的类型,而索引则被认为是一种安全的类型。

各语言分类

LanguageStatic / DynamicStrong / WeakSafety
Adastaticstrongsafe
Cstaticweakunsafe
C++staticstrongunsafe
Javastaticstrongsafe
Javascriptdynamicweaksafe
Lispdynamicstrongsafe
Pascalstaticstrongsafe
Perldynamicweaksafe
PHPdynamicweaksafe
Pythondynamicstrongsafe
Rubydynamicstrongsafe

综述

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

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

//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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值