Types 如果一种语言有“string”和“float”类型,但它也允许对任何数据类型进行操作,那么这种语言是类型化的还是非类型化的?

Types 如果一种语言有“string”和“float”类型,但它也允许对任何数据类型进行操作,那么这种语言是类型化的还是非类型化的?,types,Types,这个问题源于 有一种说法是,如果一种语言的类型为string或float等,那么它就是类型化的。但如果它也符合维基百科对非类型化的解释呢: 非类型化语言,如大多数 汇编语言,允许任何 对任何数据执行的操作, 通常被认为是 不同长度的比特序列。 非类型化的高级语言 包括BCPL和一些不同的 第四 那么,如果语言允许对任何数据进行操作,但只返回undefined或NaN,那么即使它有string和float等,我们能说它是非类型的吗 字符串、数组和对象不被认为是不同长度的位序列吗?不同长度的位序列实

这个问题源于

有一种说法是,如果一种语言的类型为string或float等,那么它就是类型化的。但如果它也符合维基百科对非类型化的解释呢:

非类型化语言,如大多数 汇编语言,允许任何 对任何数据执行的操作, 通常被认为是 不同长度的比特序列。 非类型化的高级语言 包括BCPL和一些不同的 第四

那么,如果语言允许对任何数据进行操作,但只返回undefined或NaN,那么即使它有string和float等,我们能说它是非类型的吗


字符串、数组和对象不被认为是不同长度的位序列吗?不同长度的位序列实际上是否意味着系统上某些预定义长度的位序列,如32位、64位等?

如果一种语言对某些类型的操作返回undefined或NaN,我可能很难说它是非类型化的。对我来说,这意味着指定的操作不适用于该数据类型,这显然意味着该语言不支持对该数据类型的操作

与此相反,大多数汇编语言都被认为是非类型化的,因为在这个层次上,语言真正处理所有你认为数据类型仅仅是数据的东西。汇编中完成的所有操作都不考虑它实际处理的数据类型。例如,MOV或MOVE只是将数据从一个位置移动到另一个位置,ADD是一种按位操作,因此即使在这里,您也只是将两个寄存器的二进制数据添加在一起。此时的所有内容都被视为按位算术,因此所有内容都被视为按位算术处理


因此,任何称自己为非类型化的语言都必须遵守此操作级别。通过返回undefined或NaN,语言实际上表明我没有这样做。

如果一种语言在某些类型上的操作返回undefined或NaN,我可能很难说它是非类型化的。对我来说,这意味着指定的操作不适用于该数据类型,这显然意味着该语言不支持对该数据类型的操作

与此相反,大多数汇编语言都被认为是非类型化的,因为在这个层次上,语言真正处理所有你认为数据类型仅仅是数据的东西。汇编中完成的所有操作都不考虑它实际处理的数据类型。例如,MOV或MOVE只是将数据从一个位置移动到另一个位置,ADD是一种按位操作,因此即使在这里,您也只是将两个寄存器的二进制数据添加在一起。此时的所有内容都被视为按位算术,因此所有内容都被视为按位算术处理


因此,任何称自己为非类型化的语言都必须遵守此操作级别。通过返回undefined或NaN,该语言实际上表明我没有这样做。

如果这些语言有诸如string和float之类的类型,那么它就是类型化的。它是静态类型还是动态类型是另一个问题。非类型化语言直接使用内存,而类型化语言在内存上有一个抽象层,即类型本身

那么,如果语言允许对任何数据进行操作,但只返回undefined或NaN,那么即使它有string和float等,我们能说它是非类型的吗


这听起来像是一种动态的、弱类型的语言,依赖duck类型对类型进行操作,而不是直接对内存进行操作。在没有类型的语言中,“南”是什么意思?如果您使用的语言的解释器/编译器能够确定在内存地址处找到的值不是数字,则该语言具有类型识别能力。非类型化语言根本不关心类型——它只是直接操纵内存。

如果这些语言有string和float之类的类型,那么它就是类型化的。它是静态类型还是动态类型是另一个问题。非类型化语言直接使用内存,而类型化语言在内存上有一个抽象层,即类型本身

那么,如果语言允许对任何数据进行操作,但只返回undefined或NaN,那么即使它有string和float等,我们能说它是非类型的吗


这听起来像是一种动态的、弱类型的语言,依赖duck类型对类型进行操作,而不是直接对内存进行操作。在没有类型的语言中,“南”是什么意思?如果您使用的语言的解释器/编译器能够确定在内存地址处找到的值不是数字,则该语言具有类型识别能力。非类型化语言根本不关心类型——它只是直接操纵内存。

有人会称之为松散类型语言。对于float和int,大多数编译器/语言都会将int向上转换为fl
因为实数包含整数,所以必须使用oat进行计算。

有些人会称之为松散类型。对于浮点数和整数,大多数编译器/语言都会将整数上浮为浮点数以进行计算,因为实数包含整数。

我会说它是弱类型的,因为每个值都有一个类型,但大多数或所有类型都可能有隐式转换。

我会说它是弱类型的,每个值都有一个类型,但大多数或所有类型都可能有隐式转换。

非类型化语言将任何给定的数据块视为操作赋予意义的位。例如,整数加法将这些位视为整数,而print将它们视为字符串。在这些语言中,确保操作有意义是程序员的责任。例如,在Forth中,虽然内存中通常有数据类型,但堆栈上的内容(也就是说,实际操作的内容)是堆栈项,而不是整数或字符或其他内容

因此,如果每个操作都只取位模式并与之一起运行,则该语言是非类型化的。例如,如果操作对添加32位整数和32位浮点的位执行不同的操作,或者如果不是所有操作都在所有数据上定义,那么它将被键入。如果它是类型化的,但很容易将数据视为不同的数据类型,那么我们会说它是弱类型的


你没有提供足够的上下文来了解。浮点操作可能会在任意位模式上返回NaN,而打印操作如果不能将其输入解析为有效的Unicode字符,则可能会返回undefined,因此在非类型化语言中可能会发生这种情况。如果在某些情况下,无论数据的位模式是什么,操作都将返回NaN或undefined,则会键入该语言。

未键入的语言将任何给定的数据块视为操作赋予意义的位。例如,整数加法将这些位视为整数,而print将它们视为字符串。在这些语言中,确保操作有意义是程序员的责任。例如,在Forth中,虽然内存中通常有数据类型,但堆栈上的内容(也就是说,实际操作的内容)是堆栈项,而不是整数或字符或其他内容

因此,如果每个操作都只取位模式并与之一起运行,则该语言是非类型化的。例如,如果操作对添加32位整数和32位浮点的位执行不同的操作,或者如果不是所有操作都在所有数据上定义,那么它将被键入。如果它是类型化的,但很容易将数据视为不同的数据类型,那么我们会说它是弱类型的


你没有提供足够的上下文来了解。浮点操作可能会在任意位模式上返回NaN,而打印操作如果不能将其输入解析为有效的Unicode字符,则可能会返回undefined,因此在非类型化语言中可能会发生这种情况。如果在某些情况下,无论数据的位模式如何,操作都将返回NaN或undefined,则输入语言。

考虑必须执行强制转换。如果它是一个接收类型化变量并返回同样是类型的二进制的操作,那么会怎么样?特别是在C中可以看到它,从C的void*指针到任何东西都有很长的路要走。此外,考虑多态性-是对被认为是非类型化的对象的操作吗? 总而言之,这是很有语义的。我怀疑有超过几种语言不允许强制转换为字节,因为它有时非常有用。然而,对任何数据使用任何操作在逻辑上都是错误的


此外,NaN是浮点标准的一部分,如果我没有弄错的话,它由一个大于INF的数字表示。

考虑必须进行铸造。如果它是一个接收类型化变量并返回同样是类型的二进制的操作,那么会怎么样?特别是在C中可以看到它,从C的void*指针到任何东西都有很长的路要走。此外,考虑多态性-是对被认为是非类型化的对象的操作吗? 总而言之,这是很有语义的。我怀疑有超过几种语言不允许强制转换为字节,因为它有时非常有用。然而,对任何数据使用任何操作在逻辑上都是错误的


此外,NaN是浮点标准的一部分,如果我没有弄错的话,它由一个比INF大的数字表示。

我认为区别在于wikipedia给出的是操作定义,而大多数人给出的是语义定义

通过这些术语,我的意思是操作定义完全依赖于系统作为黑盒的行为,但语义定义可以依赖于某些内部状态

例如,Javascript具有类型。你几乎总是可以 绕开它们,在操作上,它可能看起来是一种非类型化的语言,但在语义上,类型的概念是语言的一部分


我确信有比我刚才使用的更好的术语,但我想你明白了。

我认为区别在于维基百科给出的是操作性定义,而大多数人给出的是语义定义

通过这些术语,我的意思是操作定义完全依赖于系统作为黑盒的行为,但语义定义可以依赖于某些内部状态

例如,Javascript具有类型。你几乎总是可以绕过它们,所以在操作上,它可能看起来是一种非类型化的语言,但在语义上,类型的概念是语言的一部分


我确信有比我刚才使用的更好的术语,但我想你明白了。

你使用的类型定义与Wikipedia中的定义不同。每个操作的规范都定义了操作适用的数据类型,这意味着它不适用于其他类型。这只是一个评论,我个人还没有使用过我生活中输入的概念。@Daniel实际上我不认为Andrew的答案与wiki形成对比。当您处理非类型化语言时,您处理的数据永远不会被指定类型,因为没有类型。我想这就是他想要表达的意思。因此,任何类型化语言都必须有一个抽象层来定义数据类型。您使用的类型化定义与Wikipedia中的定义不同。每个操作的规范都定义了操作适用的数据类型,这意味着它不适用于其他类型。这只是一个评论,我个人还没有使用过我生活中输入的概念。@Daniel实际上我不认为Andrew的答案与wiki形成对比。当您处理非类型化语言时,您处理的数据永远不会被指定类型,因为没有类型。我想这就是他想要表达的意思。因此,任何类型化语言都必须有一个抽象层来定义数据类型。