静态类型vs动态类型
静态类型
-
静态类型是指在编译时就能确定变量类型的类型
例如,C++语言中定义变量:
int a = 5;
float b = 5.5;
double pi = 3.1415926;
char c[] = "Hello";
string d("World");
以上变量都在编译时决定了类型,类型的定义本身就决定了变量本身可操作的集合,因此代码在编译过程中就可以较早地发现类型错误。
- 优点:能在编译时发现类型错误,在代码发布运行之前找到问题并提前解决
- 缺点:静态类型必须在声明中表达出来,编译器无法智能识别类型
动态类型
- 动态类型是指在运行时才能确定一个变量类型的类型
例如,JavaScript语言中的语句:
var name = student.getName();
这行代码只有在被执行的时候才知道 name 是字符串类型的,甚至是 null 或 undefined 类型;同时也没办法进行类型推导,因为 student.getName() 函数签名根本不包含返回值类型信息。
- 优点:设限较少,节约编程的时间成本,代码本身具有一定的灵活性
- 缺点:牺牲一定的可靠性,运行时可能会出现的错误概率较大,同时系统需要对变量类型进行识别,会耗费额外的时间
总结
通常情况下,建议把可能遇到的问题提前预防并解决,能使用静态类型就尽量使用静态类型,可以在编译时马上发现问题并解决,这不仅能减少运行时的工作量和降低错误出现的可能性,个人认为这也是良好的编程习惯。但并非就认为动态类型完全不可取,某些未知的环境下,动态类型的使用也是难以避免的。因此,静态类型和动态类型各有利弊,需做一定的权衡。
强类型vs弱类型
强类型
- 强类型的一个类型对象只有一种解释方式,不允许隐式转换
"1"+2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
上述例子中,"1"为字符串类型str,2为整型int,表达式中的运算不允许隐式类型转换,出现forbidden behavior,该语言是强类型语言。
- 优点:类型固定、安全,内存大小固定,而且可以连续分配,方便管理,逻辑严谨
- 缺点:速度上可能略逊色于弱类型定义语言,编程时在类型中投入的精力增加
弱类型
- 弱类型的一个类型对象可以被解释成不同的类型,允许隐式转换
"1"+2
'12'
上述例子中,"1"为字符串类型str,2为整型int,表达式在执行过程中,整型2被转换成字符串类型,输出结果呈现出字符串的拼接,该语言是弱类型语言。
- 优点:灵活、简单、方便使用,包容性较强,定义变量的过程中可以无需指定类型,且执行过程中也可以隐式地改变其类型
- 缺点:调试过程较困难,容易产生未知BUG,相对不适合大项目开发
总结
从上述讨论开来,静态类型和强类型语言更为严谨,容易理解,能减少程序出错的可能性;而动态类型和弱类型语言更为灵活,但更容易出错
当前常见的语言分类

参考
https://www.zhihu.com/question/19918532/answer/58538334
https://segmentfault.com/a/1190000012372372
网友评论