在学术 CS 世界中,“非类型化”是否也意味着“动态类型化”?

2022-08-30 01:54:04

我正在阅读一个幻灯片,上面写着“JavaScript是非类型化的”。这与我认为正确的情况相矛盾,所以我开始挖掘以尝试了解更多信息。

每个答案 JavaScript 都是一种非类型化的语言吗?都说 JavaScript 不是无类型的,并提供了我熟悉和满意的各种形式的静态、动态、强和弱类型的示例。所以这不是要走的路。

所以我问了JavaScript的创建者Brendan Eich,他说:

学术类型使用“非类型化”来表示“无静态类型”。他们足够聪明,可以看到值有类型(呃!上下文很重要。

以学术为重点的计算机科学人士是否使用“非类型化”作为“动态类型化”的同义词(这是否有效?)还是我缺少更深层次的东西?我同意Brendan的观点,即上下文很重要,但任何解释的引用都会很棒,因为我目前的“去”书并没有在这个话题上玩球。

我想确定这一点,这样我就可以提高我的理解,因为即使维基百科也没有提到这种替代用法(无论如何,我可以找到)。如果我错了,我不想弄乱使用这个术语或质疑将来使用这个术语:-)

(我还看到一个顶级的Smalltalker说Smalltalk也是“无类型”的,所以这不是一次性的,这让我开始了这个任务! :-))


答案 1

是的,这是学术文献中的标准做法。为了理解它,知道“类型”的概念是在1930年代在lambda演算的背景下发明的(事实上,甚至更早,在集合论的背景下)。从那时起,计算逻辑的整个分支就出现了,被称为“类型论”。编程语言理论就是基于这些基础。在所有这些数学语境中,“类型”具有特定的、既定的含义。

术语“动态类型”是很久以后才发明的 - 面对“类型”一词的常见数学用法,这在术语上是矛盾的。

例如,以下是本杰明·皮尔斯(Benjamin Pierce)在他的标准教科书《类型和编程语言》(Types and Programming Languages)中使用的“类型系统”的定义:

类型系统是一种易于处理的语法方法,用于根据短语计算的值类型对短语进行分类来证明某些程序行为的不存在。

他还说:

“静态”这个词有时被明确地添加 - 例如,我们称之为“静态类型编程语言” - 以区分我们在这里考虑的编译时分析的类型与Scheme等语言中发现的动态或潜在类型(Sussman和Steele,1975;凯尔西,克林格和里斯,1998年;Dybvig, 1996),其中运行时类型标记用于区分堆中不同类型的结构。像“动态类型”这样的术语可以说是用词不当,可能应该被替换为“动态检查”,但用法是标准的。

大多数在该领域工作的人似乎都同意这种观点。

请注意,这并不意味着“非类型化”和“动态类型化”是同义词。相反,后者是前者特定情况的(技术上误导性的)名称。

PS:FWIW,我碰巧既是类型系统的学术研究人员,也是JavaScript的非学术实现者,所以我必须忍受分裂。:)


答案 2

我是一名专门研究编程语言的学术计算机科学家,是的,“非类型化”这个词经常以这种方式(错误)使用。最好将这个词保留给不带有动态类型标签的语言,例如Forth和汇编代码,但这些语言很少使用,甚至很少被研究,并且说“无类型”比“动态类型化”容易得多。

Bob Harper 喜欢说,像 Scheme、Javascript 等语言应该被视为只有一种类型:value 的类型化语言。我倾向于这种观点,因为它使得仅使用一种类型的形式主义来构建一致的世界观成为可能。

P.S. 在纯 lambda 演算中,唯一的“值”是正态形式的项,而正态形式中唯一的闭合项是函数。但是大多数使用 lambda 演算的科学家都会添加基类型和常量,然后你要么为 lambda 包含一个静态类型系统,要么你又回到了动态类型标签。

附言对于原始海报:当涉及到编程语言,特别是类型系统时,维基百科上的信息质量很差。不要相信它。