怎么可能有一个纯粹的面向对象的语言?

怎么可能有一个纯粹的面向对象的语言?

问题描述:

Java被认为是一种OOP语言,尽管它不完全是OOP。 Java包含8个原语,并在interview, James Gosling解释了原因:怎么可能有一个纯粹的面向对象的语言?

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

詹姆斯戈斯林:完全是一个效率的东西。有各种各样的人建立了系统,其中整数和所有对象。 有很多方法可以做到这一点,他们都有一些相当严重的问题。其中一些只是很慢,因为它们为所有东西分配内存。他们中的一些人试图做对象,有时他们不是(这是标准的LISP系统所做的),然后事情变得非常奇怪。它的种类 的作品,但它很奇怪。

所以看起来内存和速度都是Java基元解决的问题。然而,这让我想知道一个语言如何才能真实,纯粹的面向对象?

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

+0

如果我是没有错,一切都是Kotlin中的一个对象。这里有var和val关键字和类型推断。 – ND523

+0

@ ND523在Kotlin中,一切都显示为对象,但编译器会尽可能地将它们映射到JVM基元,以尽可能节省内存[source](https://discuss.kotlinlang.org/t/primitive-types-in-the-the- type-hierarchy/1519) – EthanBar

+0

JavaScript是另一个所有基元都是对象的例子。例如。 'let a = 4; (“数字”)'a.toFixed(2)'(“4.00”)。 toFixed是Number类型/类的实例方法。 (42).toFixed(2)'(“42.00”)或'“test string”.toUpperCase()'(“TEST STRING”) – marekful

如果您问是否有语言无法与原始类型进行交互,那么您可能需要查看诸如Scala之类的东西。从该页开始:

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

然而,正如你指出的(对于科特林):

编译器将它们映射到JVM时元在所有可能的

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

但是这种解释有点错过了面向对象编程的观点。编程语言与程序不同。语言只是我们使计算机做我们想要的工具 - 它们实际上并不存在于运行时。你可能会说用Kotlin或Scala编写的程序是更多比用C编写的程序更面向对象,尽管两种语言都在运行时编译成相同的汇编指令。因此,如果你放松你的定义pure面向对象编程不再关心数据的运行时表示,那么你会发现纯粹的面向对象的语言是可能的。在编程Scala时,你绝不会与任何不是对象的任何东西交互。即使你在运行时变成了一个'原始',它并不重要,因为作为程序员,你从来没有真的需要考虑这个问题(至少在性能和内存从不重要的理想世界中)。 Scala的语言定义根本不包括原语的概念 - 它们是语言实现的一部分,而不是语言本身。到目前为止你的Java的例子中,Java可能并不是纯粹的大多数定义中的面向对象的语言。但是,它大部分是面向对象的。 Java通常被称为事实上的面向对象的语言,因为它比面向对象的面向对象更加面向对象。

更进一步,术语面向对象并没有真正的definitive meaning。对某些人来说,这可能意味着一切都必须成为一个对象,而对于其他人来说,这可能意味着需要有对象,一些定义需要类的概念,有些不需要等。

+0

感谢您的详细解释。我喜欢你的观点,即一种语言是由它看起来是作家而不是它被抽象出来的。 – EthanBar