【问题标题】:How is it possible to have a purely object-oriented language?怎么可能有一个纯粹的面向对象的语言呢?
【发布时间】:2018-03-31 01:58:03
【问题描述】:

Java 被认为是一种 OOP 语言,尽管它不是纯粹的 OOP。 Java 包含 8 个原语,在 interview,James Gosling 中解释了原因:

Bill Venners:为什么 Java 中有原始类型?为什么没有 一切都只是一个对象?

James Gosling:完全是效率问题。有各种各样的 建立了 int 和 that 都是对象的系统的人。 有多种方法可以做到这一点,而且它们都有一些 相当严重的问题。其中一些只是缓慢,因为它们 为所有内容分配内存。他们中的一些人尝试在哪里做对象 有时它们是对象,有时它们不是(这就是 标准 LISP 系统做到了),然后事情变得非常奇怪。很亲切 作品,但很奇怪。

因此,内存和速度似乎都是 Java 原语解决的问题。然而,这让我想一种语言怎么可能是真正的、纯粹的面向对象的?

如果只存在一个字节原语,您可以从那里构建。创建整数、字符以及最终的浮点数和双精度数。但是根本没有任何基础结构,你怎么能建造任何东西呢?至少一些基本原语不是必需的吗?换句话说,扩展时不需要基础数据结构吗?

【问题讨论】:

  • 如果我没记错的话,Kotlin 中的一切都是对象。有 var 和 val 关键字和类型推断。
  • @ND523 在 Kotlin 中一切都显示为对象,但编译器尽可能将它们映射到 JVM 原语以节省内存source
  • JavaScript 是另一个例子,其中所有原语都是真正的对象。例如。 let a = 4; tyeof a;(“数字”)a.toFixed(2)(“4.00”)。 toFixed 是 Number 类型/类的实例方法。甚至文字也被“包装”到它们的类型类中:(42).toFixed(2) ("42.00") 或 "test string".toUpperCase() ("TEST STRING")
  • 我看起来仍然像 Javascript has primitives,但可以在几分之一秒内变成 coerced into an object,以允许使用属性和方法。它们仍然是基元,对象在使用时立即被丢弃。
  • @EthanBar 我知道你在找什么。您可能想在问题中澄清这一点。

标签: oop object types primitive paradigms


【解决方案1】:

如果您询问是否存在无法与原始类型交互的语言,那么您可能想查看Scala 之类的内容。从该页面:

Scala 是一种纯面向对象的语言,因为每个值都是一个对象。

但是,正如您所指出的(对于 Kotlin):

编译器尽可能将它们映射到 JVM 原语以节省内存

如果您对面向对象语言的定义要求一切都始终表示为对象,那么纯粹的面向对象语言是不可能的。您无法构建一种在只有对象的真实计算机上运行的语言。这是因为计算机必须有一种方法来本地表示数据。这本质上就是面向对象语言中的原语:底层计算机(或 VM)可以表示的本机形式的数据。无论你做什么,你总是需要有一些非对象的数据表示,以便计算机对其进行操作。即使您构建了一个真正将基元表示为对象的 JavaScript 解释器,为了将两个整数相加,解释器也必须将整数加载到 CPU 寄存器中并使用某种形式的 add 指令。

但是这种解释有点忽略了面向对象编程的重点。编程语言与程序不同。语言只是我们让计算机做我们想做的事情的工具——它们在运行时实际上并不存在。您可能会说,用 Kotlin 或 Scala 编写的程序比用 C 编写的程序更多面向对象,尽管这两种语言在运行时都编译为相同的汇编指令。

因此,如果您放宽对面向对象编程的定义,不再关心数据的运行时表示是什么,那么您会发现纯面向对象的语言是可能的.在编写 Scala 时,您永远不会与任何不是对象的东西进行交互。即使您的Int 在运行时成为“原始”,这并不重要,因为作为程序员,您永远不必真正考虑这一点(至少,在性能和内存无关紧要的理想世界中) . Scala 的语言定义根本不包括原语的概念——它们是语言实现的一部分,而不是语言本身。

就您的 Java 示例而言,根据大多数定义,Java 可能不是一种纯粹面向对象的语言。然而,它主要是面向对象的。 Java 经常被称为事实上的面向对象语言,因为它比之前的语言更加面向对象。

更进一步,术语“面向对象”实际上并没有definitive meaning。对某些人来说,这可能意味着一切都必须是一个对象,而对另一些人来说,这可能只是意味着需要有对象,有些定义需要类的概念,有些则不需要,等等。

【讨论】:

  • 感谢您的详细解释。我喜欢你的观点,一种语言是由它对作者的表现来定义的,而不是由它抽象出来的东西来定义的。
猜你喜欢
  • 2014-02-26
  • 2014-06-26
  • 2015-04-24
  • 2014-01-04
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
相关资源
最近更新 更多