javascript - 类型和 OO 耦合了吗?

标签 javascript ruby oop programming-languages clojure

尝试了解类型是否暗示面向对象,反之亦然。

问题:

  • 究竟什么是类型?

  • ruby 中的类可以称为“类型”吗?

  • 在 javascript 中,原生函数/对象,如 Array、String、Function ... 它们是类型吗?

  • C 结构是类型吗?

  • 即使一种语言不支持 OO,它又如何能被打字?例如 haskell 。这种语言中的类型是否是 OOPL 中的对象/类中没有行为(方法)的“数据”类型?有类型但没有 OO 的语言和支持 OO 的语言在类型上有什么显着差异。

  • 如果类/对象是类型,OO 不就意味着类型吗?

  • 你能拥有一个没有 OO 语言中典型层次结构的类型系统吗?

  • 既然clojure 支持类型提示,那么在某种意义上它可以被称为类型化吗?它不是静态类型的。

  • “非类型化”和“动态类型化”这两个词的意思相同吗?

最佳答案

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

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

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

静态和动态类型系统都早于 OO,并且都有出色的非 OO 语言来表示它们(例如 Scheme 和 SML)。事实上,它们早于我们所知道的计算机编程。查看可追溯到 1930 年代和 40 年代的非类型化和简单类型化 lambda 演算。

有关差异的更深入讨论,请参阅: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 演算(如具有静态类型的简单类型 lambda 演算)相比,它被称为无类型。因此,从这个意义上讲,动态类型语言当然是无类型的。但是……

与“真正的”编程语言不同,无类型的 lambda 演算具有这样的特性,即任何语法上有效的表达式都可以“取得进展”,而无需测试任何可能导致未定义行为的特性。除以零、取消引用 null 或将消息发送到无法处理它的对象是没有等价物的。因此,即使无类型的 LC 是无类型的,也可以提出这样的论点,即无类型的 LC 没有动态类型系统。

关于javascript - 类型和 OO 耦合了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3921650/

相关文章:

javascript underscorejs 分组和求和数据

ruby - 为什么我的埃拉托色尼筛法算法失败了?

ruby-on-rails - RubyMine - 关闭在 "empty"行中间单击的能力

C# 控制台应用程序 session /存储

javascript - 使用 jest 更新组件状态

javascript - 断言 "expect" Jest 调用了 X 次

java - 我无法正确打印我的卡片对象

c++ - 返回的返回类型是对象的引用?

javascript - 如何在没有浏览器的 node.js 中使用 FormData?

ruby - JSON::ParserError:JSON 文本必须至少包含两个八位字节! (对于非零输入)