我正在阅读一个幻灯片,上面写着“JavaScript 未输入类型”。这与我认为的真实情况相矛盾,因此我开始挖掘以尝试了解更多信息。
所以我问了 JavaScript 的创造者 Brendan Eich,他说:
学术类型使用“无类型”来表示“无静态类型”。他们足够聪明,可以看到值具有类型(呃!)。上下文很重要。
专注于学术的计算机科学人员是否将“无类型”用作“动态类型”的同义词(这是否有效?)还是我缺少更深层次的东西?我同意 Brendan 的观点,即上下文很重要,但任何对解释的引用都会很棒,因为我目前的“转到”书籍并没有在这个主题上发挥作用。
我想确定这一点,这样我可以提高我的理解,因为即使是维基百科也没有提到这种替代用法(无论如何我都能找到)。如果我错了,我不想在将来使用该术语或质疑该术语的使用:-)
(我还看到一个顶级的 Smalltalker 说 Smalltalk 也是“无类型”的,所以这不是一次性的,这让我开始了这个任务!:-))
是的,这是学术文献中的标准做法。要理解它,知道“类型”的概念是在 1930 年代在 lambda 演算的背景下发明的(事实上,甚至更早,在集合论的背景下),这会有所帮助。从那时起,出现了一个完整的计算逻辑分支,即所谓的“类型论”。程序设计语言理论就是建立在这些基础之上的。在所有这些数学上下文中,“类型”具有特定的、公认的含义。
术语“动态类型”是在很久以后才发明的——面对“类型”这个词的常见数学用法,它在术语上是矛盾的。
例如,这里是 Benjamin Pierce 在他的标准教科书 Types and Programming Languages 中使用的“类型系统”的定义:
类型系统是一种易于处理的句法方法,用于通过根据它们计算的值的种类对短语进行分类来证明不存在某些程序行为。
他还评论道:
有时会明确添加“静态”这个词——例如,我们说的是“静态类型的编程语言”——以区分我们在这里考虑的编译时分析与发现的动态或潜在类型在诸如 Scheme(Sussman 和 Steele,1975 年;Kelsey、Clinger 和 Rees,1998 年;Dybvig,1996 年)等语言中,运行时类型标签用于区分堆中不同类型的结构。像“动态类型”这样的术语可以说是用词不当,应该用“动态检查”来代替,但用法是标准的。
大多数在该领域工作的人似乎都同意这一观点。
请注意,这并不 意味着 “无类型”和“动态类型”是同义词。相反,后者是前者特定情况的(技术上具有误导性的)名称。
PS:FWIW,我碰巧既是类型系统的学术研究员,又是 JavaScript 的非学术实施者,所以我不得不忍受这种分裂。:)