类型和OO是否耦合?

时间:2010-10-13 07:42:59

标签: javascript ruby oop programming-languages clojure

试图理解类型是否暗示OO,反之亦然。

问题:

  • 究竟是什么类型的?

  • 可以将ruby中的类称为“类型”。

  • 在javascript中,本机函数/对象如Array,String,Function ......它们是否类型?

  • C结构是一种类型吗?

  • 即使语言不支持OO,如何输入语言?对于例如哈斯克尔。这样的langs中的类型是没有OOPL中的对象/类中的行为(方法)的“数据”类型吗?具有类型但没有支持OO的OO和lang的lang之间的类型有显着差异。

  • 如果类/对象是类型,那么OO是否意味着类型?

  • 你能否拥有一个没有在OO lang中看到的典型层次结构的类型系统?

  • 由于clojure支持类型提示,在某种意义上它可以被称为打字吗?它不是静态类型的。

  • “无类型”和“动态类型”这两个词是否意思相同?

7 个答案:

答案 0 :(得分:13)

静态类型是程序的一部分(通常是表达式)的属性,类型检查器将在不执行程序的情况下尝试证明或反驳,可能同时推断属性。 (实际上,这有点偏离,依赖类型和分阶段编译使事实比这更真实)。从广义上看,动态类型语言有一种静态类型 - 语法有效表达式的类型。

动态类型是运行时在程序执行期间自动检查的“对象”(不一定是OO对象)的属性。每种主流的静态类型语言都有一些动态类型......例如。 divide函数静态定义为取两个数字并返回一个数字但动态定义,使得第二个数字不能为零。存在静态类型语言,其中“非零数字”可以是静态证明类型。在许多静态类型语言(例如Java)中,非null是动态类型,而在Haskell中它是静态类型。等等。

这两者有些相关(它们都是防止未定义行为的两种方式)但也完全不同,以至于混淆“单词”这个词用来表示两者。

静态和动态类型系统都早于OO,并且都具有优秀的非OO语言来表示它们(例如,Scheme和SML)。实际上,它们早于我们所知的计算机编程。请参阅无类型且简单输入的lambda calculii,它可以追溯到1930年代和40年代。

有关差异的更深入讨论,请参阅:http://web.archive.org/web/20080822101209/http://www.pphsg.org/cdsmith/types.html

有关查看静态和动态类型的某些属性的一种方法,请参阅:http://james-iry.blogspot.com/2010/05/types-la-chart.html

动态输入和无类型意味着同样的事情吗?嗯...无类型来自无类型的lambda演算。与其他lambda calculii(如具有静态类型的简单类型lambda演算)相比,它被称为无类型。因此,在这种意义上,动态类型语言肯定是无类型的。但...

与“真正的”编程语言不同,无类型的lambda演算具有以下属性:任何语法上有效的表达式都可以“进步”而无需测试任何可能导致未定义行为的属性。没有相当于除以零,解除引用null或向无法处理它的对象发送消息。因此,可以证明无类型LC没有动态类型系统,即使它是无类型的。

答案 1 :(得分:10)

这是我看到它的方式。类型只是与某些数据结构相关联的标签。在OO语言中,这些数据结构恰好以方法的形式携带它们的行为。这些标签有助于了解可以对某些数据结构应用哪些操作(通过对对象的方法调用,或将这些数据结构作为参数传递给某些函数)。

编程语言具有类型系统的明确证据是,您有谓词可以询问某个值具有哪种“标签”。在OO语言中,这通常是instanceof运算符,但可能需要其他一些形式(is运算符,typeof运算符,is_a()函数或专用函数:{{ 1}},is_string)。在Haskell中,这是使用模式匹配实现的。

老实说,我没有看到过无类型的语言,即一种根本没有类型的语言。到目前为止我看到的语言是:

is_array

答案 2 :(得分:5)

我今天偶然发现了这一点,也许它有一些很好的输入:

What to know before debating type systems

答案 3 :(得分:3)

Type System上的维基百科页面有一个关于类型是什么的很好的引用:

  

一个易处理的句法框架,用于根据计算的值的类型对短语进行分类

所以C结构是一种类型,你不需要类型的对象。

基本上,类型是决定语言中的值如何以理智的方式组合在一起的一种方式。你可以看到其中一些看几种语言:

在C:

int x = 'a' + 13; // 110
char x = 'a' + 13); // 'n'

在Python中

>>> 'a' + 13
TypeError: cannot concatenate 'str' and 'int' objects

在不同情况下,这两种情况都是合理的。这带来了强类型与弱类型的区别。在像Python这样的强类型语言中,您无法将一种类型转换为另一种类型。 C是弱类型的,如果你有一个字符并想把它转换为FILE,它会让你,以下甚至不会在默认的gcc中发出警告:

FILE m = (*(FILE*) 'a')

这并不意味着C没有类型,只是在某些情况下可以从一种类型转换为不相关类型。跨语言有一个连续统一体。

Haskell是强类型的,如果一个函数接受某些类型的参数,并且你试图用不同的类型调用它,那么它就不会编译。 (根据你的问题,Haskell不是OO,但肯定有类型。)

factorial 0 = 1
factorial n = n * factorial (n - 1)

如果您尝试使用字符串调用factorial:factorial(“HI”)它将无效。请注意,您不必说n是一个数字。编译器弄明白了。这就是所谓的type inferrence。强类型并不意味着您需要明确说明类型。有些语言可以确保在没有C和Java注释的情况下不会发生类型错误。

注意Haskell如何在编译时抛出错误。这是另一个有用的区别:静态与动态类型。静态类型在编译时捕获错误。动态类型在运行时捕获它们。上面的python在运行时捕获了类型错误,因此Python是动态类型的(它也是强类型的)。像Haskell一样,Pascal是强类型和静态类型的

答案 4 :(得分:2)

  

究竟是什么类型?

类型是对潜在值空间和/或其解释的约束。特别是,应用于变量的类型意味着变量只能保存只能以某些特定方式解释的特定值。 (细节各不相同;关于如何阐述这一一般原则,有一些异常多样的意见。)

  

ruby​​中的一个类可以称为'类型'。

  

在javascript中,本机函数/对象如Array,String,Function ......它们是否类型?

  

C结构是一种类型吗?

  

即使语言不支持OO,如何输入语言?对于例如哈斯克尔。这样的langs中的类型是没有OOPL中的对象/类中的行为(方法)的“数据”类型吗?具有类型但没有支持OO的OO和lang的lang之间的类型有显着差异。

类型的定义与OO无关。

  

如果类/对象是类型,那么OO是否意味着类型?

形式上,OO的定义与类型无关;对象是状态信息和操作的封装。然而,这两个概念通常是有用的。

  

你有没有在OO langs中看到的典型层次结构的类型系统吗?

是。 C语言有一个类型系统,但根本没有对象系统。

  

由于clojure支持类型提示,在某种意义上它可以被称为打字吗?它不是静态类型的。

  

“无类型”和“动态类型”这两个词的含义是否相同?

没有。无类型(或等同于“如果你只有锤子”的原则)意味着所有操作都适用于所有值。动态类型意味着值知道它们自己的类型,因此知道可以对它们应用什么操作,并且在运行时检查类型约束。 (相比之下,在静态类型语言中,通常是变量保存类型信息,并且编译器会检查类型约束。)

答案 5 :(得分:2)

数据“类型”只是告诉您如何解释字节序列(作为整数,浮点数,数据结构等)。类型使得处理原始数据变得更容易。我无法想象有一种语言没有某种程度的类型。术语“无类型”通常表示“隐式键入”。您不必指定数据类型,但编译器/解释器会为您跟踪它。像TCL这样的语言似乎没有类型,因为所有数据都被认为是相同的类型(TCL中的所有数据都是字符串)。这并不意味着没有类型,只是程序员不必明确指定它们。

OO是一种高级编程概念,它与数据类型的概念并没有真正联系。传统上,OO与类似的东西相关联。这些只是开发人员指定自定义数据类型和定义对该数据类型进行操作的函数的简单方法。许多OO概念都建立在数据类型的使用和操作之上,因此您可以说它们是相关的。但是,“耦合”并不是一个准确的描述。毕竟,许多低级语言(例如C)有类型但不是OO。

答案 6 :(得分:1)

晚会,但是读了William Cook的这篇论文:

http://www.cs.utexas.edu/~wcook/Drafts/2009/essay.pdf

在我读这篇文章之前,OO和类型之间的舞蹈对我来说也是一个谜。