如何有一种纯粹的面向对象的语言?

Eth*_*Bar 3 oop paradigms primitive types object

尽管Java并不是纯粹的OOP,但它被视为OOP语言。Java包含8个原语,James Gosling 在一次采访中解释了原因:

Bill Venners:Java为什么会有原始类型?为什么不是所有事物都只是一个对象?

James Gosling:完全是效率问题。有各种各样的人建立了以int为对象的系统。有多种方法可以做到这一点,并且所有方法都有一些非常严重的问题。其中一些速度很慢,因为它们为所有内容分配内存。他们中的一些人尝试在有时是对象的地方做对象,有时又不是(这是标准LISP系统所做的事情),然后事情变得很奇怪。有点用,但是很奇怪。

因此,似乎内存和速度都是Java原语解决的问题。但是,这使我想知道一种语言如何才能成为真正的,纯粹的面向对象的语言?

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

Spa*_*701 5

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

从每个值都是对象的意义上讲,Scala是一种纯面向对象的语言。

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

只要有可能,编译器就会将它们映射到JVM原语

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

但是这种解释错过了面向对象编程的重点。编程语言与程序不同。语言只是我们让计算机执行所需功能的工具-它们在运行时实际上并不存在。您可能会说,用Kotlin或Scala 编写的程序比用C编写的程序面向对象,尽管两种语言在运行时都编译为相同的汇编指令。

因此,如果您放松了对面向对象编程的定义,而不再关心数据的运行时表示形式,那么您会发现纯面向对象的语言是可能的。在对Scala进行编程时,您永远不会与非对象交互。即使您Int在运行时成为“原始”用户,也没关系,因为作为程序员,您永远不必真正考虑这一点(至少在性能和内存无关紧要的理想世界中)。Scala的语言定义根本不包含基元的概念-它们是语言实现的一部分,而不是语言本身。

就您的Java示例而言,就大多数定义而言,Java可能不是纯粹的面向对象语言。但是,它主要是面向对象的。Java通常被称为事实上的面向对象语言,因为它比以前的语言面向对象要多得多。

更进一步,术语“面向对象”实际上并没有明确的含义。对于某些人而言,这可能意味着一切都必须是一个对象,对于其他人而言,则可能意味着意味着必须有对象,某些定义需要类的概念,而某些则不需要。