Javascript 是不是;“非类型化”;也指;“动态类型”;在学术界?

Javascript 是不是;“非类型化”;也指;“动态类型”;在学术界?,javascript,types,computer-science,typing,Javascript,Types,Computer Science,Typing,我正在读一张幻灯片,上面写着“JavaScript是非类型化的”。这与我认为的事实相矛盾,所以我开始挖掘,试图了解更多 每个答案都说JavaScript不是非类型化的,并提供了各种形式的静态、动态、强类型和弱类型的示例,我对此很熟悉,也很满意。。所以这不是我们要走的路 所以我问了JavaScript的创建者Brendan Eich,他说: 学术类型使用“非类型化”表示“无静态类型”。他们足够聪明,可以看到值有类型(duh!)。背景很重要 专注于学术的计算机科学人士是否使用“非类型化”作为“动态类

我正在读一张幻灯片,上面写着“JavaScript是非类型化的”。这与我认为的事实相矛盾,所以我开始挖掘,试图了解更多

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

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

学术类型使用“非类型化”表示“无静态类型”。他们足够聪明,可以看到值有类型(duh!)。背景很重要

专注于学术的计算机科学人士是否使用“非类型化”作为“动态类型化”的同义词(这是有效的吗?),或者我是否遗漏了更深层次的东西?我同意Brendan的观点,即背景很重要,但引用任何解释都会很好,因为我目前的“入门”书籍并没有在这个主题上发挥作用

我想明确这一点,以便提高我的理解力,因为即使是维基百科也没有提到这种替代用法(反正我可以找到)。如果我错了,我不想在将来使用这个词或者质疑这个词的用法


(我还看到一位顶尖的Smalltalk专家说Smalltalk也是“非类型化”的,所以它不是一次性的,这正是促使我开始这项任务的原因!:-)

这个问题是关于

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

如果我给你一种想象中的语言,它允许你在这个数据和其他任意数据段上使用诸如“加法”、“减法”和“串联”之类的运算符,那么“类型”在某种程度上是不相关的(对于我的想象中的语言)(例如:也许
add(12,a)
产生
109
,即
12
加上
a
的ascii值)

让我们谈谈C。C几乎可以让你对任意的数据块做任何你想做的事情。如果您使用的函数需要两个
uint
s-您可以强制转换并传递任何您想要的-并且这些值将被简单地解释为
uint
s。从这个意义上说,C是“非类型化的”(如果你这样对待它)

然而,说到布伦丹的观点,如果我告诉你“我的年龄是
12
”,那么
12
有一个类型-至少我们知道它是数字与上下文一起任何事物都有一种类型-无论使用哪种语言

这就是为什么我一开始就说——你的问题是语义学。“非类型化”的含义是什么?我认为布伦丹说“没有静态类型”是一针见血的,因为这就是它可能意味着的一切。人类自然地将事物分类。我们凭直觉知道,汽车和猴子之间有着本质上的区别,而从来没有人教我们如何区分它们

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

Javascript可以让你做各种疯狂的事情,而不考虑它们的“错误”。这并不意味着你所做的合乎逻辑。这是开发人员要解决的问题

在编译/构建/解释时不强制执行类型安全的系统/语言是“非类型化”还是“动态类型化”

语义学

编辑

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

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

在Javascript中,我可以将对象构建为“猴子”,将对象构建为“人类”,一些函数可以设计为仅对“人类”进行操作,另一些函数仅对“猴子”进行操作,还有一些函数仅对“有手臂的东西”进行操作。无论该语言是否被告知存在“有手臂的东西”这样的对象类别,都与汇编(“非类型化”)无关,与Javascript(“动态”)无关。这完全是一个逻辑完整性的问题——唯一的错误就是使用了一些没有arms的方法

<强> >,如果您认为JavaScript在内部具有一些“类型的概念”,并且因此“动态类型”——并且认为这与“非类型化系统”有某种明显的不同——您应该从上面的示例中看到,它内部的任何“类型概念”都是不相关的。<强> < /P> 例如,要对C#执行相同的操作,我需要一个名为

ICreatureWithArms
或类似的接口。在Javascript中并非如此——在C或ASM中并非如此


显然,Javascript是否理解“类型”是无关紧要的

我不是计算机科学家,但如果“非类型化”真的在CS社区(至少在科学出版物中)被用作“动态类型化”的同义词,我会感到相当惊讶,因为这两个术语描述了不同的概念。动态类型化语言有一个类型的概念,它在运行时强制执行类型约束(例如,在Lisp中不能将整数除以字符串而不出错),而非类型化语言根本没有任何类型的概念(例如,汇编程序)。甚至维基百科上关于编程语言的文章(http://en.m.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages)这就是区别


更新:可能是因为一些文本在Javascript中说了“变量没有被类型化”(这是真的)。但这并不意味着该语言是非类型化的(这将是错误的)。

非类型化和动态类型化绝对不是同义词。语言