编程语言的强类型、弱类型

大多数情况下,人们用编程语言是否会隐式地转换数据类型来判断一门语言是否为弱类型语言,比如 C。

而实际上,对于除了比较经典的语言外,大部分人对于其他常见语言的强、弱类型是分不清楚的——或者说,是不一致的。因此总会有人来争论它。如果我们以开篇的概念来作为基础,那么矛盾就会显现:

比如 Pascal 曾计划作为强类型语言,但整体上却给类型系统引入了一个漏洞,所以技术上来讲它是弱类型的。

那么到底什么才是强类型,什么才是弱类型呢?我无法回答你,因为业界本身就没有对它进行一个完整的定义。所以如果你用强类型语言还是弱类型语言来区分之,是相当不准确的。——因为你无法解释清楚究竟什么才是强类型什么才是弱类型。

大多数情况下,我们用类型安全、内存安全动态类型检查静态类型检查来定义语言——这样就明确多了。

其实大多数情况下,我们对强弱类型的理解是不同的,大部分人会按照开篇的概念来理解,但有时候也会有其他的想法——这是很正常的,因为这个定义本身就不是严格的技术定义。所以由于一开始我并没有深究这个问题,导致我以“弱类型”来描述了 Swift 语言,而实际上按照我们的普遍定义,它应当是强类型语言——因为它并不能隐式转换数据类型。

但是说它是弱类型就一定不对吗?按照我“小众”的定义,弱类型指的是在声明的时候不需要显式地写出值类型,比如大部分情况下,Swift 有类型推断可以依赖。所以以此同理,我会认为 C 语言是强类型语言。

你可能觉得很可笑,但是我仍旧厚着脸皮说我是对的,因为对于弱类型的定义只有普遍的理解而并没有严格的定义。

但同样,我也说明了 Swift 是类型安全的语言,这一点是正确的。

混淆

说起类型安全,你可能就会看到,大部分人用强类型来指代类型安全,他们说 Swift 是强类型语言的时候,其实就是在说:Swift 是一门类型安全的语言。——因为大部分情况下,类型安全的表现和强类型的表现差不多——比如不能隐式地转换值的类型。

但这里我还要讲,当我们讨论一门语言是静态类型语言还是动态类型语言的时候,又会有不少人说静态类型语言是强类型语言,因为它的行为也符合强类型的定义。

你看,如果我们说一个语言是强类型语言,那么它是类型安全的呢?还是说它是静态类型语言呢?或者两者都有?

还是说典型的C、C艹,说它是强类型语言,因为它是静态语言,有些人说不是,因为它不是类型安全的;比如说流行的 Python,它是弱类型语言,因为它不是静态类型语言对吧?可是有人就要反对了:Python 不允许类型隐式转换啊它其实是强类型!

所以我们应当避免用强弱来区分编程语言的行为,你这么做,并不能给听众带来多少益处,恐怕唯一的作用就是让初学者更加糊涂。

延伸阅读

What is the difference between a strongly typed language and a statically typed language?

Strong and weak typing

“编程语言的强类型、弱类型”的17个回复

          1. 像我这种常年不看垃圾邮件的人……我竟然真的被它给坑了!好吧,我得去翻翻……看来我后来加的一段代码起作用了,待会写一篇文章嘿嘿。

      1. 唔……我来汇报个bug,回复没有邮件提醒。另外我是不是得弄个gravatar了呢……
        Python那本书依旧在吃灰,不过tiobe的统计显示……python势头挺猛

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.