在学术CS世界中,“无types”是否也意味着“dynamictypes”?

我正在阅读一个说明“JavaScript是无types”的幻灯片。 这与我认为是真实的矛盾,所以我开始挖掘尝试和了解更多。

每个答案JavaScript是一种无types的语言? 说,JavaScript 不是无types的,并提供了各种forms的静态,dynamic,强,弱types的例子,我熟悉和满意..所以这是不是要走的路。

于是我问了JavaScript的创build者Brendan Eich,他说:

学术types使用“无types”来表示“没有静态types”。 他们很聪明,看到价值有types(杜!)。 情境很重要。

是否以学术为中心的计算机科学家使用“无types”作为“dynamictypes”的同义词(这是有效的?)还是有什么更深的东西,我失踪? 我同意布伦丹的看法,环境是重要的,但任何解释的引用都会很好,因为我现在的“去”书不是在这个话题上发挥作用。

我想指出这一点,所以我可以提高我的理解,因为甚至维基百科都没有提到这种替代用法(我可以find,无论如何)。 如果我错了,我不想在这个术语中使用这个术语,或者在质疑这个术语的使用.-)

(我也看到一个顶级Smalltalker说Smalltalk也是“无types的”,所以它不是一个一次性的,这是什么让我在这个任务!:-))

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

“dynamic打字”这个术语后来才被发明出来,而面对“types”一词的常见math用法,这是一个矛盾。

例如,本杰明·皮尔斯(Benjamin Pierce)在他的标准教科书“ types和编程语言 ”中使用的“types系统”的定义如下:

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

他还表示:

“静态”这个词有时会被明确地join – 例如我们提到一种“静态types的编程语言”,以便将我们正在考虑的编译时分析的种类与dynamic语言或潜在的types进行区分,如Scheme(Sussman和Steele,1975; Kelsey,Clinger和Rees,1998; Dybvig,1996),其中运行时types标签用于区分堆中不同types的结构。 像“dynamictypes”这样的术语可能是错误的,可能应该被“dynamic检查”替代,但是这种用法是标准的。

大部分在这个领域工作的人似乎都在分享这个观点。

请注意,这并不意味着“无types”和“dynamictypes”是同义词。 相反,后者对于前者的特定情况是(技术上误导的)名称。

PS:和FWIW,我碰巧是一个系统学术研究者,也是一个非学术性的JavaScript实现者,所以我必须和schisma一起生活。 🙂

我是一位专业编程语言的学术计算机科学家,是的,“无types”这个词经常被误用。 保留用于不带dynamictypes标签(例如Forth和汇编代码)的语言的单词是很好的,但是这些语言很less被使用甚至更less被研究,并且更容易说“无types”比“dynamicinput”。

鲍勃·哈珀喜欢说像Scheme,Javascript等等语言应该被认为是只有一种types的types语言:价值。 我倾向于这种观点,因为它可以用一种types的forms主义来构build一致的世界观。

PS在纯lambda微积分中,唯一的“值”是正规forms的项,而正常forms中唯一的闭合项是函数。 但大多数使用lambda微积分的科学家添加基本types和常量,然后为lambda包含一个静态types系统,或者您正好回到dynamictypes标记。

PPS原始的海报:当涉及到编程语言,特别是types系统,维基百科的信息质量差。 不要相信它。

我仔细研究过,发现对于你的问题的答案是简单的,令人惊讶的是,“是的”:学术CStypes,或者至less其中一些,确实使用“无types”来表示“dynamictypes”。 例如, 编程语言:原则和实践 ,第三版(Kenneth C. Louden和Kenneth A. Lambert,2012年出版)说:

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

[注意:原文中的粗体]然后继续使用“untyped”。

我觉得这很令人惊讶(与Afrischke和Adam Mihalcin给出的原因大致相同),但是在那里。 🙂


编辑添加:您可以通过将"untyped languages"插入Google图书search中find更多示例。 例如:

[…]这是主要的信息隐藏机制是许多无types的语言。 例如PLTscheme[4]使用生成struct

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

[…],我们提出了一个无types的function语言的绑定时间分析[…]。 该scheme已经实施并被部分评估者用于计划的副作用自由方言。 但是,分析是足够普遍的,对于非严格types的函数式语言如Haskell来说是有效的。 […]

– Charles Consel,1990 [ 链接 ]

顺便说一下,我的印象在查看这些search结果之后,如果研究人员写了一个“无types”的function语言,他很可能认为它是“无types的”,就像无types的lambda Adam Mihalcin提到的微积分。 至less,有几位研究人员同时提到了Scheme和lambda演算。

当然,search没有说的是,是否有研究人员拒绝这种识别, 而不认为这些语言是“无types的”。 那么,我确实find了这个:

然后我意识到,真的没有循环,因为dynamictypes的语言不是无types的语言 – 只是这些types通常不会立即从程序文本中显而易见。

– 有人(我不知道是谁),1998 [ 链接 ]

但显然大多数拒绝这种认同的人不会觉得有必要明确地说出来。

无types和dynamictypes是绝对不是同义词。 最常被称为“无types”的语言是Lambda微积分,它实际上是一种统一的语言 – 所有东西都是一个函数,所以我们可以静态地certificate所有东西的types都是函数。 dynamictypes化的语言有多种types,但是并没有给编译器增加一种静态检查的方法,迫使编译器在variablestypes中插入运行时检查。

然后,JavaScript是一种dynamictypes的语言:可以用JavaScript编写程序,使得一些variablesx可以是一个数字,一个函数,一个string或其他东西(并确定哪一个需要解决停顿问题或一些困难的math问题),所以你可以将x应用于一个参数,浏览器必须在运行时检查x是一个函数。

两个陈述都是正确的,取决于你是在谈论价值观还是变数。 JavaScriptvariables是无types的,JavaScript值有types,而且variables可以在运行时在任何值types上(即“dynamic”)。

在JavaScript和许多其他语言中,值而不是variables带有types。 所有variables都可以涵盖所有types的值,可以被视为“dynamictypes”或“无types” – 从types检查的angular度来看,检查一个没有/不可知types的variables和一个可以采取任何types的variables在逻辑上和实际上是等价的。 当types理论家谈论语言和types时,他们通常会谈论这个 – 携带types的variables – 因为他们对编写types检查器和编译器等感兴趣,它们在程序文本(即variables)上运行,而不是在内存中运行的程序(即值)。

相比之下,在其他语言,如C,variables携带的types,但价值观没有。 在像Java这样的语言中,variables和值都带有types。 在C ++中,一些值(具有虚函数的那些)携带types,而其他值不包含。 在某些语言中,甚至可以改变types的值,虽然这通常被认为是不好的devise。

这个问题全是关于语义的

如果我给你这个数据: 12它是什么types的? 你无法确定。 可能是一个整数 – 可能是一个浮点数 – 可能是一个string。 从这个意义上说,这是非常“无types”的数据。

如果我给你一个假想的语言,让你使用像这个数据和其他一些任意数据的“添加”,“减去”和“连接”等操作符,那么“types”与我的想象语言无关(例如:也许add(12, a)得到109 ,即12加上a )的ascii值。

我们来谈谈C一下。 C几乎可以让你做任何你想要的任何一块数据。 如果你使用的是一个需要两个uint的函数 – 你可以投射和传递任何你想要的东西 – 这些值将被简单地解释为uint s。 从这个意义上说,C是“无types的”(如果你以这种方式对待它)。

不过,如果我告诉你“我的年龄是12岁” – 那么12就是一种types – 至less我们知道这是数字。 随着上下文一切都有一个types – 不pipe语言。

这就是为什么我在开始时说 – 你的问题是语义之一。 “无types”是什么意思? 我认为布伦丹当他说“没有静态types”的时候,就碰到了头,因为这可能意味着这一切。 人类自然会把事物分类。 我们直觉地知道,汽车和猴子之间有一些根本性的不同 – 从来没有被教导去做这些区别。

回到我的例子开始 – “不关心types”(本身)的语言可以让你“添加”一个“年龄”和“名称”,而不会产生语法错误…但并不意味着这是一个逻辑上合理的操作。

JavaScript可能会让你做各种疯狂的事情,而不考虑他们的“错误”。 这并不意味着你在做什么是逻辑上合理的。 那是为了开发人员的工作。

是一种在编译/构build/解释时间“非types化”或“dynamictypes化”时不强制执行types安全的系统/语言?

语义。

编辑

我想在这里添加一些东西,因为有些人似乎被抓住了“是的,但Javascript确实有一些”types“”。

我在评论别人的回答时说:

在Javascript中,我可以将我构build的对象设置为“猴子”,将对象构build为“人类”,某些function可以devise为仅对“人”进行操作,其他function则只对“猴”还有一些只是“有武器的事情”。 无论这个语言是否曾经被告知过,“带有武器的东西”这样的对象类与集合(“无types”)和Javascript(“dynamic”)是无关的。 这完全是一个逻辑完整性的问题 – 唯一的错误就是使用那种没有武器的东西。

所以,如果你认为Javascript在内部有一些“types的概念” – 因此也就是“dynamictypes”,并且认为这与某种“无types的系统”有明显的区别 – 你应该从上面的例子中看到,任何“types“它在内部是真的无关紧要。

例如,为了执行与C#相同的操作,我需要一个名为ICreatureWithArms或类似的接口。 在Javascript中不是这样 – 在C或ASM中不是这样。

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

我不是一个计算机科学家,但是如果“非types化”在CS社区(至less在科学出版物中)被真正用作“dynamictypes”的同义词,我将会感到惊讶,因为这两个术语描述不同的概念。 一个dynamictypes的语言有一个types的概念,它在运行时强制types约束(例如,你不能在Lisp中用一个string来分隔一个整数而不会得到一个错误),而一个无types的语言在types上没有任何types的概念所有(例如汇编)。 即使是维基百科有关编程语言的文章(http://en.m.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages)也有此区别。;

更新:也许混淆来自于这样的事实,即一些文本在Javascript中使用“未inputvariables”(这是事实)。 但是,这并不意味着语言是无types的(这将是错误的)。

同意布伦丹 – 上下文就是一切。

我的拿:

我记得在2004年左右,我感到困惑,因为有人争论说Ruby是否是无types的或dynamictypes的。 旧学校的C / C ++人(我是其中之一)正在考虑编译器,并说Ruby是无types的。

请记住,在C中,没有运行时types,只有地址,如果正在执行的代码决定将该地址处的任何东西视为不是它的东西,那么哎呀。 这绝对是无types的,与dynamictypes非常不同。

在那个世界里,“打字”就是编译器。 C ++有“强打字”,因为编译器的检查更严格。 Java和C更“弱types”(甚至有关于Java是强types还是弱types的争论)。 dynamic语言在这个连续体中是“无types的”,因为它们没有编译器types检查。

今天,对于练习程序员来说,我们习惯了dynamic语言,显然我们认为无types意味着没有编译器,也没有解释器types检查,这将是非常难以debugging的。 但是在那里有一个不明显的时期,在更理论化的CS世界可能没有什么意义。

从某种意义上讲,没有任何东西可以是无types的(或者说几乎没有东西),因为你必须有一些意图来操作一个值来编写一个有意义的algorithm。 这是理论CS的世界,它不处理编译器或解释器如何实现给定语言的具体细节。 所以在这种情况下,“无types”是(可能,我不知道)完全没有意义。

虽然大多数撰写关于types的CS研究人员基本上认为只有带有语法衍生types的语言才是types化的语言,但是我们还有更多的人使用dynamic/潜在types的语言,这些语言在这种用法上有些混乱。

我认为有三种语言types[SIC]:

非types化 – 只有操作员决定了价值的解释 – 它通常对任何事情都有效。 例子:汇编程序,BCPL

静态types – expression式/variables具有与它们相关联的types,并且该types在编译时确定操作符的解释/有效性。 例子:C,Java,C ++,ML,Haskell

dynamictypes – 值具有与它们相关联的types,并且该types决定运行时运算符的解释/有效性。 例子:LISP,Scheme,Smalltalk,Ruby,Python,Javascript

据我所知,所有dynamictypes的语言都是types安全的 – 即只有有效的操作符才能操作值。 但静态types语言也是如此。 根据所使用的types系统的function,有些操作符只能在运行时检查,或者根本不检查。 例如,大多数静态types的语言不能正确地处理整数溢出(增加2个正整数可以产生一个负整数),并且超出边界的数组引用或者根本不检查(C,C ++),或者仅在运行。 此外,某些types的系统是如此薄弱,有用的编程需要逃逸舱口(C语言和家庭中的强制转换)来改变编译时types的expression式。

所有这些都会导致荒谬的说法,比如说C ++比Python更安全,因为它是(静态types的),而事实是Python本质上是安全的,而你可以用C ++来开始。