在学术CS界,“未打字”是否还意味着“动态打字”?

2020/10/25 09:02 · javascript ·  · 0评论

我正在读一张幻灯片,上面写着“未键入JavaScript”。这与我认为是正确的相矛盾,因此我开始努力尝试以了解更多信息。

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

因此我问了JavaScript的创建者Brendan Eich,他说:

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

以学术为重点的计算机科学人员是否使用“未类型化”作为“动态类型化”的同义词(这有效吗?),或者还有更深层的我想念的东西吗?我同意布伦丹(Brendan)的观点,即上下文很重要,但任何引用的解释都将是非常有用的,因为我目前的“继续阅读”书籍都没有在这个主题上发挥作用。

我想详细说明这一点,以便提高我的理解力,因为即使Wikipedia也没有提到这种替代用法(无论如何我还是可以找到)。如果我弄错了,我不想在将来混用该术语或质疑该术语的使用:-)

(我也看到一位顶级Smalltalker表示Smalltalk也是“未键入的”,所以它不是一次性的,这使我着手完成此任务!:-))

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

“动态类型”一词的发明很晚,在面对“类型”一词的常见数学用法时,这是一个矛盾。

例如,这是本杰明·皮尔斯在他的标准教科书“类型和编程语言”中使用的“类型系统”的定义

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

他还说:

有时会明确添加“静态”一词(例如,我们称为“静态类型的编程语言”),以区分我们在此处考虑的编译时分析类型与在诸如方案(Sussman和Steele,1975; Kelsey,Clinger和Rees,1998; Dybvig,1996),其中,运行时类型标记用于区分堆中的不同结构。诸如“动态类型化”之类的术语可以说是错误的,应该用“动态检验”代替,但是用法是标准的。

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

请注意,这并不能意味着“类型化”和“动态类型”是同义词。相反,对于前者的特定情况,后者是一个(技术上令人误解的)名称。

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

我是一位专门从事编程语言的计算机科学学者,是的,“无类型”一词经常以这种方式使用。保留该单词以用于不带有动态类型标签的语言(如Forth和汇编代码)会很好,但是这些语言很少使用,甚至很少研究,并且说“未键入”要容易得多而不是“动态类型”。

鲍勃·哈珀(Bob Harper)喜欢说诸如Scheme,Javascript之类的语言应被视为只有一个类型:value的类型化语言。我倾向于这种观点,因为仅使用一种类型形式主义就可以构建一致的世界观。

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

PPS原始海报:当涉及到编程语言,尤其是类型系统时,Wikipedia上的信息质量很差。不要相信

我调查了一下,发现您的问题的答案简单而令人惊讶地是“是”:学术CS类型或至少其中一些确实使用“未键入”来表示“动态键入”。例如,《编程语言:原理和实践》第三版(由Kenneth C. Louden和Kenneth A. Lambert撰写,于2012年出版)说:

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

[链接](注意:原文为粗体),然后继续以这种方式使用“未键入”字样。

我发现这令人惊讶(出于与afrischke和Adam Mihalcin相同的原因),但是您就在那里。:-)


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

[…]这是许多未键入语言的主要信息隐藏机制。例如,PLT方案[4]使用生成structs,[…]

—雅各布·马修斯和阿马尔·艾哈迈德,2008年[链接]

[…],我们提出了对无类型功能语言[…]的绑定时间分析。[…]它已经实现,并用于Scheme的无副作用方言的部分评估程序中。但是,该分析足够全面,对于非严格类型的功能语言(例如Haskell)有效。[…]

-查尔斯·康塞尔(Charles Consel),1990年[链接]

顺便说一句,在浏览这些搜索结果后,我的印象是,如果研究人员写出“无类型”功能语言,他很可能会认为它与无类型lambda一样具有“无类型”含义。亚当·米哈尔辛(Adam Mihalcin)提到的微积分。至少,一些研究人员在同一口气中提到了Scheme和lambda演算。

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

然后,我意识到实际上并没有循环性,因为动态类型化的语言不是非类型化的语言-只是类型通常在程序文本中通常不是立即显而易见的。

—某人(我不知道是谁),1998年[链接]

但是显然,大多数拒绝这种身份的人并不需要明确地说出这一点。

未类型化和动态类型化绝对不是同义词。最常被称为“非类型化”的语言是Lambda演算,它实际上是一种统一语言-一切都是函数,因此我们可以静态证明一切类型都是函数。动态类型的语言具有多种类型,但是并没有为编译器添加一种静态检查它们的方法,从而迫使编译器对变量类型插入运行时检查。

然后,JavaScript是一种动态类型化的语言:可以使用JavaScript编写程序,以便某个变量x可以是数字,函数,字符串或其他东西(并确定哪个变量需要解决Halting问题或某些变量)。困难的数学问题),因此您可以将其应用于x参数,并且浏览器必须在运行时检查x该函数。

两种说法都是正确的,具体取决于您是在谈论值还是变量。JavaScript变量是无类型的,JavaScript值具有类型,并且变量在运行时可以在任何值类型范围内(即“动态”)。

在JavaScript和许多其他语言中,值而不是变量带有类型。所有变量的范围可以是所有类型的值,并且可以被认为是“动态类型的”或“未类型的”-从类型检查的角度来看,无/未知类型的变量与可以采用任何类型的变量在逻辑上和实践上都是等效的。当类型理论家谈论语言和类型时,他们通常谈论的是-带类型的变量-因为他们有兴趣编写类型检查器和编译器等,它们对程序文本(即变量)进行操作,而不是在内存中运行的程序(即值)。

与之相反,在其他语言中(例如C),变量带有类型,而值没有。在Java之类的语言中,变量和值都带有类型。在C ++中,某些值(带有虚函数的值)带有类型,而另一些则没有。在某些语言中,值甚至有可能更改类型,尽管通常认为这是不好的设计。

的确,大多数写类型的CS研究人员实际上只将句法可派生的类型的语言视为类型化语言,但我们当中有更多人使用动态/潜在类型化语言对此表示怀疑。

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

无类型-仅由操作员确定值的解释-并且它通常可用于任何内容。示例:汇编程序,BCPL

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

动态类型-值具有与之关联的类型,并且该类型确定运行时运算符的解释/有效性。示例:LISP,Scheme,Smalltalk,Ruby,Python,Javascript

据我所知,所有动态类型化的语言都是类型安全的,即只有有效的运算符才能对值进行操作。但是对于静态类型的语言却并非如此。根据所用类型系统的功能,某些操作员可能仅在运行时检查,或者根本不检查。例如,大多数静态类型的语言不能正确处理整数溢出(添加2个正整数可以产生一个负整数),并且完全不检查(C,C ++)或仅在以下位置检查越界数组引用运行。此外,某些类型系统太弱了,以至于有用的编程要求使用转义填充(C和Family中的转换)来更改表达式的编译时类型。

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

这个问题全与语义有关

如果我给你这些数据:12它是什么类型?您无法确定。可以是整数-可以是浮点数-可以是字符串。从这个意义上讲,它是非常“无类型的”数据。

如果我给您一种虚构的语言,使您可以在此数据和某些其他任意数据上使用“加”,“减”和“连接”之类的运算符,则“类型”与我的虚构语言无关(例如:也许add(12, a)产量10912加的ASCII值a)。

让我们再谈C。C几乎可以让您对任意数据执行任何操作。如果您使用的函数需要两个uints,则可以强制转换并传递任何所需的值,并且这些值将被简单地解释为uints。从这个意义上讲,C是“无类型的”(如果您以这种方式对待它)。

但是-直达Brendan的要点-如果我告诉您“我的年龄是12-”,则12有一个类型-至少我们知道它是数字。对于上下文,所有内容都有一种类型-与语言无关。

这就是为什么我一开始说的原因-您的问题是语义学之一。untyped是什么意思?我认为布伦丹说“没有静态类型”时就打在了头上-因为这可能意味着全部。人类自然将事物分类。我们从直觉上知道,汽车和猴子之间在本质上是有所不同的-从来没有被教导要做出这些区分。

首先回到我的示例-一种“不关心类型”(每秒)的语言,可以让您“添加”一个“年龄”和一个“名称”而不会产生语法错误...但是并不意味着这是合乎逻辑的操作。

JavaScript可以让您做各种疯狂的事情,而无需考虑它们是“错误”。这并不意味着您在做什么在逻辑上是合理的。这就是开发人员要解决的问题。

在编译/构建/解释时不强制类型安全的系统/语言是否为“未键入”或“动态键入”?

语义学。

编辑

我想在这里添加一些内容,因为有些人似乎被“是的,但是Javascript确实有一些”类型”。

在对他人回答的评论中,我说:

在Javascript中,我可以将某些对象构建为“猴子”,而将某些对象构建为“人类”,并且可以将某些功能设计为仅对“人类”进行操作,而其他功能则只能对“猴子”进行操作,并且还有其他人只谈“有武器的事情”。是否曾经告诉过该语言,是否存在诸如“带手臂的东西”这样的对象类别与汇编语言(“动态类型”)一样与汇编(“无类型”)无关。这全是逻辑完整性的问题-唯一的错误是使用了没有这种方法的武器。

因此,如果您认为Javascript在内部具有某种“类型”概念,因此也具有“动态类型”,并且认为这在某种程度上“与未类型化系统不同”,您应该从上面的示例中看到,任何“内部具有的“类型”确实无关紧要。

为了使用C#执行相同的操作,例如,我需要一个称为ICreatureWithArms或类似名称的接口Javascript并非如此-C或ASM并非如此。

显然,Javascript是否对“类型”有任何了解都是无关紧要的。

我不是计算机科学家,但是如果CS社区中(至少在科学出版物中)“ untyped”真正被用作“ dynamic typed”的同义词,我会感到惊讶,因为这两个术语描述了不同的概念。动态类型语言具有类型概念,并且在运行时会强制执行类型约束(例如,您不能在Lisp中将整数除以字符串而不会出现错误),而无类型语言在此处则没有任何类型概念全部(例如汇编器)。甚至Wikipedia上有关编程语言的文章(http://en.m.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages)也有这种区别。

更新:可能造成混淆的原因是某些文本在Javascript中说了一些“未键入变量”的说法(这是对的)。但这并不意味着该语言是无类型的(这将是错误的)。

同意布伦丹-环境就是一切。

我的看法:

我记得在2004年左右感到困惑,因为有人争论Ruby是未类型化还是动态类型。老派的C / C ++人(我是其中的一员)在考虑编译器,并说Ruby没有类型。

请记住,在C语言中,没有运行时类型,只有地址,并且如果正在执行的代码决定将该地址中的内容视为不存在,那就糟糕了。这绝对是没有类型的,与动态类型有很大的不同。

在那个世界中,“类型化”完全与编译器有关。C ++具有“强类型”功能,因为编译器的检查更加严格。Java和C的类型更“弱”(甚至有人争论Java是强类型还是弱类型)。在这种情况下,动态语言是“无类型的”,因为它们没有编译器类型检查。

如今,对于熟练的程序员来说,我们已经习惯了动态语言,显然我们认为未类型化意味着没有编译器或解释器类型检查,这将难以调试。但是有一段时期并不明显,在更理论上的CS领域甚至可能没有意义。

从某种意义上说,什么都不能被取消类型化(或者几乎什么也不能被取消),因为您必须有某种意图来操纵值来编写有意义的算法。这是理论CS的世界,它没有涉及如何针对给定语言实现编译器或解释器的细节。因此,“未类型化”在这种情况下(可能我不知道)完全没有意义。

本文地址:http://javascript.askforanswer.com/zaixueshucsjieweidazishifouhuanyiweizhedongtaidazi.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!