编程语言分类

根据语言对数据类型的处理方式,有两种流行的分类方法。

静态类型 vs 动态类型

  • 静态类型语言

所有变量在声明或者定义时,必须指定类型,而且一旦一个变量被指定了类型,在其生命周期内不能变为其它不相干类型(这里数字类型之间、父类子类之间不算不相干类型)。C/C++,Java等属于这个类别。如下面的C代码(*type.c):

int main(int argc, char** argv) {
    char s[] = "hello world";
    s = 1;
    return 0;
}

编译type.c,编译器会报错。

himalayas@ubuntu:~/work/python/notes$ gcc -c type.c
type.c: In function ‘main’:
type.c:3:4: error: assignment to expression with array type
  s = 1;
    ^
  • 动态类型语言

变量定义时,无需指定类型,变量类型由其关联的对象决定。在其生命周期内可以通过赋值关联不同类型的对象,从而其类型也发生了变化。Python,PHP等属于这个类别。如下面的Python代码(type.py):

s = 'abc'
print(s)

s = 1024
print(s)

执行type.py,结果如下:

himalayas@ubuntu:~/work/python/notes$ python type.py
abc
1024

type.py中,变量s先是被赋值为一个字符串对象,然后又赋值为一个整形对象。

强类型 vs 弱类型

  • 强类型

不允许不相干类型之间相互转换,或者需要使用显示的强制转换。C/C++,Java,Python等属于强类型。如下面的Python代码:

Python 3.5.2 (default, Nov 12 2018, 13:43:14)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> s = "9"
>>> s + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
>>>

上面的代码中变量s是一个字符串对象,s + 1试图对字符串进行数学运算,Python直接按异常处理。

  • 弱类型

变量可以根据使用场景隐式(自动)转换为其它不相干类型。PHP等属于弱类型。如下面的PHP代码(type.php):

<?php
$s = "9";
$i = $s + 1;
echo $i . "\n";

执行type.php,结果如下:

himalayas@ubuntu:~/work/python/notes$ php type.php
10

type.php中变量$s是一个字符串对象,$s + 1试图对字符串进行数学运算,PHP自动吧字符串转换为数值型并完成运算。

总结

  • C/C++、Java是静态类型编程语言,同时也是强类型编程语言。
  • Python是动态类型编程语言,同时也是强类型编程语言。
  • PHP是动态类型编程语言,同时也是弱类型编程语言。