怎么可能有一个纯面向对象的语言呢?
How is it possible to have a purely object-oriented language?
Java 被认为是一种 OOP 语言,尽管它并不完全是纯粹的 OOP。 Java 包含 8 个基元,在 interview, 中 James Gosling 解释了原因:
Bill Venners: Why are there primitive types in Java? Why wasn't
everything just an object?
James Gosling: Totally an efficiency thing. There are all kinds of
people who have built systems where ints and that are all objects.
There are a variety of ways to do that, and all of them have some
pretty serious problems. Some of them are just slow, because they
allocate memory for everything. Some of them try to do objects where
sometimes they are objects, sometimes they are not (which is what the
standard LISP system did), and then things get really weird. It kind
of works, but it's strange.
所以看来内存和速度都是Java原语解决的问题。然而,这让我想知道 一门语言怎么可能是真正的、纯面向对象的?
如果只存在字节原语,您可以从那里构建。创建整数、字符并最终创建浮点数和双精度数。但是根本没有任何基础结构,你怎么能建造任何东西呢?至少需要一些基本原语吗?换句话说,扩展不需要基础数据结构吗?
如果您询问是否存在无法与原始类型交互的语言,那么您可能需要查看类似 Scala 的内容。来自该页面:
Scala is a pure object-oriented language in the sense that every value is an object.
但是,正如您指出的(对于 Kotlin):
the compiler maps them to JVM primitives when at all possible to save memory
如果您对什么是面向对象语言的定义要求一切都始终表示为一个对象,那么纯粹的面向对象语言是不可能的。你无法构建一种在只有对象的真实计算机上运行的语言。这是因为计算机必须有一种方法来本地表示数据。这本质上就是面向对象语言中的原语:底层计算机(或 VM)可以表示的本机数据形式。无论你做什么,你总是需要有一些数据的非对象表示,以便计算机对其进行操作。即使您构建了一个真正将原语表示为对象的 Java 脚本解释器,为了添加两个整数,解释器也必须将整数加载到 CPU 寄存器并使用某种形式的 add
指令。
但是这种解释有点忽略了面向对象编程的要点。编程语言与程序不同。语言只是我们让计算机做我们想做的事情的工具——它们在运行时实际上并不存在。你可能会说用 Kotlin 或 Scala 编写的程序比用 C 编写的程序更面向对象,尽管这两种语言在运行时编译为相同的汇编指令。
因此,如果您放宽对纯面向对象编程的定义,不再关心数据的运行时表示是什么,那么您会发现纯粹的对象面向语言是可能的。在对 Scala 进行编程时,您永远不会与任何非对象的事物进行交互。即使你的 Int
在运行时变成了 'primitive',也没关系,因为你,作为程序员,永远不需要考虑这个(至少,在一个理想的世界里,性能和内存无关紧要)。 Scala 的语言定义根本不包括基元的概念——它们是语言实现的一部分,而不是语言本身。
就您的 Java 示例而言,根据大多数定义,Java 可能不是纯粹的 面向对象语言。然而,它主要是面向对象的。 Java 经常被提及为事实上的面向对象语言,因为它比之前的语言更加面向对象。
更进一步,面向对象这个术语实际上并没有 definitive meaning。对某些人来说,这可能意味着一切都必须是一个对象,而对其他人来说,这可能只是意味着需要有对象,一些定义需要 类 的概念,有些则不需要,等等
Java 被认为是一种 OOP 语言,尽管它并不完全是纯粹的 OOP。 Java 包含 8 个基元,在 interview, 中 James Gosling 解释了原因:
Bill Venners: Why are there primitive types in Java? Why wasn't everything just an object?
James Gosling: Totally an efficiency thing. There are all kinds of people who have built systems where ints and that are all objects. There are a variety of ways to do that, and all of them have some pretty serious problems. Some of them are just slow, because they allocate memory for everything. Some of them try to do objects where sometimes they are objects, sometimes they are not (which is what the standard LISP system did), and then things get really weird. It kind of works, but it's strange.
所以看来内存和速度都是Java原语解决的问题。然而,这让我想知道 一门语言怎么可能是真正的、纯面向对象的?
如果只存在字节原语,您可以从那里构建。创建整数、字符并最终创建浮点数和双精度数。但是根本没有任何基础结构,你怎么能建造任何东西呢?至少需要一些基本原语吗?换句话说,扩展不需要基础数据结构吗?
如果您询问是否存在无法与原始类型交互的语言,那么您可能需要查看类似 Scala 的内容。来自该页面:
Scala is a pure object-oriented language in the sense that every value is an object.
但是,正如您指出的(对于 Kotlin):
the compiler maps them to JVM primitives when at all possible to save memory
如果您对什么是面向对象语言的定义要求一切都始终表示为一个对象,那么纯粹的面向对象语言是不可能的。你无法构建一种在只有对象的真实计算机上运行的语言。这是因为计算机必须有一种方法来本地表示数据。这本质上就是面向对象语言中的原语:底层计算机(或 VM)可以表示的本机数据形式。无论你做什么,你总是需要有一些数据的非对象表示,以便计算机对其进行操作。即使您构建了一个真正将原语表示为对象的 Java 脚本解释器,为了添加两个整数,解释器也必须将整数加载到 CPU 寄存器并使用某种形式的 add
指令。
但是这种解释有点忽略了面向对象编程的要点。编程语言与程序不同。语言只是我们让计算机做我们想做的事情的工具——它们在运行时实际上并不存在。你可能会说用 Kotlin 或 Scala 编写的程序比用 C 编写的程序更面向对象,尽管这两种语言在运行时编译为相同的汇编指令。
因此,如果您放宽对纯面向对象编程的定义,不再关心数据的运行时表示是什么,那么您会发现纯粹的对象面向语言是可能的。在对 Scala 进行编程时,您永远不会与任何非对象的事物进行交互。即使你的 Int
在运行时变成了 'primitive',也没关系,因为你,作为程序员,永远不需要考虑这个(至少,在一个理想的世界里,性能和内存无关紧要)。 Scala 的语言定义根本不包括基元的概念——它们是语言实现的一部分,而不是语言本身。
就您的 Java 示例而言,根据大多数定义,Java 可能不是纯粹的 面向对象语言。然而,它主要是面向对象的。 Java 经常被提及为事实上的面向对象语言,因为它比之前的语言更加面向对象。
更进一步,面向对象这个术语实际上并没有 definitive meaning。对某些人来说,这可能意味着一切都必须是一个对象,而对其他人来说,这可能只是意味着需要有对象,一些定义需要 类 的概念,有些则不需要,等等