动态/静态语言及强类型/弱类型语言简析

 通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。

(1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。

动态语言优点:方便阅读,不需要写许多类型相关的代码

动态语言缺点:不方便调试,命名不规范时,会造成读不懂,不利于理解。同时,安全性能要较静态类型语言低

(2)静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

静态语言优点:结构非常规范,便于调试,方便类型安全

静态语言缺点:为此需要写更多类型相关代码,不便于阅读、不清晰明了

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


强类型语言与弱类型语言

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

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

强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的!
例如:Python是动态语言,是强类型定义语言(类型安全的语言); VBScript是动态语言,是弱类型定义语言(类型不安全的语言);JAVA是静态语言,是强类型定义语言(类型安全的语言)。

 

静态类型定义语言

一种在编译时,数据类型是固定的语言。大多数静态类型定义语言强制这一点,它要求你在使用所有变量之前要声明它们的数据类型。Java和C是静态类型定义语言。

动态类型定义语言

一种在执行期间才去发现数据类型的语言,与静态类型定义相反。VBScript和Python是动态类型定义的,因为它们是在第一次给一个变量赋值的时候找出它的类型的。

强类型定义语言

一种总是强制类型定义的语言。Java和Python是强制类型定义的。如果你有一个整数,如果不显示地进行转换,你不能将其视为一个字符串。

弱类型定义语言

一种类型可以被忽略的语言,与强类型定义相反。VBScript是弱类型定义的。在VBScript中,可以将字符串'12'和整数3进行连接得到字符串'123',然后可以把它看成整数123,而不需要显示转换。但其实它们的类型没有改变,VB只是在判断出一个表达式含有不同类型的变量之后,自动在这些变量前加了一个clong()或(int)()这样的转换函数而已.能做到这一点其实是归功于VB的编译器的智能化而已,这并非是VB语言本身的长处或短处.

结论:

静态是类型编译时判断;动态是类型运行时判断;强类型是类型独立,不轻易转化;弱类型是类型不严格区分,一般是只要大小放得下,就可以转化。这种是汇编级的观点。面向对象的观点并非这样的,对象并不是大小差不多就是类型兼容,而是关键的接口要相同才叫类型兼容。

动态语言并非是弱类型,这是不等价的。恰好的,一般动态语言都是强类型语言,因为都是遵照面向对象的观点来设计对象的。

动态语言的劣势很明显,就是缺少开发环境,运行效率差,当然语言设计上也不完美(静态语言何止千万,但c++也就一个)。

优势也很明显,就是编写容易,层次高,接近自然语义。动态类型语言效率低下的原因,不在于变量的类型是动态的,而在于对象的方法是动态联编的,在这一点上动态类型语言和Java没什么不同。

静态类型语言的优势究竟是什么?

观点一:静态类型语言因为类型强制声明,所以IDE可以做到很好的代码感知能力,因为有IDE的撑腰,所以开发大型系统,复杂系统比较有保障。

对于像Java来说,IDEA/Eclipse确实在代码感知能力上面已经非常强了,这无疑能够增加对大型系统复杂系统的掌控能力。但是除了Java拥有这么强的IDE武器之外,似乎其他语言从来没有这么强的IDE。C#的VisualStudio在GUI开发方面和Wizard方面很强,但是代码感知能力上和Eclipse差的不是一点半点。至于VisualC++根本就是一个编译器而已,羞于提及Visual这个字眼。更不要说那么多C/C++开发人员都是操起vi吭哧吭哧写了几十万行代码呢。特别是像LinuxKernel这种几百万行代码,也就是用vi写出来的阿,够复杂,够大型,够长生命周期的吧。

观点二:静态语言相对比较封闭的特点,使得第三方开发包对代码的侵害性可以降到很低。动态语言在这点上表现的就比较差,我想大家都有过从网上下载某个js包,然后放到项目代码里发生冲突的经历

也就是说静态类型语言可以保障package的命名空间分割,从而避免命名冲突,代码的良好隔离性。但是这个观点也缺乏说服力。

静态类型语言中C,VB都缺乏良好的命名空间分割,容易产生冲突,但是并没有影响他们做出来的系统就不够大,不够复杂。

而Visual C++开发的DLL版本冲突也是臭名昭著的,似乎C++的命名空间没有给它带来很大的帮助。

而动态类型语言中Ruby/Python/Perl都有比较好的命名空间,特别是Python和Perl,例如CPAN上面的第三方库成吨成吨的,也从来没有听说什么冲突的问题。

诚然像PHPjavascript这样缺乏命名空间的动态语言很容易出现问题,但是这似乎是因为他们缺乏OO机制导致的,而不是因为他们动态类型导致的吧?

说到大型系统,复杂业务逻辑系统,Google公司很多东西都是用python开发的,这也证明了动态类型语言并非不能做大型的复杂的系统。其实我个人认为:

动态类型语言,特别是高级动态类型语言,反而能够让人们不需要分心去考虑程序编程问题,而集中精力思考业务逻辑实现,即思考过程即实现过程,用DSL描述问题的过程就是编程的过程,这方面像UnixShell,ruby,SQL,甚至php都是相应领域当之无愧的DSL语言。而显然静态类型语言基本都不满足这个要求。

那静态类型语言的优势究竟是什么呢?我认为就是执行效率非常高。所以但凡需要关注执行性能的地方就得用静态类型语言。其他方面似乎没有什么特别的优势。

 

给你来个例子把

弱类型语言vbs:
 a=1
 b=a+"1"+"a" //结果是11a,这里 a 成了字符串
 c=a+1 //结果是2 ,这里a则是数字型

强类型语言:c#
int a=2
string b=a.ToString()+"1"+"a"
int c=a+1

看到了吗?区分大小写,需要实现申明类型外,一个重要的区别是,弱类型的语言的东西没有明显的类型,他能随着环境的不同,自动变换类型
而强类型则没这样的规定,不同类型间的操作有严格定义,只有相同类型的变量才能操作,虽然系统也有一定的默认转换,当绝没有弱类型那么随便

ps:弱类型代码简单,但因为变量没有确定的类型,所以容易出错!强类型代码复杂(比如:转换日期显示格式 (convert.toDatetime("2007-1-1 08:08:08")).ToString("yyyy-MM-dd"),呵呵你可以看到这种写法相当麻烦),但因为有严格定义所以不容易出错

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值