"无类型"是否也意味着学术CS世界中的"动态类型"?

Pet*_*per 164 javascript computer-science types typing

我正在阅读一个幻灯片,上面写着"JavaScript是无类型的".这与我认为的真实相矛盾,所以我开始尝试去学习更多.

JavaScript的每个答案都是一种无类型的语言?他说,JavaScript 不是无类型的,并且提供了各种形式的静态,动态,强大和弱类型的例子,这些都是我熟悉和满意的......所以这不是可行的方法.

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

学术类型使用"无类型"来表示"无静态类型".他们足够聪明,可以看到价值观有类型(呃!).背景问题.

以学术为中心的计算机科学人员是否使用"无类型"作为"动态类型"的同义词(并且这是有效的吗?)还是有更深层次的东西让我失踪?我同意布兰登的观点,认为背景很重要,但任何解释的引用都会很棒,因为我目前的"去"书并没有在这个主题上发挥作用.

我想要明确这一点,以便我可以提高我的理解,因为即使维基百科也没有提到这种替代用法(无论如何我都能找到).如果我错了,我不想在将来使用该术语或质疑该术语的使用:-)

(我也看到一个顶级的Smalltalker说Smalltalk也是"无类型的",所以这不是一次性的,这就是让我完成这个任务!:-))

And*_*erg 144

是的,这是学术文献中的标准做法.要理解它,有助于知道"类型"的概念是在20世纪30年代发明的,在lambda演算的背景下(事实上,甚至更早,在集合论的背景下).从那以后,出现了一个被称为"类型理论"的计算逻辑的整个分支.编程语言理论基于这些基础.在所有这些数学语境中,"类型"具有特定的,已确立的含义.

术语"动态类型"是很晚才发明的 - 面对"类型"一词的常见数学用法,这是一个矛盾.

例如,这里是Benjamin Pierce在其标准教科书" 类型和编程语言 "中使用的"类型系统"的定义:

类型系统是一种易处理的句法方法,通过根据短语计算的值对短语进行分类来证明某些程序行为的缺失.

他还说:

有时会明确添加"静态"一词 - 例如,我们称之为"静态类型编程语言" - 用于区分我们在此考虑的编译时分析类型,以及在语言中找到的动态或潜在类型. Scheme(Sussman和Steele,1975; Kelsey,Clinger和Rees,1998; Dybvig,1996),其中运行时类型标签用于区分堆中的不同种类的结构.像"动态类型"这样的术语可以说是用词不当,应该用"动态检查"代替,但用法是标准的.

大多数在该领域工作的人似乎都在分享这种观点.

请注意,这并不能意味着"类型化"和"动态类型"是同义词.相反,后者是前者特定案例的(技术上误导性)名称.

PS:FWIW,我碰巧既是类型系统的学术研究员,也是JavaScript的非学术实现者,所以我不得不忍受schisma.:)

  • **非常有用,甚至可能是我提供一些历史记录的最喜欢的答案. (5认同)
  • 这是一个非常有用的解释,谢谢! (2认同)
  • @PeterCooper btw你可能有兴趣知道形式语义的一个主要分支是对类型lambda演算的预测(ha a pun); 例如Montague Semantics.但作为一个声明性的,非生成性的系统,我个人总是将Montague Semantics等系统的输入分开,而不是输入编程语言. (2认同)

Nor*_*sey 67

我是一名专攻编程语言的学术计算机科学家,是的,"无类型"这个词经常(误)用于这种方式.保留用于不带动态类型标签的语言(例如Forth和汇编代码)的单词会很好,但这些语言很少使用,甚至更少研究,并且说"无类型"更容易比"动态打字".

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

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

PPS原创海报:当谈到编程语言,特别是类型系统时,维基百科上的信息质量很差.不要相信它.

  • 我认为在CS(包括学术界)中存在一个更广泛的问题,即在没有严格定义的情况下使用名称.这与数学和(大多数?)科学形成鲜明对比.大量争议(例如关于OOP)似乎源于缺乏正确的定义.很烦人. (11认同)
  • @Norman:当谈到编程语言,尤其是类型系统时,如果你觉得维基百科上的信息质量很差,不要忽视它并改进它.(只是拖钓) (5认同)
  • @Norman,我很惊讶你把它称为滥用 - 正如你所知,类型的概念早于几十年所谓的动态类型语言,而后者称之为"类型"与前者没什么关系.因此,我认为可以说滥用是另一回事. (3认同)
  • @Gyom当我意识到维基百科过程奖励*改变*而非*专业*时,我放弃改进维基百科.我的时间花在改善SO上:-) (3认同)
  • @KonradRudolph:我想知道,由于缺乏适当的定义而引起的争议,缺乏适当的定义可能部分来自争议.有些术语获得情感价值(无论是积极的还是消极的),然后特定语言的支持者以包含或排除其语言的方式定义这些术语(并排除或包括他们最喜欢的"敌人"语言).对于一个数学例子 - 如果仍然有人支持天真集理论而不是公理集理论,你可以肯定他们会称自己的观点为"公理集理论"并定义"天真" (2认同)

rua*_*akh 42

我调查了一下,发现问题的答案很简单,而且令人惊讶的是,"是":学术CS类型,或者至少其中一些,确实使用"无类型"来表示"动态类型".例如,编程语言:原理与实践,第三版(作者Kenneth C. Louden和Kenneth A. Lambert,2012年出版)说:

没有静态类型系统的语言通常称为无类型语言(或动态类型语言).这些语言包括Scheme和Lisp,Smalltalk的其他方言,以及大多数脚本语言,如Perl,Python和Ruby.但请注意,无类型语言不一定允许程序破坏数据 - 这只意味着所有安全检查都在执行时执行.[...]

[ 链接 ](注意:原始的粗体)并继续以这种方式使用"无类型".

我发现这令人惊讶(出于与afrischke和Adam Mihalcin给出的原因相同的原因),但你有.:-)


编辑添加:您可以通过插入"untyped languages"Google图书搜索找到更多示例.例如:

[...]这是主要的信息隐藏机制,是许多无类型语言.例如PLT Scheme [4]使用生成structs,[...]

- Jacob Matthews和Amal Ahmed,2008 [ 链接 ]

[...],我们提供了一种非类型化函数语言的绑定时间分析[...].[...]它已经实施并在部分评估员中用于方案的无副作用方言.然而,分析足够普遍,对于非严格类型的函数语言(如Haskell)有效.[...]

- 查尔斯康塞尔,1990年[ 链接 ]

顺便说一句,在查看这些搜索结果之后,我的印象是,如果研究人员写了一篇"无类型"的函数式语言,他很可能会认为它与无类型的lambda一样"无类型". Adam Mihalcin提到的微积分.至少,一些研究人员提到了Scheme和lambda演算.

当然,搜索没有说的是是否有研究人员拒绝这种识别,并且认为这些语言是"无类型的".好吧,我确实发现了这个:

然后我意识到实际上没有循环性,因为动态类型语言不是无类型语言 - 只是程序文本中的类型通常不是很明显.

- 某人(我不知道是谁),1998 [ link ]

但显然大多数拒绝这种认同的人都不会觉得有必要明确这样说.

  • 哇.令人震惊的.谢谢(你的)信息. (2认同)

Ada*_*cin 10

无类型和动态类型绝对不是同义词.最常被称为"无类型"的语言是Lambda微积分,它实际上是一个统一的语言 - 一切都是函数,所以我们可以静态地证明一切的类型都是函数.动态类型语言有多种类型,但没有为编译器添加静态检查方法,迫使编译器在变量类型上插入运行时检查.

然后,JavaScript是一种动态类型语言:可以用JavaScript编写程序,使得某些变量x可以是数字,函数,字符串或其他东西(并确定哪一个需要解决停机问题或某些问题)硬数学问题),所以你可以应用于x一个参数,浏览器必须在运行时检查x是一个函数.

  • 垃圾中的@Steve垃圾是任何编程语言的情况,并且与类型的概念无关.即使在像OCaml或SML这样的强类型语言中,我也可以将北极传递给计算"我与目标的距离"的函数(不,我当前的位置不是北极). (5认同)
  • @AdamMihalcin:圣诞老人? (2认同)

小智 6

这两个陈述都是正确的,这取决于你是在谈论价值观还是变量.JavaScript变量是无类型的,JavaScript值具有类型,并且变量可以在运行时覆盖任何值类型(即"动态").

在JavaScript和许多其他语言中,值而不是变量带有类型.所有变量都可以覆盖所有类型的值,并且可以被视为"动态类型"或"无类型" - 从类型检查的角度来看,没有/不可知类型的变量和可以采用任何类型的变量在逻辑上和实际上是等价的.当类型理论家谈论语言和类型时,他们通常会谈论这个 - 携带类型的变量 - 因为他们对编写类型检查器和编译器等感兴趣,它们对程序文本(即变量)进行操作而不是在内存中运行程序(即价值观).

相比之下,在其他语言中,如C,变量带有类型,但值不带.在像Java这样的语言中,变量和值都带有类型.在C++中,某些值(具有虚函数的值)携带类型而其他值则不携带.在某些语言中,值甚至可以改变类型,尽管这通常被认为是糟糕的设计.

  • 我认为关键的区别不在于值和*变量*之间,而是在值和*表达式之间*:在静态类型语言中,表达式有类型,而在动态类型语言中,只有值有.(变量名当然是一种表达方式.) (5认同)

Dav*_*son 5

虽然大多数编写类型的 CS 研究人员基本上只将具有语法可推导类型的语言视为类型化语言,但仍有更多使用动态/潜在类型化语言的人对这种用法感到不满。

我认为有 3 种类型的 [SIC] 语言:

无类型 - 只有运算符决定值的解释 - 它通常适用于任何事情。示例:汇编程序、BCPL

静态类型 - 表达式/变量具有与其关联的类型,该类型决定了编译时运算符的解释/有效性。示例:C、Java、C++、ML、Haskell

动态类型 - 值具有与其关联的类型,该类型决定了操作符在运行时的解释/有效性。示例:LISP、Scheme、Smalltalk、Ruby、Python、Javascript

据我所知,所有动态类型语言都是类型安全的——即只有有效的运算符才能对值进行操作。但对于静态类型语言来说,情况并非如此。根据所用类型系统的能力,某些运算符可能仅在运行时检查,或根本不检查。例如,大多数静态类型语言不能正确处理整数溢出(添加 2 个正整数可以产生一个负整数),并且越界数组引用要么根本不检查(C、C++),要么只在运行。此外,某些类型系统非常薄弱,以至于有用的编程需要逃逸舱口(C 和家族中的强制转换)来更改表达式的编译时类型。

所有这些都导致了荒谬的说法,例如 C++ 比 Python 更安全,因为它是(静态类型的),而事实是 Python 本质上是安全的,而你可以用 C++ 射击你的腿。