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

标签 oop object types primitive paradigms

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原语解决的问题。然而,这让我想知道一种语言怎么可能是真正的、纯面向对象的?

如果只存在字节基元,您可以从那里构建。创建整数、字符并最终创建 float 和 double 。但是根本没有任何基础结构,你怎么能 build 任何东西呢?至少需要一些基本原语吗?换句话说,扩展不需要基础数据结构吗?

最佳答案

如果您询问是否有无法与原始类型交互的语言,那么您可能想要查看类似 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)可以表示的 native 数据形式。无论你做什么,你总是需要有一些数据的非对象表示,以便计算机对其进行操作。即使您构建了一个真正将基元表示为对象的 JavaScript 解释器,为了将两个整数相加,解释器也必须将整数加载到 CPU 寄存器中并使用某种形式的 add 指令。

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

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

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

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

关于oop - 怎么可能有一个纯面向对象的语言呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46822956/

相关文章:

c++ - Qt 类中的槽和信号是什么意思?

java - JAVA 中的 GUI 客户端 - 服务器

Java确保相同的通配符捕获类型

oop - this.field 构造函数参数列表和继承字段的语法糖。

python - 如何正确地向 Mixin 类添加类型提示?

javascript - 测试对象是否包含给定值

Javascript - [为什么?] 将变量分配给对象

c# - 使用通用参数获取/计算 .NET 类型的外部 MSDN url

SQL 基本类型 : integer vs int?

php 全局在类内但在函数外?