开发语言的静态/动态,强类型/弱类型之分
之前同事每次跟我提起他学习了某个语言,并介绍这个语言很棒时,开头都会跟我说这个语言是什么类型,动态还是静态,我总是比较尴尬的不知道怎么去接。在知乎上翻了一遍发现一个特别好的解释,因为是图片,我这里就整理出文字,如果有谁知道原文的出处麻烦留言告知我一下。知乎链接(比较靠后的一个回答,需要耐心翻一下)
概念定义
静态类型语言
指在编译变量时变量的数据类型即可确定的语言,比如C/C++/JAVA/C#,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言则可以不这么做
优势
- IDE可以智能提示。因为静态类型语言的类型是确定的,所以编辑器就可以知道当前的变量有哪些属性和方法
- 编译的时候能够发现类型不匹配的错误,而动态语言最多只能发现语法的错误
劣势
- 因为要定义数据类型,代码量也会随之变大,编程应该更专注于程序的本质,而不是把精力分散到数据类型定义上
- 缺乏灵活性,因为一个变量只能赋值某种类型,当程序需要扩展的时候,这就会成为枷锁,当然可以通过继承和接口实现,但这会陷入另一个深渊,需要更多的精力去纠结复杂的继承关系
动态类型语言
指在运行时确定数据类型的语言,变量使用之前不需要类型声明,通常变量的类型就是被赋值那个值的类型,比如VB/Python
优势
- 相反于静态类型,编程完全集中于程序的设计本质上,代码的简洁度也会提高,开发效率可能会数倍的提高
- 因为程序规模的降低,程序的可理解性也会提高。静态类型的拥护者可能会认为,少了类型信息,程序编的更不可读了。这个就属于仁者见仁了,有人会认为程序更集中于程序的本质上会更可读,也有人认为有了类型的辅助程序会更可读
劣势
- 程序执行速度慢,因为动态类型的语言,类型检查是在运行期做的,但随着计算及性能的提高,执行速度不是什么严重的问题
- 不执行就检测不出错误,当然要是增加类型检查插件那就另说了。
强类型语言
一旦变量的类型被确定,就不能转化的语言,比如java/Python。
弱类型语言
弱类型语言则反之,一个变量的类型是由其上下文确定的,比如VB/Perl/C
如何选择
套用一句流行的话就是:Static typing when possible, dynamic typing when needed。我的理解如下:
- 尽可能使用静态语言。类型判断可能帮助我们更早的发现问题,让代码更加规范化
- 在需要的时候使用动态语言。比如写一些脚本,肯定想要高效的实现,懒的去专门定义那些烦人的Interface。